【发布时间】:2019-08-02 19:45:47
【问题描述】:
我有一个包含多个报告的文本文件。每个报告都以文字“报告 ID”开头,并具有特定值,即 ABCD。 对于简单的情况,我只想提取那些具有 ABCD 值的报告的数据。并且为了复杂性,我只想提取那些 TAG1 值(第 2 行)为 1000375351 且报告值与 ABCD 相同的报告的数据。
我已经用传统方式完成了。我的 decideAndExtract(String line) 函数具有所需的逻辑。但是如何使用 Java 9 流的 takeWhile 和 dropWhile 方法来有效地处理呢?
try (Stream<String> lines = Files.lines(filePath)) {
lines.forEach(this::decideAndExtract);
}
示例文本文件数据:
REPORT ID: ABCD
TAG1: 1000375351 PR
DATA1: 7399910002 T
DATA2: 4754400002 B
DATA3 : 1000640
Some Lines Here
REPORT ID: WXYZ
TAG1: 1000375351 PR
DATA1: 7399910002 T
DATA2: 4754400002 B
DATA3 : 1000640
Some Lines Here
REPORT ID: ABCD
TAG1: 1000375351 PR
DATA1: 7399910002 T
DATA2: 4754400002 B
DATA3 : 1000640
Some Lines Here
【问题讨论】:
-
我会将文件拆分为多个部分(使用正则表达式匹配“REPORT ID”分隔符),然后使用简单的
filter仅处理您感兴趣的那些元素。跨度> -
REPORT ID: ABCD TAG1: 1000375351 PR DATA1: 7399910002 T DATA2: 4754400002 B DATA3 : 1000640不值得归类为实体。 (当然需要对字符串进行一些解析)? -
其他行是什么?会不会有 TAG2 后跟 DATA1 和 DATA2,然后 TAG3 后跟 DATA1 和 DATA2.... 提供一个通用的解决方案很重要。
-
流有两个主要优点。 1) 将中间数据结构简化为容器,以及 2) 用语句表达解决方案。除非您正在创建大量中间数据结构(例如列表和地图),否则我怀疑流方法会更有效。简单地读取文件并进行条件处理可能是最好的方法。这基本上就是流所做的,但需要更多开销来允许更通用的解决方案。
-
@WJS 从
REPORT到DATA3结构是不变的。但是,TAG1 和DATA3 的位置可以互换。 DATA3之后有一些随机的行。
标签: java java-stream java-9