Java 一种解析制表符分隔文件的策略
在Java中,解析制表符分隔文件的最原始方法是什么,这样表格数据就不会丢失结构?我不是在寻找一种使用Bean或Jsoup的方法,因为它们对我来说并不熟悉,是一个初学者。我需要关于它背后的逻辑和高效的方法的建议,例如,如果我有一张像Java 一种解析制表符分隔文件的策略,java,arrays,parsing,text-files,Java,Arrays,Parsing,Text Files,在Java中,解析制表符分隔文件的最原始方法是什么,这样表格数据就不会丢失结构?我不是在寻找一种使用Bean或Jsoup的方法,因为它们对我来说并不熟悉,是一个初学者。我需要关于它背后的逻辑和高效的方法的建议,例如,如果我有一张像 ID reference | Identifier | Type 1| Type 2 | Type 3 | 1 | red#01 | 15% | 20% | 10% | 2 | yel
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中是否有一种更适合此任务的不同数据结构?我认为我应该这样做:
“\t”
处的第一行拆分,并创建一个字符串数组这个计划听起来是对的还是我把事情复杂化了/完全错了?有更简单的方法吗?(假设我仍然不知道如何将阵列拆分为子阵列,以及如何使用表中的值填充子阵列)我建议使用Apache Commons CSV包,如主页上所述:我建议使用Apache Commons CSV包,如主页所述:我会使用番石榴的拆分器和表格:
我会用番石榴的切碎器和桌子:
我强烈建议您为此使用read flat file解析库,如优秀的 如果做不到这一点,下面是Java8中的一个解决方案 首先,创建一个类来表示您的数据:
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
}
静态类Bean{
私有最终int id;
私有最终字符串名;
私有最终列表类型;
公共Bean(int-id、字符串名称、列表类型){
this.id=id;
this.name=名称;
this.types=类型;
}
//吸气剂
}
您关于使用各种列表的建议是基于脚本编写的。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());
}
}
publicstaticvoidmain(最终字符串[]args)引发异常{
最终路径路径=Path.get(“Path”、“to”、“file.tsv”);
解析的最终列表;
try(最终流行=Files.lines(路径)){
parsed=lines.skip(1).map(line->line.split(“\\s*\\\\\\\\\\s*”).map(line->{
final int id=Integer.parseInt(第[0]行);
最终字符串名称=行[1];
最终列表类型=Arrays.stream(行)。
跳过(2).map(t->Integer.parseInt(t.replaceAll(“\\D”,”))。
collect(Collectors.toList());
返回新Bean(id、名称、类型);
}).collect(Collectors.toList());
}
}
本质上,代码跳过第一行,然后在文件中的行上循环,每行:
|
。这需要正则表达式,因此需要转义管道,因为它是一个特殊字符。此外,我们还使用分隔符之前/之后的任何空格新Bean
int
流
,跳过前两个元素,并将其余元素解析为列表
我将强烈地建议您为此使用一个read flat file解析库,比如优秀的 如果做不到这一点,下面是Java8中的一个解决方案 首先,创建一个类来表示您的数据:
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
}
静态类Bean{
私有最终int id;
私有最终字符串名;
私有最终列表类型;
公共Bean(int-id、字符串名称、列表类型){
this.id=id;
this.name=名称;
this.types=类型;
}
//吸气剂
}
您关于使用各种列表的建议是基于脚本编写的。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());
}
}
publicstaticvoidmain(最终字符串[]args)引发异常{
最终路径路径=Path.get(“Path”、“to”、“file.tsv”);
解析的最终列表;
try(最终流行=Files.lines(路径)){
parsed=lines.skip(1).map(line->line.split(“\\s*\\\\\\\\\\s*”).map(line->{
final int id=Integer.parseInt(第[0]行);
最终字符串名称=行[1];
最终列表类型=Arrays.stream(行)。
跳过(2).map(t->Integer.parseInt(t.replaceAll(\\D',“”)。
collect(Collectors.toList());
返回新Bean(id、名称、类型);
}).collect(Collectors.toList());
}
}
本质上,代码跳过第一行,然后在文件中的行上循环,每行:
|
。这需要正则表达式,因此需要转义管道,因为它是一个特殊字符。此外,我们还使用分隔符之前/之后的任何空格新Bean
int
流
,跳过前两个元素,并将其余元素解析为列表
最简单的方法是使用bean和平面文件读取库。在某个时候,你必须学会如何做到这一点,所以要这样做。您计划如何编写更复杂的代码?总是重新发明轮子吗?最简单的方法是使用bean和平面文件读取库。在某个时候,你必须学会如何做到这一点,所以要这样做。您计划如何编写更复杂的代码?总是重新发明轮子?谢谢你的回答,但是如果我有3种以上的轮子,但有100种或更多,那我该怎么办呢?@nanachan,你应该做这个