Java 使用 uniVocity 解析器特定列数据有逗号且未括起来

标签 java csv univocity

我主要使用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/

相关文章:

Java 创建一个 api 来公开 csv 而不是 json

java - Univocity - 如何将 3(n) 行解析为一行(bean)

java - 一旦发生错误,csv 到 bean 对象的 UNIVOCITY-PARSERS 就会停止

java - 如何默认跳过集成测试,但仍然在多模块 Maven 项目中按需运行它们?

java - Java方法签名中的L、Z和V

python - 从 CSV 文件的字符串列中删除新行

RPostgreSQL 将多个 CSV 文件加载到 Postgresql 表中

java - JNI RegisterNatives 不适用于 ClassLoader.loadClass() 加载的类

java - 处理程序不记录来自 Web 服务的任何内容甚至不抛出错误(在使用 metro 的 tomcat 上)

java - Univocity - 如何定义 "format auto-detection"上分隔符的优先顺序?