【发布时间】:2016-09-06 01:16:08
【问题描述】:
这是同一个项目的第三个问题: 我试图在 2,000 多个子目录中从“pairsAngles.txt”中提取字符串“Distance:”;子目录的名称是从 csv 文件中获取的。 将 eol => $/ 传递给 Text::CSV_XS->new AND 使用 $csv->say 后,输出仍然是一行...
#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;
use Text::CSV_XS;
my @pairs=();
my @result=();
my $c1;
my $in;
my $out;
my $pairs;
my $dist = "";
my $dir = "/home/avabelieve/aaPROJECT/helicalPair_ax/selectedPairs/renumberedPdb/clusterPairs-1.25-12-05_windows.12.resle3.2A.RMSD1.3/oligomerAngle";
my $cluster = "clst1.csv";
open ($in, $cluster) || die "cannot open \"$cluster\": $!";
my $cU = "clst1Updated.csv";
open ($out, ">$cU") || die "cannot open '$cU' $!";
my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1, eol => $/ });
while ($c1 = <$in>) {
chomp $c1;
push @pairs, $c1;
}
foreach $c1 (@pairs) {
find (\&Matches, "$dir/$c1");
sub Matches {
open ($pairs, "pairsAngles.txt") or die "$!";
while (my $dist = <$pairs>) {
if ($dist =~ m/Distance: /) {
chomp $dist;
push (@result, "$dist\n");
}
}
}
}
chdir "..";
if (not $csv->eof) {
$csv->error_diag();
}
$csv->say ($out, [@pairs, @result]);
close $out or die "$!";
【问题讨论】:
-
您可能已经注意到我一直在编辑您的代码以更改支撑和缩进。大括号和缩进的位置对于使代码可读非常重要,特别是对于您的问题,了解哪些代码在哪个循环中。考虑采用这种更常见的支撑样式。
-
在这一点上,您感觉就像在移动代码,直到某些东西在没有完全理解发生了什么的情况下工作。而且我们不明白你想要完成什么,所以我们能做的只有这么多。那么你为什么不解释你在这里想要完成的事情呢?给我们具体的输入,例如一些简短的 CSV 数据、一个小的示例目录树以及您期望的输出。
-
这是我看到的。您在
@pairs中获得目录。对于每个文件中的一个文件,您获取$dist并将其添加到@results。一个猜测:你想写出一个包含行directory | dist-line的文件。问题:如果$dist被多次找到或在文件中找不到怎么办?然后@pairs和@results长度不匹配,不能简单的写出文件。您必须在循环中添加一些处理,将多个或零匹配与它们发生的目录相关联。如果只能有 一个 匹配项,则最好以不同的方式编写代码。这有意义吗? -
既然这演变成一个新问题,我建议你mark answers here accordingly,所以未来的访问者很清楚这个问题是如何解决的。如果此处提出的特定问题仍有问题,请发布反馈。
标签: regex perl csv text format