如何从 Java 中的 csv 文件中删除包含空白单元格的行

How to remove row which contains blank cell from csv file in Java

我正在尝试对数据集进行数据清理。通过数据清理,我的意思是删除包含 NaN 或重复值或空单元格的行。这是我的代码

数据集如下所示:

Sno Country     noofDeaths
1                32432
2    Pakistan     NaN
3    USA          3332
3    USA          3332

excel 文件图片:

public class data_reader {
    String filePath="src\abc.csv";
    public void readData() {
         BufferedReader br = null;
            String line = "";
          
            HashSet<String> lines = new HashSet<>();
            try {
                br = new BufferedReader(new FileReader(filePath));
                while ((line = br.readLine()) != null) {
                    if(!line.contains("NaN") || !line.contains("")) {
                        if (lines.add(line)) {
                            System.out.println(line);
                        }   
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    }   
    }
    
    

它适用于 NaN 值和重复行但不适用于空单元格,请帮助如何做到这一点。

!line.contains("")

这不起作用。

条件 !line.contains("") - 没有意义,因为每个字符串都包含空字符串。

一般建议:

  • 不要硬编码file-path,代码必须可重用;
  • 尝试使用资源;
  • camel-case 个名字。
public class DataReader {
    public static void main(String[] args) {
        new DataReader().readData("src\abc.csv");
    }

    public void readData(String filePath) {
        try(BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            HashSet<String> lines = new HashSet<>();
            String line = null;
            while ((line = br.readLine()) != null) {
                if(!line.contains("NaN")) {
                    for (String cell: line.split(",")) {
                        if (!cell.isBlank()&&lines.add(cell)) {
                            System.out.print(cell + " ");
                        }
                    }
                }
                System.out.println();
            }
        }  catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在我看来,这是一个很容易解决的问题。给定一个包含空行的 CSV 文件

foo,bar,baz
1,One,123
,,
2,Two,456
3,Three,789

您可以阅读这些行并将空行定义为包含以逗号分隔的空字符串的行。您可以读取文件的内容,将填充的行存储到字符串缓冲区中,然后在提取空行后保存缓冲区的内容。下面的代码实现了这一点:

public static void main(String[] args) throws IOException {
     String file ="test.csv";
     BufferedReader reader = new BufferedReader(new FileReader(file));
     String line = null;
     StringBuilder sbuff = new StringBuilder();
     while ((line = reader.readLine()) != null) {
         String[] tokens = line.split(",");
         if (containsText(tokens)) {
             sbuff.append(line + "\n");
         }
     }
     reader.close();
     System.out.println(sbuff.toString());
     // save file here
}
    
public static boolean containsText(String[] tokens) {
    for (String token: tokens) {
        if (token.length() > 0)
            return true;
    }
    return false;
}

经过运行代码后,输出为:

foo,bar,baz
1,One,123
2,Two,456
3,Three,789

同样的代码可用于通过简单的方法确定单元格是否为空:

public static boolean isCellEmpty(String[] tokens) {
    for (String token: tokens) {
        if (token.isBlank())
            return true;
    }
    return false;
}