Perl修改CSV文件

时间:2013-10-23 14:48:08

标签: perl csv

我正在尝试修改一小段代码。 我要做的是将文件名输入到第三列。目前我几乎让它工作,但我想从列中每个条目的末尾删除“.csv”。我还想给列标题“文件名”。

Table1 Table2

我希望上面显示的“table1”和“table2”之间的区别很好地总结了我在这里要做的修改。

我目前用于创建“table1”的代码如下:

#!/usr/bin/perl
use warnings;
use strict;
open M,"<mapcodelist.txt" or die "mapcodelist.txt $!";
my %m;
while( <M> ){
    my($k,$v)=split;
    $v=~s/\./_/g;
    $m{$k}=$v;
}
close M;
chdir "C:/Users/Stephen/Desktop/Database_Design/" or die $!;
@ARGV=<*.csv>;
$^I=".bak";
while( <> ){
    chomp;
    $\=/^mass/?",filename$/": ",$ARGV$/";
    print;
}
for( <*.csv> ){
  my $r;
  ($r=$_) =~ s/\w+_(\w+)(?=\.csv)/$1_$m{$1}/;
  rename $_,$r or warn " rename $_,$r  $!";
}

对此的任何建议都将非常感激。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试关注脚本:

#!/usr/bin/env perl;

use strict;
use warnings;
use Text::CSV_XS;

my ($prev_lc);

open my $fh, '<', shift or die;

my $csv = Text::CSV_XS->new({ eol => "\n" }) or die;
while ( my $row = $csv->getline($fh) ) { 
    if ( $csv->record_number == 1 ) { 
        $prev_lc = $row->[$#$row];
        $csv->print( \*STDOUT, [ @$row[0 .. $#$row - 1], 'Filename' ] );
        next;
    }

    $prev_lc =~ s/\.csv$//;
    $csv->print( \*STDOUT, [ @$row[0 .. $#$row - 1], $prev_lc ] );

    ## Previous last column.
    $prev_lc = $row->[$#$row];
}

它使用辅助变量添加缺少的标题并同时处理每个整个数据行。我只是使用正则表达式来删除扩展名。

使用以下虚拟测试数据(infile)并假设最后一行因标题而没有文件名:

mass,intensity,20130730_p12_A2.csv
2349.345,56.23423,20130730_p12_A2.csv
744.2884,5.01

运行如下脚本:

perl script.pl infile

产量:

mass,intensity,Filename
2349.345,56.23423,20130730_p12_A2
744.2884,20130730_p12_A2

根据您未显示的特定数据,它可能并不完美,而且我没有考虑您在处理许多文件时发布的所有代码。但是你可以看到它的工作方式与你提出的方式有关,如果有必要,它可以让你根据自己的需要进行调整。