2015-11-05 19 views
0

我有一个csv文件,其中每个单元格都是一个可能包含逗号的数字。现在我想将其导入到我的程序中,以便细胞分裂。有什么方法可以正确加入数字吗?如何使用java以逗号连接单元格

例如,下面的文件内容:

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文件的值拆分为一个数组,但逗号使用的值不应该被拆分。我怎样才能做到这一点?

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

+0

CSV文件中的列具有标签值的分隔,你为什么逗号的基础上劈裂。 和你为什么迭代为空而不是换行。 – shaun

+0

在CSV文件中,我必须将值仅逗号分割成数组...因为它是一个逗号分隔符文件...但在该CSV文件中,我有一个逗号在其中的列值。例如(10,000)我不想分割这个值,它应该只在该列中的相应单元格中。同样,不应将任何逗号值分割为CSV文件。只有列到列的值应该分成一个数组。 –

回答

1

如果你的数字和逗号在某种引号中,你应该先用10000代替这样的数字“10000”,然后进行分词。如果你想保留引号

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

或者:你可以像下面这样做

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

您需要的代码示例中使用适当的引号字符替换\”上面。

如果CSV所有的数字都是在引号,你可以删除所有逗号的数字是这样的:

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

如果两个数字之间没有csv分隔符逗号,这将起作用。当所有的数字都在引号中时,这是安全的。如果您还想删除引号,请使用第二行。

+0

问题是数据是动态的....可能有一个逗号或两个逗号或三个逗号....我希望这个值不应该被分割为CSV文件 –

+0

如果在一个值中有三个逗号... 。该声明不工作....我希望该声明应该是动态的... –

+0

我编辑了答案。最后一个代码示例可能会解决您的问题。虽然我猜这不是最安全的解决方案。 –

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许可证)。

+0

由于[我们讨论过](http://stackoverflow.com/a/34115974/3093387),请将您与univocity的关联声明编辑为您推广uniVocity解析器库的所有答案。 – josliber

+0

试图做到这一点。但该网站允许我每天只编辑5个答案。 –

+0

啊,好的。如果你不介意,我很乐意为你编辑它们。你会好吗? – josliber

0

如果其中包含逗号的列未被引用,那么您需要手动提取每个字段。

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

  1. 您4列
  2. 假设第二列具有由逗号和潜在的空间分离。将逗号

我形成一个正则表达式开始分组为每一列,所以4列

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

然后我填写了我想要匹配的数据组

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

在这种情况下,除了第二列以外,每个列都有正常数字,所以第二组抓取它可以找到的任何字符。可能有更好的方法来写这篇文章,我当然想知道,但是当我想出来的时候,我处于时间紧缩状态。并显示它的作品,Regex101

而继这里对方的回答是相关的Java代码,

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