合并多个文本文件,并在每行末尾附加当前文件名

时间:2012-05-28 10:52:53

标签: perl file merge

假设我有一个文件夹,其中包含一千个名为File1.csv,File2.csv,...,File1000.csv的文件,每个文件都包含一些以分号分隔的(;)数据值。

我需要一个Perl脚本,将该文件夹中的所有csv文件“合并”为一个接一个地附加每个文件,并在每行末尾添加另一个数据列,其中包含当前正在处理的文件的名称(不结尾,例如“; File2”)。

史蒂夫

1 个答案:

答案 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
    }
}