【问题标题】:merge all documents in a folder in particular order and sort the merged output按特定顺序合并文件夹中的所有文档并对合并的输出进行排序
【发布时间】:2014-04-04 01:09:43
【问题描述】:

我不是程序员,我只是安装活动 perl。 我在哪里可以找到执行以下操作的信息。

在一个文件夹中,我有各种 txt 文档, 我想合并前两个并以 stable 方式对结果进行排序 并将其另存为一个名为 : 合并的子文件夹中的新文档。

然后对以下 txt 文档,其他 2 个文档执行相同操作。 这样直到完成所有文件。


目录中的文件如下所示。

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

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

我需要先合并两个,然后是其他的(当时是两个,这样它就不会混合数据)

将两者合并后,合并后的内容如下所示:

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

因为每个文件中的原始顺序例如是英文。

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

谢谢 关于输出名称,可以是任何名称,也可以是与英语或西班牙语相同的名称,表示第一个或第二个文件。

【问题讨论】:

  • 当你说“前两个”等时,要读取的目录是什么顺序?合并前是否对原始文件进行了排序?请给出一些文件名示例,以及您想要的输出文件的名称。是
  • 它们是按字母顺序排序的,这两个文件确实是按行号排序的:第 1 行在行首有一个 1,第 2 行有第 2 行,等等,同样文件2。它们是翻译,一个文件是英文,另一个文件是西班牙文,每一行都对应另一个文件。我将在主帖中详细说明
  • 啊,所以你真的只想交错这两个文件?
  • 是的,如果是这样的话。

标签: perl sorting merge


【解决方案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";
}

【讨论】:

  • 非常感谢,我会试试的,我会告诉你的。
  • 我将脚本保存为merge.pl,并将其添加到文件所在的目录中。双击 pl 文件,因为我使用的是活动 perl 5. 16 .3 但没有发生任何事情。我做错了吗?
  • 您使用的是 Windows 吗?我不知道 ActivePerl 是如何工作的,但这听起来是对的。您是否以这种方式运行其他脚本?你知道如何使用命令行吗?在 Windows 上双击脚本的问题是命令提示符窗口仅在程序运行时短暂闪烁,您没有机会阅读它。
  • C:\Documents and Settings\user\Escritorio\leerme\prueba\m erger.pl 第 17 行的输入文件无效。这些文件名与预期的模式 doc(english).txt 不匹配。 txt doc(spanish).txt.txt merge.pl subtitle(english).txt.txt subtitle(spanish).txt.txt 我不知道为什么将它标记为 doble .txt.txt 因为我将它保存为 .txt ,是的,我正在使用 xp,并且我正在运行另一个脚本并且它有效。
  • 它首先列出无效文件。它说什么?
猜你喜欢
  • 2023-02-13
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多