我主要使用uniVocity作为CSV解析器,它是一个优秀的解析器。我遇到了以下行的问题,该文件将有固定数量的 7 列。问题是客户端名称,它可以有逗号,它的下一列类型,一般是S或P。
下面是测试数据
Date,Code,Company,Client,Type,Quantity,Price
03/03/2014,500103,BHEL,PoI THROUGH DoI, Affairs,S,114100000,165.55
21/04/2017,533309,DALMI,KKR MAURITIUS CEMENT, LTD.,S,106020,2050.00
21/04/2017,533309,DALMI,KKR MAURITIUS CEMENT, LTD.,P,141740,2050.00
以上数据的客户端名称有问题,因为数据本身有逗号且未括起来。以下是客户名称
PoI THROUGH DoI, Affairs
KKR MAURITIUS CEMENT, LTD.
KKR MAURITIUS CEMENT, LTD.
请告诉我如何处理
谢谢
最佳答案
如果数据没有用引号括起来,那么您实际上无法在这里做很多事情。您实际上能做的就是检查行长度,如果它大于 7,您就知道额外的列是客户端名称的一部分。
这是我的解决方案:
for (String[] row : rows) {
if (row.length > 7) {
int extraColumns = row.length - 7; //we have extra columns
String[] fixed = new String[7]; // let's create a row in the correct format
//copies all data before name
for (int i = 0, j = 0; i < row.length; i++, j++) {
fixed[j] = row[i]; //keep copying values, until we reach the name
if (i == 3) { //hit first column with a name in it
for (int k = i + 1; k <= i + extraColumns; k++) { //append comma and the value that follows the name
fixed[i] += ", " + row[k];
}
i += extraColumns; //increase variable i and keep assigning values after it to position j
}
}
row = fixed; //replaces the original broken row
}
//prints the resulting row, values in square brackets for clarity.
for (String element : row) {
System.out.print('[' + element + ']' + ",");
}
System.out.println();
}
这会产生输出:
[Date],[Code],[Company],[Client],[Type],[Quantity],[Price],
[03/03/2014],[500103],[BHEL],[PoI THROUGH DoI, Affairs],[S],[114100000],[165.55],
[21/04/2017],[533309],[DALMI],[KKR MAURITIUS CEMENT, LTD.],[S],[106020],[2050.00],
[21/04/2017],[533309],[DALMI],[KKR MAURITIUS CEMENT, LTD.],[P],[141740],[2050.00],
希望有帮助。
关于Java 使用 uniVocity 解析器特定列数据有逗号且未括起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44214669/