我想编写一个脚本,将几个.csv文件的内容合并到一个.csv文件中,即,将所有其他文件的列追加到第一个文件的列中。我曾尝试使用“ for”循环来执行此操作,但无法继续进行。
有人知道如何在Linux中执行此操作吗?
这是一个perl脚本,它读取命令行上指定的每个文件的每一行,并将其附加到数组(@csv
)中的元素上。当没有更多输入时,它将输出的每个元素@csv
。
这些.csv
文件将按照在命令行上列出的顺序添加。
警告:此脚本假定所有输入文件的行数均相同。如果任何文件的行数与其他文件不同,则输出将可能无法使用。
#!/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";
};
给定以下输入文件:
==> 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
它将产生以下输出:
$ ./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
好吧,既然您已经阅读了到目前为止,是时候承认这一点不能做也不能做的事情了paste -d, *.csv
。那么,为什么还要打扰一下perl?paste
相当不灵活。如果您的数据完全适合paste
做某事,那么您就很好-对工作非常完美,而且速度非常快。如果没有,那对您完全没有用。
有多种方法可以改进像这样的perl脚本(例如,通过计算每个文件的字段数并@csv
为每个丢失的文件添加正确的空字段数来处理不同长度的文件)或至少检测到不同的长度并出现错误),但是如果需要更复杂的合并,这是一个合理的起点。
顺便说一句,这使用了一种非常简单的算法,并将所有输入文件的全部内容@csv
一次存储在内存中。对于现代系统中每个文件最多不超过几MB的文件,这并不是没有道理的。但是,如果要处理巨大的.csv文件,则更好的算法是:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句