读取Java中的CSV文件并从读取的文件中提取某些数据

读取Java中的CSV文件并从读取的文件中提取某些数据,java,csv,bufferedreader,getter-setter,pojo,Java,Csv,Bufferedreader,Getter Setter,Pojo,我已经使用POJO类将一个csv文件读入Java。该文件有19列标题,我想从其中一列标题中提取信息。我该怎么做?希望得到社区的指导和建议 以下是我的一些代码: 我想从原始变量访问“EWR”,并打印出数据中有多少EWR。我试图使用getter来提取我想要的数据,但没有成功。当我尝试打印尺寸时得到0 public class nycflights13 { public static void main(String[] args) { // TODO Auto-gener

我已经使用POJO类将一个csv文件读入Java。该文件有19列标题,我想从其中一列标题中提取信息。我该怎么做?希望得到社区的指导和建议

以下是我的一些代码:

我想从原始变量访问“EWR”,并打印出数据中有多少EWR。我试图使用getter来提取我想要的数据,但没有成功。当我尝试打印尺寸时得到0

public class nycflights13 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        NYC13data ABC = new NYC13data ();
        List<Flights> EWRairport = new ArrayList <> ();
        for (Flights ab : ABC.NYC13.fdata) {
            if(ab.getorigin().equals("EWR")){
                EWRairport.add(ab);
            } else {
                continue;
            }
        }
        System.out.println(EWRairport.size());
    }   
}
这是我的班级
flightdata

class flightdata {
    public List<Flights> fdata;

    public List<Flights> readFileFromCSV (String fileName){
        Path pathToFile = Paths.get(fileName);

        try(BufferedReader br = Files.newBufferedReader(pathToFile,
                StandardCharsets.US_ASCII)){
            br.readLine();
            String line = br.readLine();
            while (line != null) {
                String [] variable = line.split(",");

                //convert string array to list
                List<String> list = Arrays.asList(variable);
                if(list.contains("NA")) {
                    line = br.readLine();
                    continue;
                } else {
                    Flights dataset = createFlights(variable);
                    fdata.add(dataset);
                    line = br.readLine();
                }

            }
        }catch (IOException ioe) {
            ioe.printStackTrace();
        }

        return fdata;

    }

    //Did not show all the 19 variables
    private static Flights createFlights (String [] metadata) {
        int year = Integer.parseInt(metadata[1]);
        int month = Integer.parseInt(metadata[2]);
        int day = Integer.parseInt(metadata[3]);
        String flight = metadata[11]; 
        String tailnum = metadata[12];
        String origin = metadata[13];
        String dest = metadata[14]; 
        String time_hour = metadata[19];

        return new Flights(year, month, day, dep_time, sched_dep_time, dep_delay, arr_time,
                sched_arr_time, arr_delay, carrier, flight, tailnum, origin, dest, air_time,
                distance, hour, minute, time_hour);
    }

    public flightdata () {
        fdata = new ArrayList <> ();    
    }

    public void printdata () {
        for(Flights ab : fdata) {
            System.out.println(ab);
        }
    }
}
class Flights {

    private int year; private int month; private int day; private int dep_time;
    private int sched_dep_time; private int dep_delay; private int arr_time;
    private int sched_arr_time; private int arr_delay; private String carrier;
    private String flight; private String tailnum; private String origin;
    private String dest; private int air_time; private int distance;
    private int hour; private int minute; private String time_hour;

    public Flights(int year, int month, int day, int dep_time, int sched_dep_time,
            int dep_delay, int arr_time, int sched_arr_time, 
            int arr_delay, String carrier, String flight, String tailnum,
            String origin, String dest, int air_time, int distance,
            int hour, int minute, String time_hour) {
        this.year = year; this.month = month; this.day = day; this.dep_time = dep_time;
        this.sched_dep_time = sched_dep_time; this.dep_delay = dep_delay; this.arr_time = arr_time;
        this.sched_arr_time = sched_arr_time; this.arr_delay = arr_delay; this.carrier = carrier; 
        this.flight = flight; this.tailnum = tailnum; this.origin = origin; 
        this.dest = dest; this.air_time = air_time; this.distance = distance; 
        this.hour = hour; this.minute = minute; this.time_hour = time_hour; 
    }

    public int getyear() {return year;}
    public void setYear(int year) {this.year = year;}

    public int getmonth() {return month;}
    public void setMonth(int month) {this.month = month; }

    public int getday() {return day;}
    public void setDay(int day) {this.day = day; }

    public String getcarrier() {return carrier;}
    public void setcarrier(String carrier) {this.carrier = carrier;}

    public String getflight() {return flight;}
    public void setflight(String flight) {this.flight = flight; }

    public String gettailnum() {return tailnum;}
    public void settailnum(String tailnum) {this.tailnum = tailnum; }

    public String getorigin() {return origin;}
    public void setorigin(String origin) {this.origin = origin; }

    public String getdest() {return dest;}
    public void setdest(String dest) {this.dest = dest; }

    public String gettime_hour() {return time_hour;}
    public void settime_hour(String time_hour) {this.time_hour = time_hour; }

    @Override
    public String toString() {
        return "Flights [year=" + year +", month=" + month +", day=" + day +", dep_time=" + dep_time 
                + ", sched_dep_time=" + sched_dep_time +", dep_delay=" + dep_delay +", arr_time=" + 
                arr_time + ", sched_arr_time=" + sched_arr_time +", arr_delay=" + arr_delay +", 
                carrier=" + carrier + ", flight=" + flight +", tailnum=" + tailnum +", origin=" + 
                origin +", dest=" + dest ", air_time=" + air_time +", distance=" + distance +", 
                hour=" + hour +", minute=" + minute +", time_hour=" + time_hour +"]";
    }
}

如果这里有人能告诉我我的代码有什么问题,我将不胜感激。非常感谢

我想我可能已经发现了问题,您的原始csv文件包含单元格格式。清除除
time\u hour
列之外的所有单元格的格式

或者,作为一种快速修复方法,在循环中更改
nycflights13
类中的代码

if( ab.getorigin().equals( "\"EWR\"" ) ) // nycflights13 class

作为旁注,如注释中所述,下次使用CSV解析器时,这将避免在处理代码甚至无法编译的CSV文件时出现许多复杂情况。再试一次!!请参阅:您能检查类
nycflights13
中循环中的对象
ABC.NYC13.fdata
是否为空吗?我尝试使用由我为上述代码创建的csv,其中包含3列,包括原点,代码按预期工作。如果可能的话,您可以共享完整的csv。@Piotrkoraga我已经尝试了代码,但它不是空的。对于(Flights ab:ABC.NYC13.fdata){System.out.println(ab);},它确实打印了数据。不要使用行读取和
split(“,”
)来读取CSV文件。使用CSV解析器!正确的建议是:使用CSV解析器解析CSV文件。是的,我为代码提供了解决方案,并指出了问题所在,而不是建议。@Klaus非常感谢!,它解决了这个问题。在我清除格式之后,我的代码也可以工作。将尝试探索您提到的CSV解析器。如何读取“EWR”的运算符/符号?
if( ab.getorigin().equals( "\"EWR\"" ) ) // nycflights13 class