2015-01-26 77 views
1

我有一个大文件(可以说文件A),我想从它中取出某些数据行。 一个示例条目如下所示。它始终是10点数据,条目长度为5-6个字母数字字符,并以a结尾。一条线可以有多个条目,但是\W+覆盖了它们之间的空间。匹配和打印perl文件

.... 
.... 
LookupReferences: { 
    12V0E: 
    24983: 
    384KJ: 
    48743X: 
    52V0E: 
    64983: 
    784KJ: 
    88743X: 
    94983: 
    1084KJ: 
} 

我希望看起来像下面的条目,我可以加载其他地方。

References,12V0E,24983,384KJ,48743X,52V0E,64983,784KJ,88743X,94983,1084KJ 

我在什么地方阅读有关迫使整个页面到一个数组,但在这里,任何帮助非常感激,因为我一直在瞎搞它并没有真正使用任何perl的10年,因此可以被归类再次作为一个绝对的初学者。

+0

*“大文件”*有多大?闭合大括号总是出现在一条线上?除了'LookupReferences'块以外,还有其他文件吗? – Borodin 2015-01-26 20:14:51

+0

它大约有12-15,000行,不像100万以上那么大,但足够大。有可能的特殊字符,有时候右括号在同一行。 另外..在最后的数据要求是关键,因为我想打印整个行到另一个变量的末尾,对于每个条目,所以理想情况下,我只是将每个分组添加到当前变量。 因此,例如。 $ data =“测试结果ABC” 会变成。 $ data =“测试结果ABC,参考文献,12V0E,24983,384KJ,48743X,52V0E,64983,784KJ,88743X,94983,1084KJ”; – 2015-01-27 12:28:27

回答

1

我很喜欢这个工作的范围操作员。

E.g.

while (<$file_handle>) { 
    if (m/LookupReferences/ .. /\}/) { 
      print; 
    } 
} 

(而不是print可能要处理和串联或以其他方式推入阵列)。

我并不热衷于将整个文件强制放入数组中,因为当您查看较大的文件时效率不高。

但是,如果你想这样做,它是那样简单:

my @file = <$filehandle>; 

从评论继:当你正在尝试重新格式化,你可以这样做:

my @references; 
while (<$file_handle>) { 
    if (m/LookupReferences/ .. /\}/) { 
      my ($value) = (m/\s*(\w+):/); 
      if (defined $value) { push (@references, $value) }; 
    } 
} 

print join (",", "References", @references),"\n"; 
+0

非常感谢您让我获得的数据非常好,但它保留了stanza格式,而不是我需要的格式。 – 2015-01-27 12:24:19

+0

用类似于诀窍的例子进行编辑。 – Sobrique 2015-01-27 18:38:08