0

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

表格1 表2

我希望上面显示的“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  $!";
}

对此的任何建议将不胜感激。

谢谢。

4

1 回答 1

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

根据您未显示的特定数据,也许它并不完美,而且我没有考虑您在处理许多文件的地方发布的所有代码。但是您可以看到它以您所要求的方式工作,并且如果有必要,它会留给您根据您的需要进行调整。

于 2013-10-23T22:32:12.080 回答