我试图将一大块文本中的特定变量放入单个数组中,例如原始数据:
dataset1
<Time>08/30/2016 00:08:44.568</Time>
<Tag>01234/<Tag>
<Runs>2</Runs>
<ID>A0 04 78 C1 02</ID>
<Count>4</Count>
<Kind>134</Kind>
enddataset1
dataset2
<Time>08/30/2016 00:08:34.568</Time>
<Tag>12345</Tag>
<Runs>3</Runs>
<ID>A0 04 78 C1 02</ID>
<Count>1</Count>
<Kind>140</Kind>
enddataset2
我想把它放到一个数组中
08/30/2016 00:08:44.568 \t 01234 \t 2 \t A0 04 78 C1 02 \t 4 \t 134
08/30/2016 00.08:34.568 \t 12345 \t 3 \t A0 04 78 C1 02 \t 1 \t 140
描述符(即时间,标签,运行等)是不变的,它们之间的值是可变的。
有关如何从内部拉动的知识吗?
答案 0 :(得分:0)
如果您正在寻找快速而肮脏的解决方案,您可以执行以下操作:
while ($s=~/dataset\d*\s*(.*?)\s*end ?dataset\d*/gs) {
my $r=$1;
my @a=$r=~m{<\w+>(.*?)</\w+>}g;
print join("\t",@a),"\n";
}
代码假定所有输入都存储在变量$s
中(即在内存中)。您的格式略显不合适(例如enddataset1
vs end dataset
),因此您可能需要稍微调整一下我的正则表达式。
答案 1 :(得分:0)
如果您的数据一致。这将有效。
use strict;
use warnings;
open(my $in,"<",$ARGV[0]) or die "File $ARGV[0] open error:$!\n";
my @in = <$in>;
close($in);
foreach my $in(@in) {
chomp($in);
if($in=~/enddataset/) {
print "\n";
}
elsif($in=~/dataset/) {
#do nothing
}
elsif ($in=~/<.*>(.*)<\/.*>/) { #get data between tags
print "$1\t";
}
}
答案 2 :(得分:0)
我不鼓励这些类型的编码,除非暂时解决。
use strict;
use warnings;
my $inputfile = "input.txt";
open(IN, $inputfile) || die "Couldn't read..: $!..\n";
local $/; $_ = <IN>; my $temp = $_;
close(IN);
my @arrays = (); my $joinVals = "";
while($temp=~m/dataset(\d+)((?:(?!enddataset\1).)*)enddataset\1/sg)
{
my $tags = $&;
$tags=~s/<([a-z0-9\-\_]*)>((?:(?!<\/\1>).)*)<\/\1>/ $joinVals .= "$2\t"; ($&);/ieg;
$joinVals .= "\n";
}
my @storearr = split /\n/i, $joinVals;
print join "\n", @storearr;
可能有人可以简化以上编码。