我是perl的新手,我正在尝试获取一个.idx
格式如下的文件(实际上是文件)
Monday Foo Name 43212
Tuesday Name Foo Foo 43252
Tuesday Name 50322
Wednesday Foo Name 53221
Thursday Foo Bar Foo Name 24353
我想将其输出为csv文件。该文件应该看起来完全像这样,除了CSV格式,以便Excel可以读取它。另外,我只希望包含星期二的行,以便CSV文件看起来像
Tuesday Name Foo Foo 43252
Tuesday Name 50322
在Excel中。我也有一些idx
格式的文件formYYYY_Q.idx
,其中YYYY
是指一年Q
指的是四分之一。我想遍历.idx
我拥有的所有文件,并创建一个大的CSV文件,每个.idx
文件Tuesday
的开头都只有一行。我到目前为止的代码是
#!/usr/bin/perl
use warnings;
use strict;
use Text::CSV;
my $csvfile= Text::CSV->new({binary=>1,auto_diag=>1});
$csvfile->column_names("Day","Name","Number");
my @datalines;
my $idxfile="form1994_1.idx";
open(INFILE, "< $idxfile") or die $!;
open(my $outfile, "> Master.csv") or die $!;
while(<INFILE>){
if(/^Tuesday/){
chomp($_);
push(@nsarlines, $_);
}
}
当我将open命令替换open(OUTFILE, "> Master.txt") or die $!;
为while循环外的最后一行代码中包含以下命令时:
print OUTFILE map {"$_ \n"} @nsarlines;
Master.txt文件看起来像我想要的
Tuesday Name Foo Foo 43252
Tuesday Name 50322
但是,如果我使用上面编写的open命令,请在while循环外执行以下操作:
$csvfile-> print($outfile, \@test);
我得到了带有完整$_
字符串的CSV文件,该字符串是.idx
Master.csv文件每个单元格中文件的一行。我很难弄清楚如何使perl使得每.idx
行成为CSV行WIHTOUT手动插入逗号$_
(这不是一个优雅或理想的选择)。
我需要做的第二件事是我的文件formYYY_Q.idx
都在同一目录中,我想自动浏览每个文件,取出以星期二开头的行并将其添加到Master.csv文件中(或者说,全部然后在末尾写入一次Master.csv文件)。我认为File::Find
也许可以做到这一点,但是我还无法弄清楚如何使用它。
谢谢你的帮助。
有两种使用File :: Find的方法。一种是使用该wanted
功能将有关文件的数据添加到全局列表/队列/变量,然后在find
调用后处理数据。另一种方法是执行功能中的所有处理wanted
。
我个人不喜欢使用全局变量从函数中传递数据,但不幸的是,使用File :: Find是您的选择。这是他们执行此操作的示例:http : //www.perlmonks.org/?node_id=217378。在示例中,他们使用%size哈希将数据传递出匿名wanted
函数。这可能是最好的选择,您可以将匹配的文件名添加到全局列表中,然后遍历列表,将每个文件中的数据写入CSV。
另一个选项是在wanted
功能中执行处理。但同样,这是最理想的,因为你需要使用全局变量将信息传递到的wanted
关于开放CSV文件的功能。
假设可以确保所有.idx文件都位于同一目录(而不是同一目录树)中,则另一种选择是使用opendir和readdir函数。http://perldoc.perl.org/functions/readdir.html
my $dh; # directory handle
opendir($dh, $your_dir) || die $!;
my @idxfiles = grep {/\.idx$/} readdir($dh);
closedir($dh);
foreach my $idxfile (@idxfiles) {
open(INFILE, "< $idxfile") or die $!;
... the rest of your code ...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句