【问题标题】:Reading CSV file and storing data in Java读取 CSV 文件并在 Java 中存储数据
【发布时间】:2020-04-12 14:09:46
【问题描述】:

我有一个任务需要我用 Java 读取 CSV 文件。我已经阅读了它,但我认为我没有以我想要的方式存储它们,这使我能够在以后的任务中访问它们,例如分析一些数据、构建图表等。CSV 文件在标题中包含几个变量有些变量是数字,有些是字母,这意味着我需要以整数或字符串格式存储它们。

请注意,我没有使用任何库(例如 openCSV)来读取文件,因为我是初学者并试图熟悉基本的 Java。

下面是我读取和存储数据的nycflight13。给出的指令是不要包含任何包含单词“NA”的行。

`    public class nycflights13 {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            List<Flights> NYC13 = readFileFromCSV("flights.csv");

            for(Flights a: NYC13) {
                System.out.println(a);
            }
        }

        public static List<Flights> readFileFromCSV (String fileName){
            List<Flights> flightData = new ArrayList <> (); 
            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")) { //Do not take in rows containing "NA"
                        break;
                    } else {
                        Flights dataset = createFlights(variable);
                        flightData.add(dataset);
                    }
                    line = br.readLine();
                }
            }catch (IOException ioe) {
                ioe.printStackTrace();
            }

            return flightData;
        }



        private static Flights createFlights (String [] metadata) {
            int year = Integer.parseInt(metadata[1]); //convert string into int
            int month = Integer.parseInt(metadata[2]); //convert string into int
            int day = Integer.parseInt(metadata[3]); //convert string into int
            int dep_time = Integer.parseInt(metadata[4]); //convert string into int
            String carrier = metadata[10];
            String flight = metadata[11];
            String origin = metadata[13];
            String dest = metadata[14]; 

            return new Flights(year, month, day, dep_time,carrier, flight, origin, dest);
        }

    }`

下面是我的class Flights(我的变量比这里显示的要多):

class Flights {
        private int year; 
        private int month; 
        private int day; 
        private int dep_time;
        private String carrier; 
        private String flight; 
        private String origin;
        private String dest; 

        public Flights(int year, int month, int day, int dep_time, String carrier, String flight, String String origin, String dest) {
            this.year = year; 
            this.month = month; 
            this.day = day; 
            this.dep_time = dep_time;
            this.carrier = carrier; 
            this.flight = flight; 
            this.origin = origin; 
            this.dest = dest; 
        }

        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 int getdep_time() {return dep_time;}
        public void setdep_time(int dep_time) {this.dep_time = dep_time; }

        ............
        .............
        ...........


        @Override
        public String toString() {
           return "Flights [year=" + year +", month=" + month +", day=" + day +", dep_time=" + 
               dep_time +
                ", carrier=" + carrier + ", flight=" + flight +", origin=" + origin +", dest=" + dest 
              +", air_time=" + air_time +", distance=" + distance +", 
                 hour=" + hour +", minute=" + minute +
                 ", time_hour=" + time_hour +"]";
`

上面的代码会给我如下结果:

Flights [year=2013, month=1, day=1, dep_time=926, sched_dep_time=929, dep_delay=-3, arr_time=1404, sched_arr_time=1421, arr_delay=-17, carrier="B6", flight=215, tailnum="N775JB", origin="EWR", dest="SJU", air_time=191, distance=1608, hour=9, minute=29, time_hour=2013-01-01 09:00:00]

Flights [year=2013, month=1, day=1, dep_time=926, sched_dep_time=922, dep_delay=4, arr_time=1221, sched_arr_time=1219, arr_delay=2, carrier="B6", flight=57, tailnum="N534JB", origin="JFK", dest="PBI", air_time=151, distance=1028, hour=9, minute=22, time_hour=2013-01-01 09:00:00]

Flights [year=2013, month=1, day=1, dep_time=926, sched_dep_time=928, dep_delay=-2, arr_time=1233, sched_arr_time=1220, arr_delay=13, carrier="UA", flight=1597, tailnum="N27733", origin="EWR", dest="EGE", air_time=287, distance=1726, hour=9, minute=28, time_hour=2013-01-01 09:00:00]

Flights [year=2013, month=1, day=1, dep_time=927, sched_dep_time=930, dep_delay=-3, arr_time=1231, sched_arr_time=1257, arr_delay=-26, carrier="DL", flight=1335, tailnum="N951DL", origin="LGA", dest="RSW", air_time=166, distance=1080, hour=9, minute=30, time_hour=2013-01-01 09:00:00]

我有几个问题:

  1. 我的 csv 数据实际上包含超过 300k 行数据,但是使用我上面构建的代码,我只能打印 280 行。是不是代码出错了?或者我们在打印行中的eclipse有一个上限。

  2. 我想知道如何从List&lt;Flights&gt; 访问特定变量,例如运营商或月份,以计算运营商的总规模或计算月份的频率。

  3. 存储具有多个变量的数据的正确方法是什么?并且能够在另一个类中访问它们。或改进我当前代码的方法。

感谢您的反馈和时间。太感谢了。

【问题讨论】:

  • 行数怎么算!”?
  • @ThorbjørnRavnAndersen 你的意思是我怎么知道我只打印了 280 行?我从控制台复制了结果并将它们粘贴到 excel 中以计算行数。
  • 控制台默认大小有限,因此它可能无法保存完整的输出。而是在输出中添加一个行计数器。
  • @ThorbjørnRavnAndersen 我试图打印System.out.print(NYC13.size()),但我只得到了 471,这与我应该拥有的 300k 行数据不同。我还使用 count++ 来计算读取的行数,我也得到了 471。你能告诉我哪个部分出了问题吗?非常感谢!

标签: java list linked-list readfile readline


【解决方案1】:

回答您的问题:

  1. 如果您在执行代码时没有收到任何错误或异常,您不必担心。 Eclipse 具有有限的默认控制台缓冲区大小。参考 - https://javarevisited.blogspot.com/2013/03/how-to-increase-console-buffer-size-in.html

  2. 现在您已经读取了数据,您应该继续将其保存在数据库中。一旦您在数据库中获得数据,您就可以运行各种查询以获取满足您条件的数据。

  3. 我不明白您所说的“使用多个变量存储数据的方法”是什么意思。你能澄清一下吗?

【讨论】:

  • 感谢您的反馈。 #3 问题实际上与我想稍后访问某些变量的 #2 有关。需要一些关于如何将它们保存在数据库中的建议,或者您能否提供有关这方面的阅读材料?不知道如何开始。
  • @boonboon93 试试codejava.net/java-se/jdbc/connect-to-mysql-database-via-jdbc 你会得到几篇文章,只需尝试 google 'connect stanalone java to mysql eclipse'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
相关资源
最近更新 更多