基于分隔符将一个txt文件拆分为多个txt文件,并使用特定字符命名它们

时间:2017-11-21 02:05:34

标签: perl

我有一个类似于http://www.uniprot.org/uniprot/?sort=score&desc=&compress=no&query=id:P01375%20OR%20id:P04626%20OR%20id:P08238%20OR%20id:P06213&format=txt的文本文件。

此文件包含用//分割的不同条目。我想我几乎找到了如何在出现这种特定模式时将txt文件分成多个txt文件的方法,但我仍然不知道如何在划分后命名它们以及如何在特定目录中打印它们。我希望每个分割的文件都带有特定的ID,这是每个条目中的第一行第二列。

这是我到目前为止写的代码:

mkdir "spliced_files"; #directory where I would like to put all my splitted files
$/="//\n";             # divide them whenever //appears and new line after this
open (IDS, 'example.txt') or die "Cannot open"; #example.txt is an input file
my @ids = <IDS>;
close IDS;
my $entry = 25444; #number of entries or //\n characters
my $i=0;
while ($i eq $entry) {
  print $ids[$i];
};
$i++;

我仍然遇到问题,即每当“// \ n”时,如何从'example.txt'文件中拆分所有条目,并将所有这些分隔的文件打印到目录spliced_files中。此外,我必须使用特定于每个文件或条目的ID(所有这些文件或条目显示在第一行,但只显示第二列)来命名所有这些单独的文件。

所以我希望输出为spliced_files目录中的文件数,并且每个文件都以其ID(第一行,但只有第二列)命名。例如,第一个文件的名称应为TNFA_HUMAN,第二个文件的名称为ERBB2_HUMAN,依旧等等。)

1 个答案:

答案 0 :(得分:3)

你仍然看起来像是通过猜测来编程。并且您还没有使用您在回答之前问题时给出的任何建议。我强烈建议你花一周时间学习一本好的初学者书,比如 Learning Perl ,当你更了解Perl如何工作时,请回来。

但是这里有一些关于你的新代码的评论:

open (IDS, 'example.txt') or die "Cannot open";

您被告知使用词法变量和open()的三个arg版本是一种更好的方法。您还应该在错误消息中包含$!,以便了解出现了什么问题。

open my $ids_fh, '<', 'example.txt'
  or die "Cannot open: $!";

然后稍后(我在while循环中添加了缩进以使事情更清楚)...

my $i=0;
while ($i eq $entry) {
  print $ids[$i];
};
$i++;

第一次进入此循环时,$i为1,$entry为25444.您可以比较它们(作为字符串!您可能需要==,而不是eq)看他们是否平等。显然它们是不同的,所以你的while循环退出。一旦循环退出,你就增加$ i。

此代码与您的问题描述完全没有关系。我不打算给你答案,但这是你需要做的结构:

mkdir "spliced_files";

local $/ = "//\n"; # Always localise changes to special vars

open my $ids_fh, '<', 'example.txt'
  or die "Cannot open: $!";

# No need to read the whole file in one go.
# Process it a line at a time.
while (<$ids_fh>) {
  # Your record (the whole thing, not just the first line) is in $_.
  # You need to extract the ID value from that string. Let's assume
  # you've stored in it $id

  # Open a file with the right name
  open my $out_fh, '>', "spliced_files/$id" or die $!;
  # Print the record to the new file.
  print $out_fh $_;
}

但实际上,在攻击此任务之前,您需要花时间学习编程。或者,如果您没有时间,请付费给程序员为您完成。