【问题标题】:opencsv read from an unknow line but known word?opencsv 从未知行读取但已知单词?
【发布时间】:2018-07-25 08:36:00
【问题描述】:

好的,我有一个 csv 文件:

Summary
    heading1,heading2,heading3
    value1,value2,value2
    value1,value2,value2
    value1,value2,value2
    value1,value2,value2
Detail
    heading11,heading12,heading13
    value1,value2,value2
    value1,value2,value2
    value1,value2,value2
    value1,value2,value2

我正在使用 com.opencsv.CSVReader 库。

我需要从“详细信息”行读取,但我不知道它是哪一行,因为它之前可能有未定义的行数。摘要从
开始 第 13 行,但我知道如何处理它。

opencsv 是否有一种简单的模式可以找到“详细信息”行并从那里开始? 或者我是否需要以某种方式计算 Detail 之前的行并将其作为参数传递给 OPENCSV?

【问题讨论】:

  • 您的文件将不是有效的 CSV。没有官方的定义,但是如果我们把RFC 4180当作一个,就不可能像你那样把文档分成几部分。最好的选择是自己查找详细信息,提取后续行并查看是否可以将它们解析为 CSV,或者将所有内容划分为单独的文件。
  • @bracco23 好吧,我没有创建 CSV,亚马逊做了。他们称之为 CSV。
  • 查看CSVReader的文档,它以标准阅读器作为输入,因此您可以读取每一行,与正则表达式匹配以找到带有“详细信息”的行,然后将后续行读入字符串并使用 StringReader 将它们提供给 CSVReader

标签: java csv opencsv


【解决方案1】:

由于将 CSV 分成多个部分不是常见的要求,并且库不一定支持,因此您应该找到自己感兴趣的行开始并提取它们的点。一种方法可能是:

BufferedReader b = new BufferedReader(new FileReader(source));
String line = b.readLine();
StringBuilder build = new StringBuilder();
while(line != null && !line.equals("Detail")){
    line = b.readLine();
}
line = b.readLine();
while(line != null){
    build.append(line);
    build.append('\n');
    line = b.readLine();
}
System.out.println(build.toString());
Reader toBeParsed = new StringReader(build.toString());

基本上读取文件,直到找到与详细信息部分匹配的行,然后将所有剩余的行添加到字符串中。从此字符串中使用了一个可以输入 CSVReader 的阅读器。

我假设必须考虑所有剩余的行(考虑与另一个字符串匹配以停止,如果不是这种情况),并且开始的行正是“详细信息”(您可以使用正则表达式更灵活的方法)

Here is a live demo

【讨论】:

  • 谢谢,我想我会采取类似的方法。
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多