[英]Reading CSV file and storing data in Java
我有一個任務需要我閱讀 Java 中的 CSV 文件。 我已經閱讀了它,但我認為我沒有以我想要的方式存儲它們,這使我能夠在以后的任務中訪問它們,例如分析一些數據、構建圖形等。CSV 文件包含 header 中的幾個變量有些變量是數字,有些是字母,這意味着我需要將它們存儲為 Integer 或字符串格式。
請注意,我沒有使用任何庫(例如 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]
我有幾個問題:
我的 csv 數據實際上包含超過 300k 行數據,但是使用上面構建的代碼,我只能打印 280 行。 是不是代碼出錯了? 或者我們在印刷行中的 eclipse 有上限。
我想知道如何從List<Flights>
訪問特定變量,例如運營商或月份,以計算運營商的總規模或計算月份的頻率。
存儲具有多個變量的數據的正確方法是什么? 並能夠在另一個 class 中訪問它們。 或改進我當前代碼的方法。
感謝反饋和時間。 太感謝了。
回答您的疑問:
如果您在執行代碼時沒有收到任何錯誤或異常,您不必擔心。 Eclipse 的默認控制台緩沖區大小是有限的。 參考 - https://javarevisited.blogspot.com/2013/03/how-to-increase-console-buffer-size-in.html
現在您已經讀取了數據,您應該提前 go 並將其保存在數據庫中。 一旦您在數據庫中獲得數據,您就可以運行各種查詢來獲取滿足您條件的數據。
我不明白您所說的“使用多個變量存儲數據的方法”是什么意思。 你能澄清一下嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.