关于超级 csv bean 使用的错误 reader
Error regarding usage of super csv bean reader
我添加了以下依赖项:
<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"};
以下是我构建 reader 的方法。
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))
我不确定是什么导致了这个 exception.It 对一些记录抛出这个异常,即使所有记录都有 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 reader 表现如此奇怪。当列数不是 14 时,它会导致异常,并且在尝试读取它以打印详细信息时出现异常,它表示列数是 14。
请帮我调试这个问题。如果需要,我将更新有关该问题的更多详细信息。请告诉我。
在深入了解 super csv 源并确认您可以正确上传 14 列后,我建议您寻找 Super CSV 的替代品。
我的建议:查看 Apache Commons CSV。
此库还支持迭代方法,因此您不需要在内存中存储 7.000.000 条记录。
最后我解决了这个问题,问题是因为我在 CSV 首选项中给出的列引用模式字符。
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
我添加了以下依赖项:
<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"};
以下是我构建 reader 的方法。
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))
我不确定是什么导致了这个 exception.It 对一些记录抛出这个异常,即使所有记录都有 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 reader 表现如此奇怪。当列数不是 14 时,它会导致异常,并且在尝试读取它以打印详细信息时出现异常,它表示列数是 14。
请帮我调试这个问题。如果需要,我将更新有关该问题的更多详细信息。请告诉我。
在深入了解 super csv 源并确认您可以正确上传 14 列后,我建议您寻找 Super CSV 的替代品。
我的建议:查看 Apache Commons CSV。
此库还支持迭代方法,因此您不需要在内存中存储 7.000.000 条记录。
最后我解决了这个问题,问题是因为我在 CSV 首选项中给出的列引用模式字符。
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