1

次のデータを含む 2 つの csv ファイルがあります。

gt1/sd2    34      3
gt1/sd3    67      4
gt1/sd4    20     -9

データを含む2番目のcsvファイル:

gt1/sd2    9    6
gt1/sd5    10   8
gt1/sd9    21   10

ここで、各 csv の最初の列を比較して、それらが同じかどうかを確認し、両方の csv 列を 1 つの csv に出力します。

これらのファイルをハッシュに読み込んでみました。そして、私のコードは今このように見えます。キーが両方のハッシュで等しいことがわかったときに、出力 csv を書き込む方法に行き詰まっています。

my %hash1;
while (my $line = <file1> ) {
    $line =~ s/\s*\z//;
    my @array = split /,/, $line;
    my $key = shift @array;
    $hash1{$key} = \@array;
}
my %hash2;
while (my $line1 = <file2> ) {
    $line1 =~ s/\s*\z//;
    my @array1 = split /,/, $line1;
    my $key1 = shift @array1;
    $hash2{$key1} = \@array1;
}
while (my ($k,$v)=each %hash1){
    for ( keys %hash1 ) {
        unless ( !exists $hash2{$_} ) {
            print "$_: found in second hash\n";
            next;
        }
        print "$k $v\n"
    }
}

この例では、出力 csv には次のものが必要です。

gt1/sd2    34      3    gt1/sd2    9    6
gt1/sd3    67      4    NotFound NotFound NotFound
gt1/sd4    20     -9  NotFound   NotFound NotFound
4

1 に答える 1

4

Text::CSVCSVファイルの解析に使用することをお勧めします。

#!/usr/bin/env perl

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new( { allow_whitespace => 1, sep_char => "\t" } );

open my $fh1, '<', 'file1' or die "Error opening file: $!";
open my $fh2, '<', 'file2' or die "Error opening file: $!";

my %key;
while ( my $row = $csv->getline($fh2) ) {
    $key{ $row->[0] } = [ $row->[1], $row->[2] ];
}

while ( my $row = $csv->getline($fh1) ) {
    my $gt = $row->[0];
    my @columns;
    if ( exists $key{$gt} ) {
        @columns = ( @$row, $gt, @{ $key{$gt} } );
    }
    else {
        @columns = ( @$row, ('Not Found') x 3 );
    }
    printf "%-10s\t%d\t%d\t%-10s\t%-10s\t%s\n", @columns;
}

出力:

gt1/sd2         34      3       gt1/sd2         9               6
gt1/sd3         67      4       Not Found       Not Found       Not Found
gt1/sd4         20      -9      Not Found       Not Found       Not Found
于 2012-11-17T08:38:48.283 に答える