如何使用java通过逗号连接单元格

时间:2015-11-05 06:42:35

标签: java csv

我有一个csv文件,其中每个单元格都是一个可能包含逗号的数字。现在我想将它导入我的程序,以便细胞分裂。有没有办法正确加入数字?

例如以下文件内容:

column1 column2 column3 column4
10      10,000  100     1000   

用逗号分割后列出:

column1 column2 column3 column4 column5
10       10     000      100     1000

,例外输出为:

column1 column2 column3 column4 
10      10000   100     1000 

这是我的代码:

File file = new File("csv file");

try (BufferedReader bufRdr = new BufferedReader(new FileReader(file))) {

    while((line = bufRdr.readLine()) != null)
    {
        if((i<5) || (i == myDimensionProcessor.rowCount-1))
        {  
            i++;
        }
        else
        {
            String a = line.replaceAll("[/\\\\%|*^`]", "");
            c = a.replaceAll("--", "NA");                                                    
            i++;
            StringTokenizer st = new StringTokenizer(c,",");

            while (st.hasMoreTokens())
            {
                //get next token and store it in the array
                numbers[row][col] = st.nextToken();
                System.out.print(numbers[row][col]);
                col++;     
            }
            col = 0;
            System.out.println();
            row++;
        }
    }

实际上我将csv文件值拆分为数组,但不应拆分与逗号一起使用的值。我怎么能这样做?

即使将逗号值拆分为不同的列,如何将该拆分值附加到单个单元格中,然后剩余的值应自动转移到以前的列中?

3 个答案:

答案 0 :(得分:1)

如果带逗号的数字带有某种引号,你应该首先替换这样的数字&#34; 10,000&#34;用10000然后进行标记化。你可以这样做:

line = line.replaceAll("\"\\s*(\\d+),(\\d+)\\s*\"", "$1$2");

或者如果您想保留引号:

line = line.replaceAll("(\")\\s*(\\d+),(\\d+)\\s*(\")", "$1$2$3$4");

你需要更换\&#34;在上面的代码示例中使用适当的引号字符。

如果csv中的所有数字都在引号中,您可以删除所有数字中的逗号:

line = line.replaceAll("(\\d+),(\\d+)", "$1$2");
line = line.replace("\"", "");

如果两个数字之间没有csv分隔符逗号,则此方法有效。当您的所有数字都在引号中时,可以安全地假设。如果您还想删除引号,请使用第二行。

答案 1 :(得分:0)

Csv的处理方式比看起来更复杂。你最终不会得到使用正则表达式的可靠解决方案,更不用说这将是非常缓慢的。

只需使用专用于此的库,例如uniVocity-parsers,就可以避免头痛。这是一个简单的例子:

CsvParserSettings settings = new CsvParserSettings(); //many options here, check the tutorial.
CsvParser parser = new CsvParser(settings);
List<String[]> allRows = parser.parseAll(new FileReader(file));

披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。

答案 2 :(得分:0)

如果未引用包含逗号的列,则需要手动提取每个字段。

前几天我在工作中遇到了这个问题,这是我的思考过程。

  1. 您有4列
  2. 假设第二列有逗号
  3. 我从每列的分组开始形成一个正则表达式,因此用逗号和潜在空格分隔的4列将是

     $('input[type=radio]')
        .on('click', function() {
            var $label = $(this).closest('label');
            $('label').not($label).css('background-color', 'green');
            $label.css('background-color', '#2C8BDE');
    });
    

    然后我用我想要匹配的数据填充组

    (),\s*(),\s*(),\s*()$
    

    在这种情况下,除了第二个列之外,每个列都有正常的数字,因此第二个组会抓取它可以找到的任何字符。可能有更好的方法来写这个,我当然想知道,但当我弄清楚时,我处于时间紧迫状态。为了表明它有效,Regex101

    这里的另一个答案是相关的Java代码,

    (\d+),\s*(.+),\s*(\d+),\s*(\d+)$