这是同一项目的第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 "$!";
答案 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
)。我不明白为什么在进入电子表格的字符串上需要换行符。