Xml 将文本文件分为若干个小文件
我必须将一个大约600MB的文本文件分解为许多较小的文件,每个文件都有一个唯一的名称 在主文件中,我有一个标签(比如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
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)编写代码的方法有一百万种如果我写这篇文章不适合你,因为我不是自由职业者,我写这篇文章的唯一原因是为了帮助别人,我没有什么要宣传的,所以把你生活中的挫折放在锻炼中,例如,与其点击一个拇指向下的按钮,这只会扼杀志愿活动。或者如果你真的想用这种方式使用互联网,至少把你的真实想法放在上面我和照片。