【发布时间】:2014-02-16 02:58:23
【问题描述】:
我是 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 文件,这是 Master.csv 文件的每个单元格中 .idx 文件的一行。我很难弄清楚如何使 perl 使每个 .idx 行成为 CSV 行,而无需手动将逗号插入 $_(不是一个优雅或理想的选择)。
我需要做的第二件事是我有文件formYYY_Q.idx 都在同一个目录中,我想自动浏览每个文件,提取以星期二开头的行并将它们添加到 Master.csv 文件(或者更确切地说,完成所有这些并在最后编写一次 Master.csv 文件)。我认为File::Find 可能能够做到这一点,但我一直无法弄清楚如何使用它。
感谢您的帮助。
【问题讨论】:
-
为什么不想插入逗号? csv 是逗号分隔值的首字母缩写词。您可以使用
split /\s+/和join ","轻松完成。老实说,我没有理由使用模块来编写 csv 文件。读书,是的。写作,没有。 -
@avitevet 实际文件具有不同字长的
Fooname变量。一个可能是Company Foofirm,而另一个可能是Holding Foofirm Parters。如果我使用split /\s+/,它将在我的数据中有空格的任何地方放置一个逗号。所以我会得到"Tuesday,Holding,Foofirm,Partners,43252"而不是"Tuesday,Holding Foofirm Partners,43252"。而且公司名称由多少个单词组成,也没有任何固定的统一模式。 -
如果您不想处理您的行,而只是重新打印它们,您也许应该使用 grep:
grep "^Tuesday" form1994_1.idx -
我明白了...但是必须有一些分隔符,对吗?否则,任何脚本如何知道正确放置逗号的位置?你能在分隔符上拆分吗?我同意,对于 TLP,如果您只想重新打印它们,您可以使用单个命令行来执行此操作: find 。 -name '*.idx' -type f -exec grep Tuesday '{}' \; > Master.csv
-
@avitevet 不幸的是,除了列之间“有点”一致的空格之外,没有任何分隔符。我希望隐藏的字符只是单独的
\t,但它们都是不同长度的\s。我最终只是“手动”在循环的每次迭代中插入逗号,并且不得不修补在某些列中添加空格,以便所有 64,000 行都正确显示。感谢您的意见。