我在将记录#SWCR000173解析为@fieldValues时遇到问题,因为它跨越了多行。在我的生产数据集中经常会出现此问题。我知道我一次只能阅读一行。我正在试图找出我的选择,并做了一堆stackoverflow和谷歌研究。我想我可以尝试在一行的末尾找到一个回车符,然后我推送到数组并与下一行连接。但可能有一个我不知道的更清洁的答案。是否可以查看我的代码和数据集?非常感谢你提前。
数据集示例:
<record>SWCR000171</record><Title>Example Single Line Title 1</Title>
<record>SWCR000172</record><Title>Example Single Line Title 2</Title>
<record>SWCR000173</record><Title>Example Multiple
Line Title 1</Title>
<record>SWCR000174</record><Title>Example Single Line Title 3</Title>
Perl代码:
open ($inFile, '<', $inputFile) or die $!;
while ($inFileLine = <$inFile>) {
#Create an array of fieldnames from the line being processed
@fieldNames = $inFileLine =~ m(<\/(.*?)>)g;
#Create an array of data values from the line being processed
@fieldValues = $inFileLine =~ m(>([^<]+)<)g;
#Populate a variable with the record number for the line being processed
$dbid = @fieldValues[1];
#Submit data to database for all fields after the dbid (elements>1)
$entity = $session->GetEntityByDbId("SWCR",$dbid);
$entity->EditEntity("AdminModify");
$entity->SetFieldValue($fieldNames[$_],$fieldValues[$_]) for (2 .. $#fieldNames);
$entity->SetFieldValue("AdminModifyReason",$inputFile);
$entity->Validate();
$commit = $entity->Commit();
}
close $inFile;
答案 0 :(得分:0)
听起来像是破纪录的风险 - 它看起来像XML但不是,它将以与您在评论中看到的完全相同的方式绊倒未来的维护程序员。
更糟糕的是 - 它是使用换行符的任意分隔格式 - 结果变得越来越难以解析。
鉴于你所拥有的 - 你的问题是while循环。默认情况下,while ( <$fh> ) {
一次读取一行。
您确实需要一个独特的记录分隔符 - 如果您的数据包含换行符,则换行符不是。
根据您的数据,我建议您最好将分隔线设置为</Title>
E.g;
local $/ = '</Title>';
然后你的while循环将读取多行直到它到达那个结束标记。这纯粹基于以下假设: - 不是XML - 记录排序是一致的。否则你将不得不做类似的事情:
#linefeed delim
my $buffer;
while ( my $line = <$fh> ) {
$buffer .= $line;
if ( $line =~ m/>$/ ) {
## do processing, because the line ends in a tag
#empty buffer
$buffer = "";
}
}
但严重的是 - 做这样的假XML仍然是一个非常糟糕的主意,这也是另一个原因。 (XML解析器可以处理多行记录没问题)。