Java CSV文件中的值包含不带引号的逗号字符

Java CSV文件中的值包含不带引号的逗号字符,java,csv,Java,Csv,我从一个客户端获得了一个CSV文件,其中某个单元格包含多个逗号(,)。所以在用逗号分割后,某些单元格的值会出错 例如: 对于单元格值187859049,我得到187。但我需要187859049 我的逗号拆分代码 String line = ""; //Create the file reader fileReader = new BufferedReader(new FileReader(readfileName)); //Re

我从一个客户端获得了一个CSV文件,其中某个单元格包含多个逗号(,)。所以在用逗号分割后,某些单元格的值会出错

例如: 对于单元格值187859049,我得到187。但我需要187859049

我的逗号拆分代码

        String line = "";

        //Create the file reader
        fileReader = new BufferedReader(new FileReader(readfileName));

        //Read the CSV file header to skip it
        fileReader.readLine();

        //Read the file line by line starting from the second line
        while ((line = fileReader.readLine()) != null) {
            //Get all tokens available in line
            String[] tokens = line.split(Constant.COMMA_DELIMITER);   
            if (tokens.length > 0) {
                //Create a new student object and fill his  data
                ShareNumber shareNumber = new ShareNumber(tokens[Constant.Cell_0],tokens[Constant.Cell_1],tokens[Constant.Cell_2]);
                shareNumberList.add(shareNumber);
            }
我怎样才能解决这个问题?
提前谢谢

首先,让您的客户不要在他们写入CSV文件的数字中添加逗号

假设你不能那样做

您需要能够使用有关实际数据的信息来区分“真”和“假”逗号。具体而言,您可以使用以下信息:

  • 已知哪些字段包含数字
  • 值的范围是什么(例如,它是否总是超过999?那么只有3位数长的“字段”实际上可能是比逗号更大的字段的一部分)
  • 行中逗号的总数;“假”逗号的数量是逗号的数量-(字段数量-1)。如果只有一个数字字段,那么这已经告诉您哪些逗号是“假的”

此外,这意味着您不是通过用逗号分隔一行来开始处理该行,而是通过确定如何分隔该行(例如,通过匹配该行上的正则表达式)来开始处理该行。或者,您可以先将其拆分,但以后需要统一数字的一些拆分部分。

按照我解决问题的方法格式化数字单元格。


我阅读了上面的所有答案。我认为,这种奇怪的问题通常是由于客户的文件问题而发生的。它浪费了开发人员大量的时间。因此,对于这类问题,开发人员应该始终严格要求客户机

包含拆分字符或引号的CSV字段应该用引号括起来表示,字段内的任何引号都应该用两个引号替换。这是CSV中的标准规则。如果该客户机提供的文档不符合这些规则,您应该让他们修复它,因为否则该字段是100%不可解析的。如果您提供用于生成该字段的代码,则更容易确定可以修复该字段的位置。@nyrguds:如果OP可以让他的客户机引用逗号,他本来可以让他们一开始就不把他们放进去…@einpoklum为什么?它们是CSV文件中非常有效的数据。。。只要遵循这些一般规则。@Sourov在我看来,这个问题的唯一真正答案是“对任何编写生成此损坏csv输出的系统的人感到愤怒”。您刚刚总结了OP面临的问题的细节。这实际上没有帮助。这里真正的问题显然是客户端,而不是解析器。@einpoklum,我已经添加了我的代码。请你复习一下好吗?@Sourov:不。在StackOverflow上,在得到最初问题的答案后,你不应该在同一问题页上再添加一个问题。如果您在实施我的方法时遇到问题,请提出一个新问题(并在此处发表评论,链接到该问题)。好的。谢谢你的宝贵建议。顺便说一句,我已经解决了这个问题,并添加了一个答案。这并没有提供问题的答案。您可以搜索或参考页面右侧的相关和链接问题以找到答案。如果您有一个相关但不同的问题,并包含指向此问题的链接以帮助提供上下文。请参阅:。