假设我有一个文件夹,其中包含一千个名为File1.csv,File2.csv,...,File1000.csv的文件,每个文件都包含一些以分号分隔的(;)数据值。
我需要一个Perl脚本,将该文件夹中的所有csv文件“合并”为一个接一个地附加每个文件,并在每行末尾添加另一个数据列,其中包含当前正在处理的文件的名称(不结尾,例如“; File2”)。
史蒂夫
答案 0 :(得分:1)
Text::CSV
可用于解析CSV。以下脚本将在包含CSV文件的目录中运行。它不是递归的(已使用glob
)。如果您需要递归查找文件,可以使用File::Find
Perl模块。
#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new( { 'sep_char' => ';' } );
open my $fho, '>', 'combined.csv' or die "Error opening file: $!";
while ( my $file = <*.csv> ) {
open my $fhi, '<', $file or die "Error opening file: $!";
( my $last_field = $file ) =~ s/\.[^\.]+$//; # Strip the file extension off
while ( my $row = $csv->getline($fhi) ) {
$csv->combine( @$row, $last_field ); # Construct new row by appending the file name without the extension
print $fho $csv->string, "\n"; # Write the combined string to combined.csv
}
}