Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用相同的模式perl拆分大文件并写入单个记录?_Perl_Split_Pattern Matching - Fatal编程技术网

如何使用相同的模式perl拆分大文件并写入单个记录?

如何使用相同的模式perl拆分大文件并写入单个记录?,perl,split,pattern-matching,Perl,Split,Pattern Matching,我有一个多GB的文件,由数千个基于ID的单独文件组成 每个组件文件由四个注释行组成,后跟内容。每一秒的注释行都有一个唯一的ID。我想将文件拆分为按ID命名的单个文件 还有第二个大小列表,包含ID和大小。我想把这一行作为每个输出文件的第一行先写 例子 尺码表 A_1100 Bxx_xx 25 P_b 342 1A_Z0 343 Z867200 BWS 111 输入文件 #版本XX #查询:A_1 #数据库:XX #用法:XX A_1* A_1* A_1* A_1* A_1* #弗尔 #查询:Bx

我有一个多GB的文件,由数千个基于ID的单独文件组成

每个组件文件由四个注释行组成,后跟内容。每一秒的注释行都有一个唯一的ID。我想将文件拆分为按ID命名的单个文件

还有第二个
大小列表
,包含ID和大小。我想把这一行作为每个输出文件的第一行先写

例子

尺码表
A_1100
Bxx_xx 25
P_b 342
1A_Z0 343
Z867200
BWS 111
输入文件
#版本XX
#查询:A_1
#数据库:XX
#用法:XX
A_1*
A_1*
A_1*
A_1*
A_1*
#弗尔
#查询:Bxx_xx
#数据库:XXXXXX
#用法:XXXXX
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
#弗尔
#查询:P_b
#数据库:XXXXXX
#用法:XXXXX
P_b*
P_b*
P_b*
P_b*
P_b*
P_b*
#弗尔
#查询:1A_Z0
#数据库:XXXXXX
#用法:XXXXX
1A_Z0*
1A_Z0*
1A_Z0*
1A_Z0*
#弗尔
#查询:Z867
#数据库:XXXXXX
#用法:XXXXX
#弗尔
#查询:BWS
#数据库:XXXXXX
#用法:XXXXX
BWS*
BWS*
BWS*
输出应如下所示(ID.txt)

A_1.txt
A_1100
#XX版
#查询:A_1
#数据库:XX
#用法:XX
A_1*
A_1*
A_1*
A_1*
A_1*
Bxx_xx.txt
Bxx_xx 25
#弗尔
#查询:Bxx_xx
#数据库:XXXXXX
#用法:XXXXX
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
Bxx_xx*
P_b.txt
P_b 342
#弗尔
#查询:P_b
#数据库:XXXXXX
#用法:XXXXX
P_b*
P_b*
P_b*
P_b*
P_b*
P_b*
1A_Z0.txt
1A_Z0 343
#弗尔
#查询:1A_Z0
#数据库:XXXXXX
#用法:XXXXX
1A_Z0*
1A_Z0*
1A_Z0*
1A_Z0*
Z867.txt
z867200
#弗尔
#查询:Z867
#数据库:XXXXXX
#用法:XXXXX
BWS.txt
BWS 200
#弗尔
#查询:BWS
#数据库:XXXXXX
#用法:XXXXX
BWS*
BWS*
BWS*
在某些情况下,四行之后可能没有内容。例如

#版本
#查询:Z867
#数据库:XXXXXX
#用法:XXXXX
我仍然希望它们作为新文件,
Z867.txt

我的代码如下

