【问题标题】:Matching and printing perl files匹配和打印 perl 文件
【发布时间】:2015-01-28 02:37:48
【问题描述】:

我有一个大文件(比如说文件 A),我想在 perl 中从中提取某些数据行。 一个示例条目如下所示。它始终是 10 个数据点,条目长度为 5-6 个字母数字字符,末尾带有 :。一行可以有多个条目,但\W+ 覆盖了两者之间的空间。

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

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

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

我正在某处阅读有关将整个页面强制转换为数组的内容,但这里的任何帮助都非常感谢,因为我一直在搞乱它并且在 10 年内没有真正使用过任何 perl,因此可以再次归类为绝对初学者。

【问题讨论】:

  • 您的“大文件”到底有多大?右大括号是否总是单独出现在一行上?除了LookupReferences 块之外,文件中还有其他内容吗?
  • 大概12-15,000行,不像一百万+那么大,但足够大了。可能存在特殊字符,有时右大括号在同一行。另外..最后对数据的要求是关键,因为我想将整行打印到另一个变量的末尾,对于每个条目,理想情况下我只需将每个分组添加到当前的末尾多变的。举个例子。 $data = "测试结果 ABC" 将变为。 $data = "测试结果 ABC,References,12V0E,24983,384KJ,48743X,52V0E,64983,784KJ,88743X,94983,1084KJ";

标签: regex perl


【解决方案1】:

我非常喜欢这个工作的范围运算符。

例如

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

(而不是print,您可能想要处理和连接或以其他方式推送到数组中)。

我不太热衷于将整个文件强制放入一个数组中,因为当您查看较大的文件时它不是很有效。

但如果你想这样做,很简单:

my @file = <$filehandle>; 

从 cmets 开始:当您尝试重新格式化它时,您可以执行以下操作:

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

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

【讨论】:

  • 谢谢你让我得到了很好的数据,但它保留了节格式,而不是我需要的所有条目的格式。
  • 编辑了一些类似的例子,说明可能会起作用。