使用Java从CSV文件中过滤出数字
我对CSV解析还不熟悉。我有一个CSV文件,其中第三列(描述字段)可能有一个或多个6位数字以及其他值。我需要过滤掉这些数字,并将它们写在与每行对应的相邻列中使用Java从CSV文件中过滤出数字,java,regex,excel,csv,pattern-matching,Java,Regex,Excel,Csv,Pattern Matching,我对CSV解析还不熟悉。我有一个CSV文件,其中第三列(描述字段)可能有一个或多个6位数字以及其他值。我需要过滤掉这些数字,并将它们写在与每行对应的相邻列中 3rd column 4th column ============= =========== 123456adjfghviu77 123456 shgdasd234567 234567
3rd column 4th column
============= ===========
123456adjfghviu77 123456
shgdasd234567 234567
123456abc:de234567:c567890d 123456-234567-567890
12654352474
例如:
3rd column 4th column
============= ===========
123456adjfghviu77 123456
shgdasd234567 234567
123456abc:de234567:c567890d 123456-234567-567890
12654352474
请帮忙。这就是我到目前为止所做的
3rd column 4th column
============= ===========
123456adjfghviu77 123456
shgdasd234567 234567
123456abc:de234567:c567890d 123456-234567-567890
12654352474
String strFile="D:/Input.csv";
CSVReader reader=new CSVReader(new FileReader(strFile));
String[] nextline;
//int lineNumber=0;
String str="^[\\d|\\s]{5}$";
String regex="[^\\d]+";
FileWriter fw = new FileWriter("D:/Output.csv");
PrintWriter pw = new PrintWriter(fw);
while((nextline=reader.readNext())!=null){
//lineNumber++;
//System.out.println("Line : "+lineNumber);
if(nextline[2].toString().matches(str)){
pw.print(nextline[1]);
pw.append('\n');
System.out.println(nextline[2]);
}
}
pw.flush();
好吧,这就是你要得到第三列中的数字所需要做的:
3rd column 4th column
============= ===========
123456adjfghviu77 123456
shgdasd234567 234567
123456abc:de234567:c567890d 123456-234567-567890
12654352474
while((nextline=reader.readNext())!=null){
//For every column (columnNumber)
String digitsInColumn = nextline[columnNumber].replaceAll("\\D+","");
// Your treatment
}
我建议只匹配6位数的块,并在收集匹配项时构建一个新字符串:
3rd column 4th column
============= ===========
123456adjfghviu77 123456
shgdasd234567 234567
123456abc:de234567:c567890d 123456-234567-567890
12654352474
String s = "123456abc:de234567:c567890d";
StringBuilder result = new StringBuilder();
Pattern pattern = Pattern.compile("(?<!\\d)\\d{6}(?!\\d)"); // Pattern to match 6 digit chunks not enclosed with digits
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
if (result.length() == 0) { // If the result is empty
result.append(matcher.group(0)); // add the 6 digit chunk
} else {
result.append("-").append(matcher.group(0)); // else add a delimiter and the digits after it
}
}
System.out.println(result.toString()); // Demo, use this to write to your new column
String s=“123456abc:de234567:c567890d”;
StringBuilder结果=新建StringBuilder();
Pattern=Pattern.compile(“(?可能有一个或多个6位数字以及其他值->您必须向我们显示示例输入和输出问题在于您只是检查正则表达式模式是否匹配,然后打印行(如果匹配)。您需要使用捕获组并打印子匹配。您忘了为给定输入添加适当的输出。@Ri特什:。只需将“\\d{6}”
与匹配器#find()一起使用
@riteshattatatathy您是问题的设定者,因此您应该告诉我们在这种情况下您想要什么…我同意这一点..但是如果该单元格有多个6位数的值..我的意思是像这样的123456hdfhg,sdfg567890
…它会将它们附加在一起..但我不希望这样,我希望它们在另一个单元格中分开..它不能在您的示例中,请使用逗号,而不是相同的列。在您的解释中,您所说的“可能有一个或多个6位数字以及其他值。我需要过滤掉这些数字,并将它们写入与每行对应的相邻列中。”".digitsInColumn将在此列中包含数字,您必须对每列执行相同的操作才能获得digits@RiteshSatapathy您将如何将123456adjfghviu77234567的结果附加到输出csv文件的下一列?您的问题缺少此用例的规范我的错误..分隔符不是逗号,而是;
或:
在这种情况下,我认为@Wiktor Stribiżew的解决方案是可以选择的。您只需使用StringBuilder循环匹配器的结果,并将结果添加到输出csvthanks中即可,但它会不断附加值。我需要单独的输出来实现单独的输出rows@RiteshSatapathy当前位置想象一下,你读到了一个来自stran的问题ger.我应该从你的评论中理解什么?我需要从其他东西中获取一些东西来将其转化为其他东西。请具体说明。匹配的标准是什么?不包含其他数字的6位区块?然后你需要一个”(?此外,你需要重置StringBuilder(只要把它放在代码的正确位置)每次你读新行的时候。请原谅,但是如果你看到qn,我已经更新了输入和输出。第3列是输入列,第4列是输出列