2014-04-04 103 views
0

我不是程序员,我只是安装活动的perl。 我在哪里可以找到信息来完成以下操作。以特定顺序合并文件夹中的所有文档并对合并后的输出进行排序

文件夹中

我有不同的TXT文档, 我想合并前两个,结果在稳定方式 进行排序,并将其保存在一个名为子文件夹一个新的文档:合并。

然后对下面的txt文档和其他2个文档做同样的处理。 这种方式直到完成所有文件。


目录中的文件如下所示。

subtitle(english).txt 
subtitle(spanish).txt 
othername1(english).txt 
othername1(spanish).txt 
etc etc 

它们被放置,英文版和下面的西班牙语版本如果按字母顺序排序。

我需要合并两个第一,然后其他人(当时2,所以它不混合数据)合并两个内容合并后

应该是这样的:

1.- <english> hi 
1.- <spanish> hola. 
2.- <english> thanks 
2.- <spanish> gracias 

,因为每个文件的原始顺序都是英文。

1.- <english> hi 
2.- <english> thanks 

感谢 关于输出名称,可能是什么,或者相同的名称为英语或西班牙语,意思是第一或第二个文件。

+0

当你说*“前两个”*等,按照什么顺序是要读取的目录?合并前是否对原始文件进行了排序?请给出一些文件名的例子,以及你想要的输出文件的名称。它们是 – Borodin

+0

他们按字母顺序排序,这两个文件确实排序,他们是与行号:第一行有一个在行的乞讨,第二行有数字2,和儿子,与文件2相同。他们是翻译,在一个文件中是英文,另一个文件是西班牙文,每行对应另一个文件。我会在主帖 – alex

+0

的细节啊,所以你真的只想*交错*两个文件? – Borodin

回答

1

我认为这应该适合你,但我无法轻松测试。

use strict; 
use warnings; 
use autodie; 

my @files = do { 
    opendir my $dh, '.'; 
    sort grep /\.txt\z/, grep -f, readdir $dh; 
}; 

my $re = qr/\A ([^()]+?) \s* \(\s* (.+) \s* \) [^()]+ \z /ix; 

my @badfiles = grep $_ !~ $re, @files; 
if (@badfiles) { 
    print STDERR "These file names do not match the expected pattern\n"; 
    print STDERR " $_\n" for @badfiles; 
    print STDERR "\n"; 
    die "Invalid input files"; 
} 

mkdir 'merged' unless -d 'merged'; 

while (@files > 1) { 

    my @files = splice @files, 0, 2; 
    my @fh = map { open my $fh, '<', $_; $fh } @files; 
    my @details = map [ $_ =~ $re ], @files; 
    my $newfile = sprintf "merged/%s(%s-%s).txt", 
     $details[0][0], 
     $details[0][1], 
     $details[1][1]; 

    printf "%s + %s => %s ... ", @files, $newfile; 

    open my $out_fh, '>', $newfile; 
    until (grep eof, @fh) { 
    print $out_fh scalar readline $_ for @fh; 
    } 
    close $out_fh; 

    print "done\n"; 
} 
+0

非常感谢,我会试试看,我会告诉你。 – alex

+0

我将脚本另存为merger.pl,并将其添加到文件所在的目录中。 doble点击pl文件,因为我使用的是主动perl 5. 16 .3,但没有发生任何事情。难道我做错了什么? – alex

+0

你使用的是Windows吗?我不知道ActivePerl是如何工作的,但这听起来不错。你是否以这种方式运行其他脚本?你知道如何使用命令行吗?在Windows上双击脚本的问题是,程序运行时命令提示符窗口只会短暂闪烁,而您没有机会阅读它。 – Borodin