文本跨越多行时逐行读取

时间:2015-10-26 19:12:20

标签: regex perl

我在将记录#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;

1 个答案:

答案 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解析器可以处理多行记录没问题)。