0

我有以下格式的数据

PAL : PAL : NF : "INCOME"."Taxable"
PAL : PAL : NF : "EXPENSES"."TotalExpenses"
PAL : PAL : NF : "EXPENSES"."Exceptional"

在java中,我只想在不进行任何格式化的情况下分隔数据,在输出中也应该出现引号。我通常使用 Univocity,在使用下面的代码时,

    //Simple CSV File Read
    List<String[]> allRows;
    try {
        CsvParserSettings settings = new CsvParserSettings();
        settings.getFormat().setLineSeparator("\n");
        settings.getFormat().setDelimiter(':');

        CsvParser parser = new CsvParser(settings);
        allRows = parser.parseAll(new FileReader(new File(csvFile)));
        int i =0, cols=0;
        for(String[] str:allRows){
            i++;
            cols = str.length;

            for(String s:str)
                System.out.print(s+" == ");

            System.out.println("");
            if(i == 10) break;
        }       
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }    

输出如下,句号在引号内,我希望输出像输入一样,引号应该来。

PAL == PAL == NF == INCOME"."Taxable
PAL == PAL == NF == EXPENSES"."TotalExpenses
PAL == PAL == NF == EXPENSES"."Exceptional

预期产出

PAL == PAL == NF == "INCOME"."Taxable"
PAL == PAL == NF == "EXPENSES"."TotalExpenses"
PAL == PAL == NF == "EXPENSES"."Exceptional"
4

3 回答 3

1

图书馆的作者在这里。问题"INCOME"."Taxable"是被处理为引用值,并且将引号之间的引号INCOME视为未Taxable转义的引号。

它基本上会尝试“拯救”该值并找到结束引号或分隔符(由 确定settings.setUnescapedQuoteHandling(...))。

在您的情况下,最简单的做法是将您的引号字符设置为类似的东西,'或者即使\0您的输入无论如何都不必处理引用的值。有了这个,你应该得到"INCOME"."Taxable"你所期望的。

希望这可以帮助

于 2017-08-31T20:40:47.660 回答
0

这看起来像是代码中的错误和 Univocity 中 CSV 规范的放松的结合。

输入是

"INCOME"."Taxable"

不幸的是,这不是有效的 CSV,因为您有一个包含嵌入引号的字符串。正确的 CSV 编码应该是

"INCOME"".""Taxable"

Univocity 库似乎对此并不严格,并猜测输入应该是单个字符串(因为没有输入分隔符)。因此,在解析该字段的内部值之后

INCOME"."Taxable

这是字符串的实际内容,没有在 Java 中使其成为字符串文字所需的外部引号。

然后,当您将其写出来时,您忽略了添加周围的引号,从而导致您看到输出。

概括:

  1. Univocity 以符合您要求的方式处理无效输入,因此您可以放心。
  2. 要解决您的问题,您必须自己放回周围的引号

    int field = 0;
    for(String s:str) {
        if (++field == 4)
            System.out.print("\"" + s + "\"");
        else
            System.out.print(s + " == ");
    }
    

这也修复了额外尾随==分隔符的另一个错误。

于 2017-08-31T16:23:15.033 回答
0

为什么你不能做这样的事情,我也测试了结果。请相应地调整您的代码。

您的数据:

PAL : PAL : NF : "INCOME"."Taxable"
PAL : PAL : NF : "EXPENSES"."TotalExpenses"
PAL : PAL : NF : "EXPENSES"."Exceptional"

代码:

public static void parseFile(){
        String csvFile = "file/User.csv";
            String line;
            try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {

                while ((line = br.readLine()) != null) {
                    String equal_string = line.replaceAll(":", "==");
                    String quoate_string = equal_string.replaceAll("\"\"", "\"");

                    if(quoate_string.startsWith("\"") && quoate_string.endsWith("\"")){ 
                        String final_string = quoate_string.substring(1, quoate_string.length()-1);
                        System.out.println(" final : "+final_string);
                     }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

输出:

 final : PAL == PAL == NF == "INCOME"."Taxable"
 final : PAL == PAL == NF == "EXPENSES"."TotalExpenses"
 final : PAL == PAL == NF == "EXPENSES"."Exceptional"
于 2017-08-31T16:25:23.447 回答