2012-04-16 5 views
0

他のファイルに元のファイルのコピーを保存Perlを使用して2つのファイルをマージし、私は私が欲しいA.ini私はA.iniとB.iniなどのファイルを持っている

examples of files: 
A.ini:: 

a=123 
b=xyx 
c=434 

B.ini contains: 
a=abc 
m=shank 
n=paul 

my output in files A.ini should be like 

a=123abc 
b=xyx 
c=434 
m=shank 
n=paul 

内のファイルの両方をマージしたいですこの合併にperlの言語で行われ、私は

+2

が親切に問題を投稿する前にあなたの努力を入れて... – Anil

答えて

0

方法についての古いコピーを使用する他のいくつかの場所で、古いA.iniファイルのコピーを保存しておきたいことがします

#!/usr/bin/perl 
use strict; 
use warnings; 

my %out; 
my $file = 'path/to/A.ini'; 
open my $fh, '<', $file or die "unable to open '$file' for reading: $!"; 
while(<$fh>) { 
    chomp; 
    my ($key, $val) = split /=/; 
    $out{$key} = $val; 
} 
close $fh; 

$file = 'path/to/B.ini'; 
open my $fh, '<', $file or die "unable to open '$file' for reading: $!"; 
while(<$fh>) { 
    chomp; 
    my ($key, $val) = split /=/; 
    if (exists $out{$key}) { 
     $out{$key} .= $val; 
    } else { 
     $out{$key} = $val; 
    } 
} 
close $fh; 

$file = 'path/to/A.ini'; 
open my $fh, '>', $file or die "unable to open '$file' for writing: $!"; 
foreach(keys %out) { 
    print $fh $_,'=',$out{$_},"\n"; 
} 
close $fh; 
1

コマンドライン変種:

perl -lne ' 
($a, $b) = split /=/; 
$v{$a} = $v{$a} ? $v{$a} . $b : $_; 
END { 
    print $v{$_} for sort keys %v 
}' A.ini B.ini >NEW.ini 
+0

+は未テスト –

0

マージする2つのファイルは、1回のパスで読み込むことができ、別々のソースファイルとして扱う必要はありません。これにより、<>を使用して、コマンドラインでパラメータとして渡されたすべてのファイルを読み取ることができます。

A.iniのバックアップコピーを保存することは、マージされたデータを同じ名前の新しいファイルに書き込む前に名前を変更するだけです。

このプログラムは、必要な処理を行っているようです。 (A.ini中)

use strict; 
use warnings; 

my $file_a = $ARGV[0]; 

my (@keys, %values); 

while (<>) { 
    if (/\A\s*(.+?)\s*=\s*(.+?)\s*\z/) { 
    push @keys, $1 unless exists $values{$1}; 
    $values{$1} .= $2; 
    } 
} 

rename $file_a, "$file_a.bak" or die qq(Unable to rename "$file_a": $!); 
open my $fh, '>', $file_a or die qq(Unable to open "$file_a" for output: $!); 
printf $fh "%s=%s\n", $_, $values{$_} for @keys; 

出力

a=123abc 
b=xyx 
c=434 
m=shank 
n=paul 
+0

に答える1.wow.great ...またはあなたが使用されるだろう<>のstdinではなくreadの$ file_a。あなたの正規表現はなぜとても複雑ですか?なぜちょうど$ 1と$ 2をchompしないのですか? \ zも\ zでなければなりません。正規表現のためにも多くのバックトラックが発生します。一致、[^ =]する必要があります。出力キーの順序もAとBの順序に依存しますが、これは明示的ではありません。すべてのファイル全体を読み込む際には、マスター用の大きなファイルに対しても復元力がありません。それでも、かなりコンパクトです。 –

+0

@PhilH:私は自分のコードをテストしましたが、私はあなたのコメントのほとんどを理解していません。 '@> ARGVが空でない限り、' <> 'は' ARGV'から読み込みます。 '$ 1'と' $ 2'を 'chompすることはできません。そして、とにかく最後から改行だけが削除されます。 '\ z' *は' \ z'ではなく '\ z'でなければなりません。私はこの長い文字列のバックトラックについては気にしません。変更されるファイルが* first *パラメータであることはコードから明らかです。 GBサイズのiniファイルは期待していません。 – Borodin

関連する問題