Importar conjunto de arquivos de texto para um conjunto de colunas

0

Eu tenho um conjunto de arquivos de texto chamado outfile00.txt until outfile297.txt . Cada arquivo tem um número (decimal ou não) em todas as linhas, exceto a primeira (que é como um cabeçalho).

Eu preciso importar o conteúdo de cada arquivo para uma coluna a partir da coluna A (que corresponderá a outfile00.txt ) até que todos os arquivos de texto tenham sido importados.

Aqui está uma amostra do começo de outfile00.txt :

KP=0.50 ,Ki=0.10 ,Kd=0.05
0.00
0.00
0.00
0.00

O arquivo atual tem cerca de 1500 linhas. Eu tentei importar manualmente o arquivo de texto usando a guia Dados; O Excel não tem problemas e o texto é importado.

Como posso importar todos os arquivos de texto como um lote?

EDITAR

Eu acredito que não defini meu problema claramente, então aqui estão alguns detalhes adicionais.

Com relação ao método do cybernard,

Se eu criar um arquivo de valores separados por tabulações (o caractere de tabulação está entre a letra e o número em cada linha), como segue,

a   1
b   2
c   3
e   4
f   5
g   6

Eu posso importar o arquivo de texto diretamente e obter o seguinte,

EuesperavacriarumarquivosemelhanteaoarquivoTSVmencionadoanteriormente.Umexemploseriaoseguinte,

KP=0.50,Ki=0.10,Kd=0.05KP=0.50,Ki=0.10,Kd=0.10KP=0.50,Ki=0.10,Kd=0.150.00117.00123.000.00118.00124.000.00119.00125.000.00120.00126.00

,queproduzosseguintesresultadosdeimportação,

Eu preciso saber como posso gerar um arquivo TSV desse tipo a partir dos meus arquivos de origem.

    
por Khalid Hussain 05.08.2016 / 01:51

3 respostas

1

Você pode usar o Power Query para combinar todos os arquivos em uma pasta. O Power Query é um suplemento gratuito da Microsoft para o Excel 2010 e 2013 e foi incorporado ao Excel 2016 como Obter e Transformar.

Ken Puls tem um tutorial detalhado aqui .

Quando a consulta estiver configurada, os arquivos poderão ser adicionados ou removidos da pasta, e a consulta poderá ser atualizada com o clique de um botão.

    
por 05.08.2016 / 03:14
0

Primeiro 00 terá que ser renomeado 0. Você pode ter que remover outros 0 deslocamentos. Por exemplo, 01,02,03 não funcionará, renomeie para 1,2,3.

no prompt de comando, vá para a pasta que contém todos os seus arquivos.

FOR / L% i IN (0,1,297) DO tipo outfile% i.txt > > master.txt

Isso deve combinar todos os seus arquivos em master.txt.

Então você quer uma chave de tabulação entre os arquivos. No bloco de notas, crie um arquivo que contenha uma única guia chamada tab.txt depois de salvá-lo, verifique se ele tem 1 byte de tamanho e se você acidentalmente bateu em outros caracteres.

FOR / L% i IN (0,1,297) DO tipo outfile% i.txt tab.txt > > master.txt

    
por 05.08.2016 / 02:58
0

Q: I need to know how I can generate such a TSV file from my source files.

Você sabia que existe um comando apenas para isso?

paste outfile*.txt > out.txt

Se você quiser escrever seu próprio algoritmo, escolha a linguagem (scripting) de sua escolha.

  1. awk : awk -f awk.awk outfile*.txt > out.txt

    BEGIN {count = 1}
    FNR == 1 && FNR < NR {count++}
    
    {
      if ( _[FNR] ) {
        while ( c[FNR] != count-1 ) {
          _[FNR] = (_[FNR] " " sprintf("%8s",""))
          c[FNR]++
        }
        _[FNR] = (_[FNR] "\t" sprintf("%-8s",$0))
        c[FNR]++
      }
      else if ( count == 1 ) {
        _[FNR] = sprintf("%-8s",$0)
        c[FNR]++
      }
      else {
        while ( c[FNR] != count-1 ) {
          if ( _[FNR] )
            _[FNR] = (_[FNR] " " sprintf("%8s",""))
          else
            _[FNR] = sprintf("%8s","")
          c[FNR]++
        }
        _[FNR] = (_[FNR] "\t" sprintf("%-8s",$0))
        c[FNR]++
      }
    }
    
    END {
      for (i=1; i<=length(_); i++)
        print _[i]
    }
    
  2. perl : perl perl.pl > out.txt

    use strict;
    use warnings;
    
    my $i;
    my @rows;
    my @files = map { "outfile$_.txt" } 0 .. 297;
    
    foreach my $file (@files) {
        open my $infh, '<', $file or die $!;
        $i=0;
        while (<$infh>) {
            chomp;
            my $data = $_;
            if (length $rows[$i]) {
                $rows[$i++] .= "\t" . $data;
            } else {
                $rows[$i++] = $data;
            }
        }
    }
    
    foreach my $row (@rows) {
        print "$row\n";
    }
    

PS Caso você esteja se perguntando, bash, awk e perl estão disponíveis em várias plataformas, incluindo o Windows ( cygwin sendo minha recomendação lá).

Atualização: Aqui estão os arquivos de entrada que usei, juntamente com a saída de paste outfile*.txt > out.txt no Git para Windows .

==> outfile00.txt <==
KP=0.50 ,Ki=0.10 ,Kd=0.05
0.00
0.00
0.00
0.00

==> outfile01.txt <==
KP=1.50 ,Ki=1.10 ,Kd=1.05
1.00
1.00
1.00
1.00

==> out.txt <==
KP=0.50 ,Ki=0.10 ,Kd=0.05       KP=1.50 ,Ki=1.10 ,Kd=1.05
0.00    1.00
0.00    1.00
0.00    1.00
0.00    1.00
    
por 27.07.2017 / 17:07