Mesclando o conteúdo de vários arquivos .csv em um único arquivo .csv

3

Eu quero escrever um script que mescle o conteúdo de vários arquivos .csv em um arquivo .csv, ou seja, acrescente colunas de todos os outros arquivos às colunas do primeiro arquivo. Eu tentei fazer isso usando um loop "for", mas não consegui prosseguir com ele.

Alguém sabe como fazer isso no Linux?

    
por rmb 04.07.2016 / 14:38

2 respostas

3

Aqui está um script perl que lê cada linha de cada arquivo especificado na linha de comando e o acrescenta aos elementos da matriz ( @csv ). Quando não há mais entrada, ela imprime cada elemento de @csv .

Os arquivos .csv serão anexados na ordem em que estão listados na linha de comando.

AVISO : este script assume que todos os arquivos de entrada possuem o mesmo número de linhas . A saída provavelmente será inutilizável se qualquer arquivo tiver um número diferente de linhas de qualquer um dos outros.

#!/usr/bin/perl

use strict;

my @csv=();

foreach (@ARGV) {
  my $linenum=0;

  open(F,"<",$_) or die "couldn't open $_ for read: $!\n";

  while (<F>) {
    chomp;
    $csv[$linenum++] .= "," . $_;
  };

  close(F);
};

foreach (@csv) {
  s/^,//;   # strip leading comma from line
  print $_,"\n";
};

Dados os seguintes arquivos de entrada:

==> 1.csv <==
1,2,3,4
1,2,3,4
1,2,3,4
1,2,3,4

==> 2.csv <==
5,6,7,8
5,6,7,8
5,6,7,8
5,6,7,8

==> 3.csv <==
9,10,11,12
9,10,11,12
9,10,11,12
9,10,11,12

produzirá a seguinte saída:

$ ./mergecsv.pl *.csv
1,2,3,4,5,6,7,8,9,10,11,12
1,2,3,4,5,6,7,8,9,10,11,12
1,2,3,4,5,6,7,8,9,10,11,12
1,2,3,4,5,6,7,8,9,10,11,12

OK, agora que você já leu até aqui, é hora de admitir que isso não faz nada que paste -d, *.csv também não faça. Então, por que se preocupar com o perl? paste é bastante inflexível. Se seus dados estão exatamente certos para o que paste faz, você é bom - é perfeito para o trabalho e muito rápido. Se não, é completamente inútil para você.

Existem diversas maneiras de melhorar um script em Perl como esse (por exemplo, manipular arquivos de diferentes comprimentos contando o número de campos para cada arquivo e adicionando o número correto de campos vazios a @csv para cada arquivo (s) que estão faltando linhas ou, pelo menos, detectando comprimentos diferentes e saindo com um erro), mas este é um ponto de partida razoável se uma fusão mais sofisticada for necessária.

BTW, isso usa um algoritmo realmente simples e armazena todo o conteúdo de todos os arquivos de entrada na memória (em @csv ) de uma só vez. Para arquivos de até alguns MB cada em um sistema moderno, isso não é irracional. Se, no entanto, você estiver processando arquivos .csv ENORMES, um algoritmo melhor seria:

  • abra todos os arquivos de entrada e, enquanto ainda houver entrada para ler:
    • leia uma linha de cada arquivo
    • acrescente as linhas (na ordem @ARGV)
    • imprima a linha anexada
por 04.07.2016 / 15:51
5

A abordagem mais simples para conseguir isso seria digitar o seguinte comando

cat *csv > combined.csv

Este arquivo deve conter o conteúdo de todos os seus arquivos csv apenas da maneira que você mencionou.

    
por 04.07.2016 / 15:28