我有一个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文件值拆分为数组,但不应拆分与逗号一起使用的值。我怎么能这样做?
即使将逗号值拆分为不同的列,如何将该拆分值附加到单个单元格中,然后剩余的值应自动转移到以前的列中?
答案 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)
如果未引用包含逗号的列,则需要手动提取每个字段。
前几天我在工作中遇到了这个问题,这是我的思考过程。
我从每列的分组开始形成一个正则表达式,因此用逗号和潜在空格分隔的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+)$