我正在尝试修改一小段代码。 我要做的是将文件名输入到第三列。目前我几乎让它工作,但我想从列中每个条目的末尾删除“.csv”。我还想给列标题“文件名”。
我希望上面显示的“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 $!";
}
对此的任何建议都将非常感激。
感谢。
答案 0 :(得分:0)
您可以尝试关注perl脚本:
#!/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
根据您未显示的特定数据,它可能并不完美,而且我没有考虑您在处理许多文件时发布的所有代码。但是你可以看到它的工作方式与你提出的方式有关,如果有必要,它可以让你根据自己的需要进行调整。