2013-10-23 87 views
0

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

Table1 Table2

我希望“表1”上面显示“表2”之间的区别总结非常好,我想在这里做了修改。

我目前使用的是创建“表1”的代码如下:

#!/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 $!"; 
} 

任何意见与这将是非常赞赏。

谢谢。

+0

您现在有足够的信誉来添加图像。您也可以将示例数据添加为代码块。 – simbabque

+0

感谢simbabque,按照您的建议修改了帖子。 –

+0

请不要使用正则表达式来修改CSV行的内容。用Text :: CSV或Text :: CSV_XS等模块读取每一行,修改需要修改的字段,然后重新生成并重写CSV行。 –

回答

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 

也许这不是完美的根据特定的数据你没有显示,我没有考虑到你处理许多文件时发布的所有代码。但是你可以看到它按照你提出的方式工作,如果有必要,它可以让你适应你的需求。