2014-11-20 81 views
2

我不知道如何生成一個持有csv文件中的字段值的類不會建立嚴格的字段數。我使用CodeModel閱讀了關於生成類的內容,但是在完成該程序後,無法專門編譯以使用.csv文件進行作業,因此需要即時處理。一些文件有22個字段,另外40個。最簡單的解決方案是創建一個包含50個字段的類並將其填充到for循環中。Java如何存儲來自不同CSV文件的數據

示例文件:

Colname1; colname2; colname3........... 
2014-23-11;22;22;22;23;4;4;5; 
2014-23-11;32;22;22;23;4;4;5; 
2014-23-11;62;52;22;23;4;4;5; 
2014-23-11;28;22;22;93;4;4;5; 
+1

聽起來像是一個'ArrayList'工作。但是,真的,你沒有解釋太多關於你的數據域:字段是否代表相同類型的值?例如。標記或心率或其他?有沒有什麼決定特定文件的行長?它呈現的過於寬泛。添加更多細節。 – RealSkeptic 2014-11-20 17:47:35

+0

http://supercsv.sourceforge.net/examples_reading.html – 2014-11-20 17:55:15

回答

1

它很難在運行時創建一個類時,你不知道的字段和數據類型的數量。儘管你可以做兩遍,但在第一遍中找出一個模式並相應地創建類並在第二遍中填充。基本上你需要跟蹤字段名稱,它們的數據類型和一個後備數據類型(例如,特定字段的記錄子集可能是int,然後突然你可能會發現很長)。

就個人而言,我不認爲在運行時提供架構提供了一個非常乾淨的解決方案。地圖的地圖可能是更好的處理方法。只是我的兩分錢。

+0

我決定保留地圖中的所有內容'Map > map = new LinkedHashMap >();',列出現在第一行將是關鍵,但我不知道它是如何用opencsv讀取的,是否有任何方法讀取整個列? – lukassz 2014-11-20 18:34:30

+0

我不知道有任何這樣的方法。但是有一個獲得列數的方法。 – 2014-11-20 18:47:35

1

uniVocity-parsers可以從所有列提取值,不管你有多少:

CsvParserSettings parserSettings = new CsvParserSettings(); 

// To get the values of all columns, use a column processor 
ColumnProcessor rowProcessor = new ColumnProcessor(); 
parserSettings.setRowProcessor(rowProcessor); 

CsvParser parser = new CsvParser(parserSettings); 

//This parses the entire file and triggers the column processor 
parser.parse(new FileReader(yourFile)); 

//Here we get the column values: 
Map<Integer, List<String>> columnValuesByIndex = rowProcessor.getColumnValuesAsMapOfIndexes(); 
Map<String, List<String>> columnValuesByName = rowProcessor.getColumnValuesAsMapOfNames(); 

披露:我是這個庫的作者。它是開放源代碼和免費的(Apache V2.0許可證)。

2

我的解決辦法:

HashMap<String, List<String>> map = new LinkedHashMap<String, List<String>>(); 

     List content = reader.readAll(); 
     String[] row; 
     String key; 
     int kolumna=0; 

     List<String> tmp = new ArrayList<String>(); 

     for(int i=0; i <columnCount-1; i++) { 
      List<String> lista = new ArrayList<String>(); 

      key=null; 
      for (Object object : content) { 

       row = (String[]) object; 
       if (kolumna == 0) { 
        // map.put(row[i],null); 
        key = row[i]; 
       } 
       if (kolumna != 0) { 

        lista.add(row[i]); 
        // System.out.println(row[i] + " # " + kolumna + key); 
        map.put(key, lista); 

       } 

       kolumna++; 
      } 

      kolumna=0; 
     } 

     for (Map.Entry<String, List<String>> entry : map.entrySet()) 
     { 
      // System.out.println(entry.getKey() + "/" + entry.getValue()); 
     } 
相關問題