【问题标题】:Error regarding usage of super csv bean reader关于使用超级 csv bean 阅读器的错误
【发布时间】:2015-12-22 08:39:52
【问题描述】:

我添加了以下依赖项:

    <dependency>
    <groupId>net.sf.supercsv</groupId>
    <artifactId>super-csv</artifactId>
    <version>2.4.0</version>
    </dependency>

    private final static String[] COLS = { "col1", "col2", "col3", "col4", "col5",
        "col6", "col7", "col8", "col9", "col10", "col11",
        "col12", "col13", "col14" };


    private final static String[] TEMP_COLS = {"col1", "col2", "col3", "col4", "col5",
        "col6", "col7", "col8", "col9", "col10", "col11",
        "col12", "col13"};

以下是我构建阅读器的方法。

protected CsvPreference csvPref = CsvPreference.STANDARD_PREFERENCE;
 protected String encoding = "US-ASCII";
InputStream is = fs.open(path);
      BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding));
      ICsvBeanReader csvReader = new CsvBeanReader(br, csvPref);

作为 bean reader 的一部分,我有以下代码:

Selections bean = null;

    try{
        bean = reader.read(Selections.class, Selections.getCols());
        }catch(Exception e){    
   // bean = reader.read(Selections.class, Selections.getTempCols());
   // slf4j.error(bean.getEventCode() + bean.getProgramId());
    slf4j.error("Error Logged for bean because of COLUMNS MISMATCH");
        }

在上面的代码中,它正在抛出异常:

java.lang.IllegalArgumentException:the nameMapping array and the number of columns read should be the same size (nameMapping length = 14, columns = 13))

我不确定是什么导致了这个异常。即使所有记录都有 14 列,它也会在某些记录上抛出这个异常(我已经使用脚本验证了这一点,我什至创建了一个架构并上传了14 列的文件)。在 7,000,000 条记录中,有 2,100,000 条存在此问题。

为了调试导致此问题的记录,我对代码进行了以下更改。

Selections bean = null;

        try{
            bean = reader.read(Selections.class, Selections.getCols());
            }catch(Exception e){    
        bean = reader.read(Selections.class, Selections.getTempCols());
        slf4j.error(bean.getEventCode() + bean.getProgramId());
        slf4j.error("Error Logged for bean because of COLUMNS MISMATCH");
            }

现在,上面的变化正在抛出:java.lang.IllegalArgumentException: the nameMapping array and the number of columns read should be the same size (nameMapping length = 13, columns = 14)

我不知道为什么打开的 csv 阅读器表现得如此奇怪。当列数不是 14 时,它会导致异常,并且在尝试读取它以打印详细信息时出现异常,它说列数是 14。

请帮我调试这个问题。如果需要,我将更新有关该问题的更多详细信息。请告诉我。

【问题讨论】:

  • 我的文件中没有任何标题。
  • 您能展示一下您是如何创建您的阅读器对象的吗?
  • 异常信息已经够清楚了。
  • @Raedwald K 我已经更新了这个问题。它正在读取某些行,但即使我已经验证它们有 14 列,也会抛出一些错误。请也阅读我的描述。
  • @ minusvoter - 你愿意评论吗?

标签: java supercsv


【解决方案1】:

在深入了解超级 CSV 源并确认您可以直接上传 14 列后,我建议您寻找超级 CSV 的替代品。

我的建议:查看Apache Commons CSV

该库还支持迭代方法,因此您不需要在内存中拥有 7.000.000 条记录。

【讨论】:

    【解决方案2】:

    最后我解决了这个问题,问题是因为我在我的 CSV 首选项中给出的 columnquote 模式字符。

    new CsvPreference.Builder('"', '\u0001', "\r\n").build()
    

    我的传入数据包含" 作为数据的一部分。当我用一个永远不会成为传入数据一部分的字符替换带引号的列时,问题得到了解决。

    我不是这方面的专家,这是因为我的无知,super-scv 没有错。我相信 super-csv 是一个值得探索和使用的不错的 API。

    更多关于列引用模式,请参考他们的API。 https://super-csv.github.io/super-csv/apidocs/org/supercsv/quote/ColumnQuoteMode.html

    【讨论】:

      猜你喜欢
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2020-03-15
      • 1970-01-01
      相关资源
      最近更新 更多