2014-11-23 53 views
0

我試圖從.csv文件中使用java獲取選擇性數據。使用java在CSV文件上搜索範圍數據

例如:

CSV文件包含:

Blue, 03/11/2014, 13:00, 10 
pink, 04/11/2014, 14:00, 15 
Red, 03/11/2014, 15:00, 50 

我想在Java中創建一個程序,將允許用戶選擇他們從該文件中想要的信息。

我一直工作在下面的例子,但只能夠打印字符串,而不是日期/ intergers:

package csv; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Arrays; 
import java.util.Scanner; 


public class ReadCVS { 
    public static void main(String[] args) { 

     ReadCVS obj = new ReadCVS(); 
     obj.run(); 

    } 

    public void run() { 

     String csvFile = "GeoIPCountryWhois.csv"; 
     BufferedReader br = null; 
     String line = ""; 
     String cvsSplitBy = ","; 
     File file = new File("GeoIPCountryWhois.csv"); 
     Scanner in = null; 

     try { 

      br = new BufferedReader(new FileReader(csvFile)); 
      while ((line = br.readLine()) != null) { 

       // use comma as separator 
       String[] colour = line.split(cvsSplitBy); 

       //System.out.println(country[0]+ country[1] + country[2]+ country[3]); 

       for (int i = 0; i < colour.length; i++) { 
        if (colour[i].equals("Pressure")) { 
         System.out.println(colour[0] + colour[1] + colour[2] + colour[3]); //Matching the string and printing. 
        } 
       } 

      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (br != null) { 
       try { 
        br.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     System.out.println("Done"); 
    } 

} 

任何幫助/提示將不勝感激!

謝謝

+2

問題很模糊,請詳細解釋。 – alterfox 2014-11-23 22:31:52

回答

1

我會推薦使用第三方庫來解析csv文件。這可以讓你專注於你正在嘗試做的事情的本質,而不是陷入文件解析。看看,例如Apache Commons CSV。這將讓你的代碼看起來是這樣的:

Reader in = new FileReader("GeoIPCountryWhois.csv"); 
DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 
Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(in); 
for (CSVRecord record : records) { 
    String colour = record.get(0); 
    Date date = df.parse(record.get(1)); 
    String timeString = record.get(2); 
    Integer value = Integer.parseInt(record.get(3)); 
    // do what you want with the values here. 
} 

注意如何做一些額外的解析,如解析DateInteger。這樣可以讓您更輕鬆地過濾這些列,因爲您可以進行比較。

如果您不希望第三方的依賴,你可以做類似你所擁有的東西:

DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 

while ((line = br.readLine()) != null) { 
    // use comma as separator 
    String[] columns = line.split(cvsSplitBy); 

    // extract the columns. 
    String colour = columns[0].trim(); 
    Date date = df.parse(columns[1].trim()); 
    String time = columns[2].trim(); 
    Integer otherValue = Integer.parseInt(columns[3].trim()); 

    // filter on the colour column. 
    if(colour.equals("Red")) { 
     System.out.printf("colour = %s, date = %s, time = %s, val = %d\n", colour, df.format(date), time, otherValue); 
    } 

} 

注意:此代碼是如何呼籲所有列的String.trim()。這是爲了防止分割線後在列周圍留有空白。例如,"a, b, c".split(",")將導致String陣列{"a", " b", " c"}" b"" c"中有額外的空間。這可能是您只能在第一列進行過濾的錯誤的來源。

作爲第三種選擇,這是一種矯枉過正,你可以使用CsvJdbc。這爲sql文件提供了JDBC接口,然後您可以執行SQL查詢。我從來沒有使用過這個庫,但看起來很有趣。鑑於您正在嘗試過濾CSV文件。

+0

謝謝,我會給它以前 – user1291606 2014-11-24 11:08:51

+0

修剪()修復你的代碼? – 2014-11-25 00:52:07