使用 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" 更改为 "(?&lt;!\\d)\\d6(?!\\d)",以确保我们只匹配 包含其他数字的 6 位块。

见regex demo

【讨论】:

谢谢你,但是它继续附加值..我需要单独的输出用于单独的行 @RiteshSatapathy:想象一下你读到一个陌生人的问题。我应该从你的评论中理解什么? 我需要从别的东西中得到一些东西来把它变成另外的东西。请具体。 匹配标准是什么?不包含其他数字的 6 位数字块?然后你需要一个"(?&lt;!\\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 文件中过滤掉数字的主要内容,如果未能解决你的问题,请参考以下文章

过滤CSV,其中列大于或等于数字

使用 C# 使用正则表达式过滤掉字母 [重复]

Pentaho Kettle 从字符串转换为整数/数字错误

我想将数据从oracle数据库导出到csv,我在varchar列上放了一个数字过滤器。它发生ORA:01722错误。请建议

根据 CSV 记录从 Spark 数据帧中过滤一些数据

如何过滤掉 teradata 文本字段中的非数字值?