【问题标题】:Remove rows that doesn't contain a certain value in column Java删除列 Java 中不包含特定值的行
【发布时间】:2017-04-04 01:18:35
【问题描述】:

有没有一种方法可以删除第 3 列中不包含 0-23 之间值的行。我总共有 18 列,我正在使用 bufferReader 来读取它。我从 CSV 文件中读取的文件是一个表格。

public class CSVFileread {
    private final ArrayList<String[]> Rs = new ArrayList<String[]>();
    private String[] OneRow;

    public ArrayList<String[]> ReadCSVfile(File DataFile) {
        try {
            BufferedReader brd = new BufferedReader(new FileReader(DataFile));
            brd.readLine();
            while (brd.ready()) {


                String st = brd.readLine().trim();


                OneRow = st.split(",");
                Rs.add(OneRow);

                System.out.println(Arrays.toString(OneRow));
            } 
        } 
        catch (Exception e) {

             JOptionPane.showMessageDialog(null,"System couldn't find the csv file");
            //System.out.println("File not found:" + errmsg);
        } 
        return Rs;
    }
}

【问题讨论】:

  • 为什么不只检查第三列中的值,如果它无效就不将其添加到列表中?
  • 尝试学习一下java命名标准

标签: java arrays csv row


【解决方案1】:

试试这个:

while (brd.ready()) {
    String st = brd.readLine().trim();

    OneRow = st.split(",");
    int value = Integer.valueOf(OneRow[2]);
    if (value < 0 || value > 23) {
        Rs.add(OneRow);
    }

    System.out.println(Arrays.toString(OneRow));
}

注意:变量或方法名的开头只能使用小写字母。类名应使用大写。

【讨论】:

    【解决方案2】:

    我建议您流式传输这些行,然后过滤掉您不想存储的行。类似于以下内容:

    List<String[]> rows = bufferedReader.lines()
        .map(l -> l.trim().split(","))
        .filter(r -> Integer.valueOf(r[2]) >= 0 && Integer.valueOf(r[2]) <= 23)
        .collect(Collectors.toList());
    

    话虽如此,我建议您为具有 18 列有意义字段的行创建一个类,然后将翻译和过滤逻辑封装在您的类中。

    因此,例如,如果您的行代表学生,那么您的代码将类似于:

    class Student {
        public static Optional<Student> fromCSV(String csvLine) {
            String[] fields = csvLine.trim().split(",");
            int age = Integer.valueOf(fields[2]);
            ...
            if (age >= 0 && age <= 23)
                return Optional.of(new Student(..., age, ...));
            else
                return Optional.empty();
        }
    }
    
    List<Student> students = bufferedReader.lines()
        .map(Student::fromCSV)
        .filter(Optional::isPresent).map(Optional::get);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 2023-02-17
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      相关资源
      最近更新 更多