gpt4 book ai didi

java - 解析制表符分隔文件的策略

转载 作者:行者123 更新时间:2023-11-30 07:09:58 25 4
gpt4 key购买 nike

在 Java 中解析制表符分隔文件的最原始方法是什么,这样表格数据就不会丢失结构?我正在寻找一种方法来使用 Bean 或 Jsoup,因为它们对我来说并不熟悉,初学者。我需要关于它背后的逻辑是什么以及这样做的有效方法的建议,例如,如果我有一个像

ID reference | Identifier    | Type 1| Type 2  | Type 3 |
1 | red#01 | 15% | 20% | 10% |
2 | yellow#08 | 13% | 20% | 10% |

更正:在此示例中,我有类型 1 - 3,但我的问题适用于 N 种类型。

我是否可以只使用数组来实现表解析,或者 Java 中是否有更适合此任务的不同数据结构?我认为我应该这样做:

  1. 扫描/读取 "\t" 处的第一行拆分并创建一个字符串数组。
  2. 将该数组拆分为每个子数组 1 个表标题的子数组
  3. 然后,开始读取表格的下一行,并为每个子数组添加列中的相应值。

这个计划听起来正确还是我把事情复杂化了/完全错了?有更简单的方法吗? (假设我仍然不知道如何将数组拆分为子数组以及如何使用表中的值填充子数组)

最佳答案

强烈建议您为此使用读取平面文件解析库,例如出色的 OpenCSV .

做不到这一点,这是 Java 8 中的解决方案。

首先,创建一个类来表示您的数据:

static class Bean {

private final int id;
private final String name;
private final List<Integer> types;

public Bean(int id, String name, List<Integer> types) {
this.id = id;
this.name = name;
this.types = types;
}

//getters

}

您使用各种列表的建议非常基于脚本。 Java 是面向对象的,因此您应该利用它来发挥自己的优势。

现在我们只需要解析文件:

public static void main(final String[] args) throws Exception {
final Path path = Paths.get("path", "to", "file.tsv");
final List<Bean> parsed;
try (final Stream<String> lines = Files.lines(path)) {
parsed = lines.skip(1).map(line -> line.split("\\s*\\|\\s*")).map(line -> {
final int id = Integer.parseInt(line[0]);
final String name = line[1];
final List<Integer> types = Arrays.stream(line).
skip(2).map(t -> Integer.parseInt(t.replaceAll("\\D", ""))).
collect(Collectors.toList());
return new Bean(id, name, types);
}).collect(Collectors.toList());
}
}

本质上,代码会跳过第一行,然后循环遍历文件中的每一行:

  1. 在分隔符上拆分行 - 似乎是 | .这需要正则表达式,所以你需要转义管道,因为它是一个特殊字符。我们还使用分隔符之前/之后的所有空格。
  2. 创建 new Bean通过解析数组元素为每一行。
  3. 首先将 id 解析为 int
  4. 接下来得到名字
  5. 最后得到一个Stream的行,跳过前两个元素,并将剩余的解析为 List<Integer>

关于java - 解析制表符分隔文件的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com