删除列Java中不包含特定值的行

时间:2017-04-04 01:18:36

标签: java arrays csv row

有没有办法可以删除第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;
    }
}

2 个答案:

答案 0 :(得分:0)

试试这个:

import random
def split(S): 
    x = random.randint(0,len(S))
    y = len(S)-x
    S1 = S[0:x]
    S2 = []
    for i in range(len(S)):
        if S[i] not in S1:
           S2.append(S[i])
    return S1,S2

注意:在开始变量或方法名称时,您应该只使用小写字母。大写应该用于类名。

答案 1 :(得分:0)

我建议您对这些行进行流式处理,然后过滤掉您不想存储的行。如下所示:

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);