0

A.ini と B.ini のようなファイルが必要で、両方のファイルを A.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 言語で行いたいのですが、古いコピーを使用するために古い A.ini ファイルのコピーを別の場所に保持したいと考えています。

4

3 に答える 3

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
于 2012-04-16T12:36:14.290 に答える
0

どうですか:

#!/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;
于 2012-04-16T10:32:17.087 に答える
0

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

のバックアップ コピーを保持する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.ini)

a=123abc
b=xyx
c=434
m=shank
n=paul
于 2012-04-16T12:42:03.007 に答える