我是CSV Parsing的新手。我有一个CSV文件,其中第3列(描述字段)可能有一个或多个6位数字以及其他值。我需要过滤掉这些数字并将它们写在与每行对应的相邻列中。
例如:
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();
答案 0 :(得分:2)
我建议只匹配6位数的块,并在收集匹配时构建一个新的字符串:
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
请参阅Java demo
更新:我已将模式从"\\d{6}"
更改为"(?<!\\d)\\d{6}(?!\\d)"
,以确保我们只匹配不用其他数字括起来的6位数块。
请参阅regex demo
答案 1 :(得分:1)
所有权利,这是你需要做的第三栏中的数字:
while((nextline=reader.readNext())!=null){
//For every column (columnNumber)
String digitsInColumn = nextline[columnNumber].replaceAll("\\D+","");
// Your treatment
}