Perl:输出仍然只有一行

时间:2016-05-10 21:10:53

标签: regex perl csv text format

这是同一项目的第3个问题: 我试图grep string" Distance:"来自" pairsAngles.txt"在2,000多个子目录中;子目录的名称是从csv文件中获取的。 通过eol =>之后$ / to Text :: CSV_XS-> new AND use $ csv->说,输出仍然是一行...

#!/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 "$!";

2 个答案:

答案 0 :(得分:2)

由于private void Form1_Load(object sender, EventArgs e) { var eventsProperty = dataGrid1.GetType().GetProperty("Events", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); EventHandlerList events = eventsProperty.GetValue(dataGrid1) as EventHandlerList; var eventsNodeClickedKeyField = dataGrid1.GetType().GetField("EVENT_NODECLICKED", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); object eventsNodeClickedKey = eventsNodeClickedKeyField.GetValue(null); events.AddHandler(eventsNodeClickedKey, new EventHandler(dataGrid1_NodeClicked)); } private void dataGrid1_NodeClicked(object sender, EventArgs e) { var grid = sender as DataGrid; var point = grid.PointToClient(MousePosition); var hti = grid.HitTest(point); grid.NavigateTo(hti.Row, "RelationName"); } 位于程序的末尾,并且它不在循环中,因此它只会打印一行。它将拥有每一对和每一个结果。

$csv->say

我不确定您要完成的任务,但您可能希望在循环中打印结果。

答案 1 :(得分:2)

我不知道您希望如何在输出中合并@pairs@result,而是根据{{3}中的概要将整个数组写入您需要的电子表格中}

 $csv->say ($fh, $_) for @rows;

告诉我们@pairs@result应如何在输出中配对以获取更多详细信息。

澄清:写入的行应该有一个目录单元格,另一个单元格用于相应的匹配行,我们确信每个文件中只有一个这样的匹配。然后

if (@pairs != @result) {
    die "Mismatching lengths: directory " . scalar(@pairs) .
        " vs matches " . scalar(@result);
}
for my $i (0..$#pairs) {
    $csv->say($out, [$pairs[$i], $result[$i]]);
} 

请注意,@pairs != @result (例如,在一个文件中可能存在不匹配但在另一个文件中可能存在两个,并且数组最终会具有相同的长度。)添加@result的检查将测试确实存在一个匹配。

一张纸条。一个地方的代码会移除chomp的新行,但会将其放回\n

chomp $dist;
push (@result, "$dist\n");

不需要\n,然后也不需要"" - 仅push @result, $dist;。至于换行符,请将其删除chomp或保留(删除chomp)。我不明白为什么在进入电子表格的字符串上需要换行符。