Xml 将文本文件分为若干个小文件

Xml 将文本文件分为若干个小文件,xml,perl,Xml,Perl,我必须将一个大约600MB的文本文件分解为许多较小的文件,每个文件都有一个唯一的名称 在主文件中,我有一个标签(比如name),它在整个文件中重复出现。我必须制作一组六个标签,并将它们放在更小的文本文件中 代码:我无法生成多个测试文件,因为我的代码不正确 $flag = 0; $flag1 = 0; open( OUTPUT, "> Break$flag1.txt" ) or die "error open output file: $!\n"; foreach $iis_file

我必须将一个大约600MB的文本文件分解为许多较小的文件,每个文件都有一个唯一的名称

在主文件中,我有一个标签(比如
name
),它在整个文件中重复出现。我必须制作一组六个标签,并将它们放在更小的文本文件中

代码:我无法生成多个测试文件,因为我的代码不正确

$flag  = 0;
$flag1 = 0;

open( OUTPUT, "> Break$flag1.txt" ) or die "error open output file: $!\n";

foreach $iis_file ( <file_Name.txt> ) {

    #printf OUTPUT "Processing file: %s\n", $iis_file;

    open( INFILE, $iis_file ) or die "Can't open $file: $!";

    while ( <INFILE> ) {

        if ( /^<Name(.*)<\/Name>/i ) {

            $flag = $flag + 1;

            if ( $flag <= 6 ) {
                printf OUTPUT "<Name$1<\/Name>\n<\/Name>\n";
            }
        }
    }

    close INFILE;
}
$flag=0;
$flag1=0;
打开(输出“>Break$flag1.txt”)或死“错误打开输出文件:$!\n”;
foreach$iis\u文件(){
#printf输出“处理文件:%s\n”,$iis\u文件;
打开(内嵌,$iis_文件)或死亡“无法打开$file:$!”;
而(){

如果(/^代码中有许多内容完全不正确

下面是我如何写的:

#!/usr/bin/perl

# Split a large file into files named by the latest <Name>...</Name> tag read.

use strict;

my $infile = $ARGV[0];
my $outprefix = $ARGV[1];

die("USAGE: $0 inputfile.xml out-prefix-") unless $outprefix;

my $name = "noname"; # current name to add to $outprefix
my $infh; # input file handle
my $outfh; # output file handle
my $line; # line being read

die("Cannot open input file \"$infile\" : $!")
    unless open($infh, "<$infile");

while( defined($line=<$infh>) ){

    if( $line =~ m!^<Name>([^<>]+)</Name>!i ){
        $name = lc($1);
        $name =~ s/[^\w.]+/-/g;
        $name =~ s/^-//;
        $name =~ s/-$//;
        $name = "noname" unless $name;

        # Close output of previous name :
        if( $outfh ){
            close($outfh);
            undef $outfh;
        }
    }

    unless( $outfh ){
        die("Cannot open output file \"$outprefix$name\" : $!")
            unless open($outfh, ">>$outprefix$name");
        print("Now writing to $outprefix$name ...\n");
    }

    print($outfh $line);

}

close($outfh) if $outfh;
close($infh);

print("DONE.\n");
!/usr/bin/perl
#将大文件拆分为以最新…标记读取命名的文件。
严格使用;
my$infle=$ARGV[0];
my$outprefix=$ARGV[1];
die(“用法:$0 inputfile.xml out prefix-”),除非$outprefix;
my$name=“noname”#要添加到$outprefix的当前名称
我的$infh;#输入文件句柄
我的$outph;#输出文件句柄
正在阅读我的$line;#行
模具(“无法打开输入文件\“$infle\”:$!”)
除非打开($infh,“>$outprefix$name”);
打印(“正在写入$outprefix$name…\n”);
}
打印($outph$行);
}
如果$outph,则关闭($outph);
关闭($infh);
打印(“完成”。\n”);

别忘了,我们不知道第一个标记之前的文件名,所以如果您想包含之前的内容(换句话说,在前面拆分)您必须先将这些行缓冲在变量中,然后再写入它们。

在堆栈溢出问题上,我们希望问题包括您无法使用的代码。如果您没有编写任何代码,那么您是在错误的位置提问。从您的代码看,您似乎正在尝试处理XML数据。有一些特殊的模块用于此。我建议您使用看看。我想当你显示XML文件的(相关部分)时,你会得到更好的答案。@JamieWalton:你从哪里知道OP使用UTF-16?我错过了什么?!@simbabque:
infle
while
之前的语句中被打开,我认为
应该是一个glob.
while(定义($line=){…}
通常写入
,而($line=){…}
@Borodin:这会给初学者带来一个非常坏的习惯,因为有一天在不同的环境中它不会起作用。我不同意。我很少看到
定义的
测试是在
的同时进行的,但是我的学生十五年来都没有遇到过这个问题。你的同事还有很多其他的特点de:不使用
警告
;在程序顶部声明所有变量;使用
死亡
…除非
打开
,而不是通常的习惯用法
打开
或死亡
;以及
取消定义$outph
而不是
$outph=undeff
。我认为其中任何一个都比省略定义的
测试。@Borodin:用perl(特别是perl)编写代码的方法有一百万种如果我写这篇文章不适合你,因为我不是自由职业者,我写这篇文章的唯一原因是为了帮助别人,我没有什么要宣传的,所以把你生活中的挫折放在锻炼中,例如,与其点击一个拇指向下的按钮,这只会扼杀志愿活动。或者如果你真的想用这种方式使用互联网,至少把你的真实想法放在上面我和照片。