2012-04-16 222 views
0

我要像A.ini和B.ini文件合并两个文件,我想在A.ini用perl保留原始文件的副本在其他文件

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文件的副本,在其它地方使用旧版本

+2

请把你的精力发布问题之前... – Anil 2012-04-16 12:34:39

回答

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; 
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

+ 1.wow.great答案 – 2012-04-16 13:45:06

0

要合并的两个文件可以一次读取,不需要被视为单独的源文件。这允许使用<>读取在命令行上作为参数传递的所有文件。

保留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 
+0

未测试...或者你会使用$ file_a用于读取而不是<>上的stdin。为什么你的正则表达式如此复杂?为什么不只是chomp $ 1和$ 2?另外\ z应该是\ Z。正则表达式也会由于这个原因而回溯很多。匹配,应该是[^ =]。输出键顺序还取决于A和B的输入顺序,但这并不明确。在阅读所有文件时,它对主文件的大文件也不具有弹性。仍然很紧凑。 – 2012-04-16 13:24:50

+0

@PhilH:我测试了我的代码,我不明白你的大部分评论。只要'@ ARGV'不是空的,'<>'从'ARGV'中读取,所以它工作正常;你不能'chomp''$ 1'和'$ 2',无论如何它只会从最后删除换行符; '\ z' *应该*为'\ z',而不是'\ Z';我不在乎这些东西回溯到弦乐中;代码很清楚要修改的文件是* first *参数;我不期望GB大小的ini文件。 – Borodin 2012-04-16 18:23:24

相关问题