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