2016-05-10 5 views
1

私はgrep文字列 "Distance:"から "pairsAngles.txt"を2,000個以上のサブディレクトリ内にしようとしていました。サブディレクトリの名前はcsvファイルから取得されます。
ただし、次のコードは、私だけのテキストエディタで私も開いていない可能性がCSV形式で出力の巨大な単一行与える:有することにいくつかの奇妙な理由で、テキスト:: CSV_XSデフォルトについてPerl:列内の出力配列

my @pairs=qw(); 
my @result=(); 

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 }); 

while (my $c1 = <$in>) {  
    chomp $c1; 
    push @pairs, $c1; 

    foreach $c1 (uniq @pairs) { 
     find (\&Matches, "$dir/$c1"); 
      sub Matches { 
       open ($pairs, "oligomerAngles.out") or die "$!"; 

       while (my $dist = <$pairs>) { 

       if ($dist =~ m/Distance: /){      

        chomp $dist; 
        push (@result, "$dist\n"); 
        @result = split ": ", $dist; 
         }    

        } 
}    } chdir ".."; 

if (not $csv->eof) { 
    $csv->error_diag(); 
} 
$csv->print ($out, [uniq @pairs, @result]); 
} 
close $out or die "$!"; 

答えて

2

をCSVを生成するときに行末の区切り記号はありません。あなたが期待する何かを渡すために、おそらく賢明ですので、[EOLがさ]発電インスタンスに渡されていないthe eol attribute ...

ためのドキュメントからは、レコードは、すべてで終了しません。出力時の安全な選択肢は、$ /または\ r \ nです。

あなたはeol => $/Text::CSV_XS->newに(現在のオペレーティングシステムのための適切な改行に$/デフォルト)を渡すこともできますし、そのEOLのデフォルトのため$/を使用しています$csv->say代わりの$csv->printを使用することができます。私は両方をすることをお勧めします。

+1

ありがとうございました!出来た!!!しかし、今私は別の質問があります: http://stackoverflow.com/questions/37148048/perl-redundancy-due-to-restart-in-foreach –