AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1500504
Accepted
nvanhaute
nvanhaute
Asked: 2019-11-10 01:15:39 +0800 CST2019-11-10 01:15:39 +0800 CST 2019-11-10 01:15:39 +0800 CST

arquivos para um arquivo json

  • 772

Estou um pouco perdido para criar um json a partir de poucos arquivos. Tenho vários arquivos como: CLT.txt, LYO.txt.... Dentro de nós tenho data + valor: dd/mm/aaaa hh:mm xxxxx

Eu adiciono uma nova linha em cada arquivo a cada 5 minutos

exemplos: CLT.txt

01/01/2020 00:00 45
01/01/2020 00:05 457
01/01/2020 00:10 458
01/01/2020 00:15 402
01/01/2020 00:20 585
...
02/01/2020 00:00 57
02/01/2020 00:05 86
02/01/2020 00:10 45
02/01/2020 00:15 402
02/01/2020 00:20 104
...

LYO.txt

01/01/2020 00:00 70
01/01/2020 00:05 221
01/01/2020 00:10 315
01/01/2020 00:15 57
01/01/2020 00:20 420
...
02/01/2020 00:00 50
02/01/2020 00:05 92
02/01/2020 00:10 32
02/01/2020 00:15 125
02/01/2020 00:20 10
...

Eu tenho cerca de 15 arquivos como esse.

Então, no final, gostaria de obter apenas um arquivo json criado a cada 5 minutos com este formato:

{
  "CLT": {
    "01/01/2020": {
      "00:00": 45,
      "00:05": 457,
      "00:10": 458,
      "00:15": 402,
      "00:20": 585
...
    },
    "02/01/2020": {
      "00:00": 57,
      "00:05": 86,
      "00:10": 45,
      "00:15": 402,
      "00:20": 104
...
    }
  },
  "LYO": {
    "01/01/2020": {
      "00:00": 70,
      "00:05": 221,
      "00:10": 315,
      "00:15": 57,
      "00:20": 420
...
    },
    "02/01/2020": {
      "00:00": 50,
      "00:05": 92,
      "00:10": 32,
      "00:15": 125,
      "00:20": 10
...
    }
  }
}

se você tiver uma ideia simples, estou interessado. Todos os processos são feitos na máquina Ubuntu LTS 19.

Obrigado

bash-scripting json
  • 2 2 respostas
  • 69 Views

2 respostas

  • Voted
  1. linux-fan
    2019-11-10T09:17:13+08:002019-11-10T09:17:13+08:00

    awké uma boa ferramenta para este propósito. Eu não sou um especialista nisso, mas aqui está o que eu criei:

    #!/bin/sh -e
    
    while true; do
        echo "{" > new.json
        # put other file names here
        for tla in CLT LYO; do
            [ "$tla" = CLT ] || printf ",\n" >> new.json
            printf "\t\"%s\": {" "$tla" >> new.json
            awk '
    BEGIN {
        date="other"
    }
    {
        curd=$1
        if(curd != date) {
            if(date != "other") {
                printf "\n\t\t},"
            }
            printf "\n\t\t\"%s\": {\n", curd
            date = curd
        } else {
            printf ",\n"
        }
        printf "\t\t\t\"%s\": \"%s\"", $2, $3
    }
    ' "$tla.txt" >> new.json
            printf "\n\t\t}\n\t}" >> new.json
        done
        printf "\n}\n" >> new.json
        mv -f new.json output.json
        # repeat approximately every 5 minutes
        sleep 600
    done
    

    Claro, um loop com sleep 600só faz sentido se você chamar esse script interativamente. Caso contrário, apenas remova o loop externo, durma e chame o script do cron (se possível, essa variante é altamente recomendada). Se quiser, você também pode remover a parte "redirecionamento" do script e chamar o script redirecionando toda a sua saída (depende muito do contexto em que você está usando isso).

    • 1
  2. Best Answer
    user1686
    2019-11-11T02:31:17+08:002019-11-11T02:31:17+08:00

    Não use "bash-scripting" para isso. Escolha um idioma que tenha suporte nativo para estruturas aninhadas. Uma vez disponível, torna-se fácil carregar cada arquivo em um dict com o formato exato do que você deseja e, em seguida, despejar tudo de uma vez como JSON.

    Por exemplo:

    #!/usr/bin/env python3
    import glob
    import json
    
    data = {}
    for txtfile in glob.glob("???.txt"):
        code = txtfile.split("/")[-1].split(".")[0]
        data[code] = {}
        with open(txtfile, "r") as fh:
            for line in fh:
                date, time, count = line.strip().split()
                data[code].setdefault(date, {})
                data[code][date][time] = int(count)
    
    print(json.dumps(data))
    

    Alternativamente:

    #!/usr/bin/env ruby
    require 'json'
    
    data = {}
    Dir["???.txt"].each do |txtfile|
        code = File.basename(txtfile, ".txt")
        data[code] = {}
        File.open(txtfile, "r").each do |line|
            date, time, count = line.strip.split
            data[code][date] ||= {}
            data[code][date][time] = count.to_i
        end
    end
    
    puts JSON.generate(data)
    

    Alternativamente:

    #!/usr/bin/env perl
    use File::Basename;
    use JSON;
    
    my $data = {};
    for my $txtfile (glob("???.txt")) {
        my ($code) = basename($txtfile, ".txt");
        if (open(my $fh, "<", $txtfile)) {
            while (my $line = <$fh>) {
                my ($date, $time, $count) = ($line =~ /^(\S+) (\S+) (\S+)/);
                $data->{$code}->{$date}->{$time} = int $count;
            }
            close($fh);
        } else {
            die "cannot open $txtfile: $!";
        }
    }
    
    print JSON->new->encode($data);
    
    • 1

relate perguntas

  • Existe uma maneira de obter o endereço IP do cliente SSH do usuário em um script bash?

  • Verifique se o usuário existe usando id (linux)

  • script de shell bash obtém substring de string contendo aspas

  • Como alinhar as colunas da saída do comando ls no Xubuntu 16.04.6?

  • Analisando os valores plist do macOS

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve