2014-04-04 101 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