gpt4 book ai didi

java - 用 Java 解析 CSV 文件的一部分

转载 作者:行者123 更新时间:2023-12-01 18:08:21 29 4
gpt4 key购买 nike

我需要处理一个实际上包含多个表的 CSV 文件,如下所示:

"-------------------- Section 1 --------------------"

"Identity:","ABC123"
"Initials:","XY"
"Full Name:","Roger"
"Street Address:","Foo St"


"-------------------- Section 2 --------------------"

"Line","Date","Time","Status",

"1","30/01/2013","10:49:00 PM","ON",
"2","31/01/2013","8:04:00 AM","OFF",
"3","31/01/2013","11:54:00 PM","OFF",


"-------------------- Section 3 --------------------"

我想用 commons-csv 之类的内容解析每个部分中的 block 。 ,但是单独处理每个部分会很有帮助,在双换行符处停止,就好像它是文件末尾一样。有人已经解决这个问题了吗?

注意: 文件可以任意长,并且可以包含任意数量的部分,因此如果可能的话,我会追求一次传递。每个部分似乎都以一个带标题的标题 (-------- title ------\n\n) 开始,并以两个空行结束。

最佳答案

使用java.io.FilterReader怎么样?您可以通过反复试验找出需要覆盖哪些 Reader 方法。您的自定义类必须提前阅读整行并查看它是否是“部分”行。如果是,则返回 EOF 以停止 commons-csv 解析器。然后,您可以阅读自定义类的下一部分。不优雅,但它可能会起作用。给出的例子:

class MyReader extends FilterReader {
private String line;
private int pos;
public MyReader(BufferedReader in) {
super(in);
line = null;
pos = 0;
}
@Override
public int read() {
try {
if ( line == null || pos >= line.length() ) {
do {
line = ((BufferedReader)in).readLine();
} while ( line != null && line.length() == 0 );
if ( line == null ) return -1;
line = line + "\r\n";
pos = 0;
}
if ( line.contains("-------------------- Section ") ) {
line = null;
return -1;
}
return line.charAt(pos++);
} catch ( Exception e) { throw new RuntimeException(e); }
}
}

你会像这样使用它:

public void run() throws Exception {
BufferedReader in = new BufferedReader(new FileReader(ReadRecords.class.getResource("/records.txt").getFile()));
MyReader reader = new MyReader(in);
int c;
while( (c=reader.read()) != -1 ) {
System.out.print((char)c);
}
while( (c=reader.read()) != -1 ) {
System.out.print((char)c);
}
while( (c=reader.read()) != -1 ) {
System.out.print((char)c);
}
reader.close();
}

关于java - 用 Java 解析 CSV 文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34665895/

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