2012-03-08 6 views
0

2つのファイルがあります.1つはコードのリストを持ち、もう1つは名前の付いたコードのリストを持ち、パイプで区切られています。最初のファイルのリストで2つのtxtファイルをマージし、同じリストを出力に残す

例:)1ファイル:

00001 
00002 
00001 
00003 
00002 
00004 

ファイル2:*いくつかの名前を注意など名1 1可能性が新例えば以下を参照:

00001 | name1 1 1 
00002 | name2 2 
00003 | name3 3 3 3 
00004 | name4 4 4 4 4 

私は出力を維持する必要がありますファイル1で同じ構造を持つが、このようなファイル2から名前を取得:

出力ファイル:

00001 | name1 1 1 
00002 | name2 2 
00001 | name1 1 1 
00003 | name3 3 3 3 
00002 | name2 2 
00004 | name4 4 4 4 4 

など。私はまた、WindowsのCMDにFINDSTR機能を使用している

#!/usr/bin/perl -w 
    use strict; 
    #FindTextInFile.pl 
    my ($names, $data) = ("codesonly.txt", "codeandtext.txt"); 
    open (FILE1, $names) || die; 
    open (FILE2, $data) || die; 
    undef $/; #Enter "file-slurp mode" by emptying variable indicating end-of-record 
    my $string = <FILE2>; #Read entire file to be searched into a string variable 
    $/ = "\n"; #Restore default value to end-of-record variable 

    while (<FILE1>) { 
     chomp; #remove new-line character from end of $_ 
     #Use quotemeta() to fix characters that could spoil syntax in search pattern 
     my $qmname = quotemeta($_); 


     if ($string =~m/$qmname/i) { 
        print " $_ \n"; 
     } 
     else { 

     } 

    } 

コマンドが、それは、出力ラインしません:私は、私が発見し、最初のファイルからの行によって、ファイル内の一致を検索するように変更Perlスクリプトを使用しています私のためにラインで。私はPERLにはとても慣れていないので、どんな助けも偉大であるか、これを行う簡単な方法があれば非常に役に立ちます。私が使用するファイルは〜1M行なので、速くなるものが必要です。

おかげ

+0

実際に自分で作成していない限り、[参加](http://www.manpagez.com/man/1/join/)を試してください。 –

答えて

0

感謝。私はこのコードで必要なことをすることができました。

open(file1, "<file1.txt"); 
    open(file2, "<file2.txt"); 

    while(<file2>){ 
      my($line) = $_; 
      chomp $line; 
      my($key, $value) = $line =~ /(.+)\|(.+)/; 
      $file2Hash{$key} = $value; 
    } 

    while(<file1>){ 
      my($line) = $_; 
      chomp $line; 
      if(exists $file2Hash{$line}){print $line." | ".$file2Hash{$line}."\n";} 
      else{print $line." | "."Error - Key not found in hash\n";} 
    } 
2

は迅速イースリー検索のためのハッシュを使用します。

​​
+0

池上に感謝します。私はこのコードを動作させようとしていますが、できません。私は私のファイルのためにそれを実行するとき、私は結果を得ていません。何か案は? – user1258104

+0

@ user1258104、更新されたデータでもコードは正常に動作します。実際に '$ names_qfn'と' $ index_qfn'ファイルの名前を入れましたか?あなたも '厳密に使う 'と言ってください。警告を使う; '?常に!!! – ikegami

0

これはおそらく何か? everyonesの返信用

use strict; 
use warnings; 

my %codes = do { 
    local $/; 
    open my $fh, '<', 'f2.txt' or die $!; 
    <$fh> =~ /\w+/g; 
}; 

open my $fh, '<', 'f1.txt' or die $!; 
while (<$fh>) { 
    my ($key) = /(\w+)/; 
    print "$key | $codes{$key}\n"; 
} 

OUTPUT

00001 | name1 
00002 | name2 
00001 | name1 
00003 | name3 
00002 | name2 
00004 | name4 
+0

応答Borodinに感謝します。それはうまくいったけど、名前の一部にはスペースがあることにも言及すべきだった。 – user1258104

関連する問題