while($line=){
chomp$行;
$cpline=$line;
下一个if($cpline=~/^Query/);
如果($cpline=~/^\sQuery\:\s(\w.*)/){
$query=$1;
foreach$sizeLine(@sizeList){
$sizeLine=~/^(\w.*)\t(\d+)$/;
$seqId=$1;
$seqLen=$2;
如果($seqId eq$query){
打印“查询\t$seqLen\n”;
}
}
}
$cpline=“”;
如果($line=~/^#/){
打印“$line\n”;
}
如果($line!~/^#/){
如果($line=~/^((.+)\\\.+)\t((.+)\\.+)\t(+)\t++\t++\t++\t++\t++\t++\t++\t++\t++\t++\t?++$/){
$queryId=$1;
如果($seqId eq$queryId){
打印“$line\n”;
}
}
}
}
代码:

use strict;
use warnings 'all';

my $filename = "t1";#provide your input file name
open FH, $filename or die "Error\n";
my $prev_line;
while(my $line =<FH>)
{
        chomp($line);
        if($line =~ /#\sver/)
        {
                if($. != 1)
                {
                        close(FH2);
                }
                $prev_line =$line;
        }
        elsif($line =~ /#\sQuery:(.*)/)
        {
                my $id =$1;
                $id =~ s/\s//;
                print "$id\n";
                open FH2,">$id.txt" or die "Error";
                print FH2 "$prev_line\n$line\n";

        }
        else
        {
                print FH2 "$line\n";
        }

}
close(FH);
使用严格;
使用“全部”警告;
我的$filename=“t1”#提供您的输入文件名
打开FH、$filename或死“Error\n”;
我的$prev_行;
while(我的$line=)
{
chomp($line);
如果($line=~/\sver/)
{
如果($!=1)
{
关闭(FH2);
}
$prev_line=$line;
}
elsif($line=~/\sQuery:(.*)/)
{
my$id=$1;
$id=~s/\s/;
打印“$id\n”;
打开FH2,“>$id.txt”或“错误”;
打印FH2“$prev\u line\n$line\n”;
}
其他的
{
打印FH2“$line\n”;
}
}
关闭(FH);

希望这能对您有所帮助。

我对您的问题感到困惑,因为您的Perl代码似乎做了一些与您的问题描述非常不同的事情。但是,这里有一个简单的解决方案,它可以为注释中的每一个
#查询:
行打开一个新文件,并生成所需的输出

此程序希望输入文件的路径作为命令行上的参数

使用严格;
使用“全部”警告;
使用自动模具;
我的$out\u fh;
我的@header;
而(){
如果(/^#/){
推送@标题,$\;
如果(/Query:\s*(\s+/){
my$file=“$1.txt”;
打印qq{正在创建“$file”\n};
打开$out_fh,'>',$file;
}
如果(@header==4){
打印$out_fh@标题;
@标题=();
}
}
elsif($out_fh){
打印$out\u fh$\u;
}
}
关闭$OFH;
输出
创建“A_1.txt”
创建“Bxx_xx.txt”
创建“P_b.txt”
创建“1A_Z0.txt”
创建“Z867.txt”
创建“BWS.txt”


更新 这是我的代码的新版本,它符合您修订的规范。(请不要这样做。)

使用严格;
使用“全部”警告;
使用自动模具;
@ARGV=qw/4l.txt size_list.txt/;
我的($input,$size_list)=@ARGV;
我的%尺寸;
{
打开我的$fh、、$文件;
打印$out\u fh“$id\t$size\n”;
}
如果(@header==4){
打印$out_fh@标题;
@标题=();
}
}
elsif($out_fh){
打印$out\u fh$\u;
}
}
如果$out\u fh,则关闭$out\u fh;

继续,试着自己解决问题,然后在遇到问题时询问问题。你说“我想把它们放在单独的文件中,然后是内容”,所以我编辑了你的问题以反映这一点。但您将其更改为在单个文件中显示所有输出。请问是哪一个?因为这是我第一次来这里,我不知道如何使用所有选项。我是perl和本论坛的初学者。有人能看一下我的代码并更正吗?谢谢。是的,我的编辑不知怎的失败了。但你是对的,博罗丁。我想把它们放到单独的文件中,然后是内容。你的代码似乎与你所问的问题没有什么关系。什么是
@sizeList<