使用 Java 从 CSV 文件中过滤掉数字
Posted
技术标签:
【中文标题】使用 Java 从 CSV 文件中过滤掉数字【英文标题】:Filter out digits from a CSV File using Java 【发布时间】:2016-09-09 10:22:03 【问题描述】:我是 CSV 解析的新手。我有一个 CSV 文件,其中第三列(描述字段)可能有一个或多个 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();
【问题讨论】:
可能有一个或多个 6 位数字以及其他值 -> 您必须向我们展示示例输入和输出 问题是您只是检查正则表达式模式是否 匹配,如果匹配则打印该行。您需要使用捕获组并打印 submatches。 您忘记为给定的输入添加适当的输出。 @Ritesh:ideone.com/pzXA3c。只需使用"\\d6"
和 Matcher#find()
。
@RiteshSatapathy 你是问题的根源,所以在这种情况下你应该告诉我们你想要什么......
【参考方案1】:
我建议只匹配 6 位数的块,并在收集匹配时构建一个新字符串:
String s = "123456abc:de234567:c567890d";
StringBuilder result = new StringBuilder();
Pattern pattern = Pattern.compile("(?<!\\d)\\d6(?!\\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
更新:我已将模式从 "\\d6"
更改为 "(?<!\\d)\\d6(?!\\d)"
,以确保我们只匹配 不 包含其他数字的 6 位块。
见regex demo
【讨论】:
谢谢你,但是它继续附加值..我需要单独的输出用于单独的行 @RiteshSatapathy:想象一下你读到一个陌生人的问题。我应该从你的评论中理解什么? 我需要从别的东西中得到一些东西来把它变成另外的东西。请具体。 匹配的标准是什么?不包含其他数字的 6 位数字块?然后你需要一个"(?<!\\d)\\d6(?!\\d)"
正则表达式。
另外,每次读取新行时,您都需要重置 StringBuilder(只需将其放在代码中的正确位置即可)。
请原谅,但如果您看到 qn,我已经更新了输入和输出。第 3 列是输入列,第 4 列是输出列【参考方案2】:
好的,这就是你需要做的才能获得第三列中的数字:
while((nextline=reader.readNext())!=null)
//For every column (columnNumber)
String digitsInColumn = nextline[columnNumber].replaceAll("\\D+","");
// Your treatment
【讨论】:
我同意这一点..但如果该单元格有多个 6 位数的值..我的意思是这样的123456hdfhg, sdfg567890
...它将它们附加在一起..但我不希望那样,我希望它们在另一个单元格中分开
好吧,它不能像您的示例中那样使用逗号,否则它不会是同一列。在你的解释中。您所说的“可能有一个或多个 6 位数字以及其他值。我需要过滤掉这些数字并将它们写在与每一行对应的相邻列中”。 digitsInColumn 将在此列中包含数字,您必须对每一列执行相同的操作才能获取数字
@RiteshSatapathy 您如何将 123456adjfghviu77234567 的结果附加到输出 csv 文件的下一列中?您的问题缺少此用例的规范
我的错..分隔符不是逗号,它们是;
或:
在这种情况下,我认为@Wiktor Stribiżew 的解决方案是可以选择的。您只需使用 StringBuilder 循环匹配器的结果并将结果添加到输出 csv以上是关于使用 Java 从 CSV 文件中过滤掉数字的主要内容,如果未能解决你的问题,请参考以下文章
我想将数据从oracle数据库导出到csv,我在varchar列上放了一个数字过滤器。它发生ORA:01722错误。请建议