1

F1.txt

bob
tom
harry

F2.txt

bob
a=1   b=2   c=3
bob
d=4   e=5   f=6
tom
a1=34  b1=32  c1=3443
tom
a2=534  b2=732  c2=673443

結果:

A1.txt

bob
a=1   b=2   c=3
bob
d=4   e=5   f=6

A2.txt

tom
a1=34  b1=32  c1=3443
tom
a2=534  b2=732  c2=673443

私はPERLを初めて使用しますが、問題の解決にご協力いただけますか。上記の2つのファイル、つまりF1.txtとF2.txtについて説明しました。私の仕事は、F2.txtでF1.txtの要素を検索し、次の行と一緒に対応する行。1つの要素が見つかった場合は、結果を新しいファイルに保存する必要があります。例としてA1.txtを指定しました。これは、bobに関するすべての情報を格納し、同様にA2.txtはTomに関するすべての情報を格納します。今まで私はこのコードを試しましたが、効率的に機能していません、

use strict; 
use warnings;  

my $line1; 
my $line2; 
my $fh; 
my $fh1; 
my $counter;  

open  $fh, "<", "F1.txt" or die $!; 
open  $fh1, "<", "F2.txt" or die $!;  

my @b = <$fh>; 
my @a = <$fh1>;  

for (@b) 
{     
  $line1 = $_;     

  for (@a)     
  {         
    $line2 = $_;         
    if ($line1 =~ /^$line2$/)         
    { 
      $counter++;             
      open my $outfile, ">>", "A_${counter}.txt";             
      print $outfile $line2;             
      close $outfile;         
    }
  }
} 
4

1 に答える 1

5

繰り返し要素をチェックするときはいつでも、ハッシュを考えてください。たとえば、2つのファイルがあるとします。

 File #1      File #2
 Bob          Tom
 Ted          Dick
 Alice        Harry
 Carol        Ted

ファイル#1にもあるファイル#2で名前を見つけることが仕事の場合は、ファイル#1の名前をハッシュで保存し、ファイル#2を調べながら、に一致する名前があるかどうかを確認します。あなたのハッシュ。

まず、ファイル#1を読みましょう。

 use strict;
 use warnings;
 use autodie;  #This way, I don't have to check open statements

 open my $file_1, "<", "file_1";
 my %first_file_name_hash;
 while my $name (<$file_1>) {
    chomp $name;
    $first_file_name_hash{$name} = 1;
 }
 close $file_1;

これで、%first_file_name_hashファイル#1のすべての名前が含まれます。

次に、ファイル#2を開いて、次の手順を実行します。

open my $file_2, "<" "file_2";
while my $name (<$file_2>) {
   if ($first_file_name_hash) {
       print "User is in file #1 and file #2\n";
   }
}
close $file_2;

はい、これはあなたが望んでいたものではありませんが、ハッシュを保存する方法についての良いアイデアを与えてくれます。


ハッシュには、値に関連付けられたキーがあります。各エントリには一意のキーが必要です。ただし、ハッシュの各エントリには重複する値が含まれる可能性があります。簡単なハッシュは次のとおりです。

 $hash{BOB} = "New York";
 $hash{CAROL} = "New York";
 $hash{TED} = "Los Angeles";
 $hash{ALICE} = "Chicago";

上記では、両方$hash{BOB}$hash{CAROL}同じ値を持っています(ニューヨーク)。ただし、存在できるのは単一BOBまたはCAROLハッシュのみです。

ハッシュの大きな利点は、キーによって要素にアクセスするのが非常に簡単なことです。あなたは鍵を知っています、あなたは簡単に要素を持ち出すことができます。

あなたの場合、私は2つのハッシュを使用します。最初のハッシュでは、最初のファイルの全員の名前を$HASH_1に保存します。$HASH_2の2番目のファイルに全員の名前を保存します。それだけでなく、$HASH_2の値をファイルの次の行にします。

これはあなたに与えるでしょう:

$HASH_1{bob} = 1;
$HASH_1{tom} = 1;
$HASH_1{harry} = 1; 

$HASH_2{bob} = a=1  b=2  c=3
               d=4  e=5  f=6
$HASH_2{tom} = a1=34  b1=32  c1=3443
               a2=534   b2=732   c2=673443

:ハッシュの各エントリには1つの値の制限があるため、キーが。の行が2つ以上あるbob場合は、それらを処理する方法を理解する必要があります。この場合、キーがすでにに存在する場合は$HASH_2、NL値の後にキーを追加するだけです。

最新のPerlでは、配列をハッシュに格納できますが、あなたは初心者のPerlプログラマーなので、より単純なトリックに固執します。

これが完全にテストされていないプログラムです:

use strict;
use warnings;
use autodie;
use feature qw(say);   #Better print that print

# Read in File #1
open my $file_1, "<", "F1.txt";
my %hash_1;
while my $name (<$file_1>) {
   chomp $name;
   $hash_1{$name} = 1;
}
close $file_1;

# Read in File #2 -- a bit trickier

open my $file_2, "<", "F2.txt";
my %hash_2;
while my $name (<$file_2>) {
    chomp $name;
    my $value = <$file_2>;              #The next line
    chomp $value;
    next if not exists $hash_1{$name};  #Not interested if it's not in File #1
    if (exists $hash_2{$name}) {        #We've seen this before!
        $hash_2{$name} = $hash_2{$name} . "\n" . $value; #Appending value
    }
    else {
        $hash_2{$name} = $value;
    }
 }
 close $file_2;

これで、必要な方法でデータを取得できます。%hash_2必要なものがすべて含まれています。どのように印刷したいかわかりません。ただし、次のようになります。

 my $counter = 1;    #Used for file numbering..
 foreach my $name (sort keys %hash_2) {
    open my $file, ">", "A" . $counter . "txt";
    say $file "$name";     #Name of person
    my @lines = split /\n/, $hash_2{$key};  #Lines in our hash value
    foreach my $line (@lines) {
      say $file "$line";
    }
    close $file;
    $counter++;
 }

ハッシュを使用することで、多くの時間を消費してしまう可能性のある二重のforループを回避していることに注意してください。私は3つのループだけを通過します:最初の2つは各ファイルで読み込まれます。最後のファイルは2番目のファイルのハッシュを調べて、それを出力します。

ハッシュを使用することは、すでに読んだデータを追跡するための優れた方法です。

于 2012-08-07T03:47:10.650 に答える