2014-10-30 60 views
0

我的目录添加filename列到文件的perl

1.csv 
2.csv 
3.csv 

我想在一个目录来捕捉每个文件的名称,并将其与一些额外的文本和列沿着打印到其coresponding文件中的附加列。

测试数据

hello,josh,12345,2014-10-30 

CODE

my $directory = 'C:\directory'; 

opendir(DIR, $directory); 
my @files = readdir(DIR); 
closedir(DIR); 
foreach (@files) { 
    print $_, "\n"; 
} 
while (<>) { 
    #Do whatever here 
    print; 
} 

预期的效果

  • 1.csv

    ID_1234,1.csv,Copmany,hello,josh,12345,2014-10-30 
    
  • 2.csv

    ID_1234,2.csv,Copmany,hello,josh,12345,2014-10-30 
    

目前的结果

. 
.. 
1.csv 
2.csv 
3.csv 
hello,josh,12345,2014-10-30 

我也想在目录中的所有文件执行这个脚本一个。

+0

凡做了'ID_12 34'从哪里来? – 2014-10-30 18:47:30

+0

ID_1234是一个附加的文本字符串,我想在opendir后连接我的文件名与 – JDE876 2014-10-30 18:48:51

+0

,您应该读两次并忽略返回值。你会在第一个阅读时总是收到'.'和'..'。所以请阅读两次以跳过它们,然后输入while循环来处理实际文件。或者,有人会毫无疑问地指出使用文件glob'glob('*。csv')来对匹配文件进行模式处理。 – 2014-10-30 19:40:25

回答

1

使用命令行的perl,

perl -i~ -F, -lane "BEGIN{$, =','; @ARGV=glob pop} print 'ID_1234',$ARGV,'Copmany',@F" *.csv 

perl -i~ -pe "BEGIN{ @ARGV=glob pop} s|^|ID_1234,$ARGV,Copmany,|" *.csv 

local $^I = "~"; 
local @ARGV = glob("C:\\directory\\*.csv"); 

while (<>) { 
    s|^|ID_1234,$ARGV,Copmany,|; 
    print; 
} 
+0

我该如何将其添加到程序中并实现为while循环? – JDE876 2014-10-30 18:50:23

+0

我用@mpapec的答案去了所以我可以使用ARGV作为存储变量。它创造了奇迹!然而,不是上面列出的正则表达式的|^| ID_1234,$ ARGV,Copmany,|;',我有一个连接字段= ARGV,即$ flds [??] = $ ARGV;对于额外的文本,我做了几个虚拟列。即$ flds [??] =〜s /^.*?$/ ID_1234 /;和$ flds [??] =〜s /^.*?$/公司/;然后,您可以加入这些字段来创建该字符串。再次感谢! – JDE876 2014-10-31 14:44:32

0

怎么样:

my $directory = 'C:\directory'; 

opendir(DIR, $directory); 
my @files = readdir(DIR); 
closedir(DIR); 
foreach (@files) { 
    print qq(ID_1234,$_,Copmany,hello,josh,12345,2014-10-30\n); 
}