2014-02-09 55 views
3

對於需要處理CSV文件的項目,我不知道運行前的列。 CSV文件是完全有效的,我只需要一次又一次地在幾個不同的文件上執行一個簡單的任務。我確實需要分析列的值,這就是爲什麼我需要使用庫來處理CSV文件。爲了簡單起見,假設我需要做一些簡單的事情,比如將日期列附加到所有文件,而不管它們有多少列。我想用Super CSV做到這一點,因爲我也使用庫來完成其他任務。如何使用Super CSV處理列數未知的CSV文件

我所苦惱的是更多的概念問題。如果我事先不知道有多少列,我不知道如何處理這些文件。我不確定我應該如何定義映射任意CSV文件的POJO,或者如果我不知道文件中將包含多少列,我應該如何定義Cell處理器。我如何動態創建匹配列數的Cell處理器?我如何根據CSV文件的標題定義POJO?

考慮我有兩個CSV文件的情況:products.csv和address.csv。讓我們假設我想爲這兩個文件添加一個日期列和今天的日期,而不必編寫兩個不同的方法(例如addDateColumnToProduct()和addDateColumnToAddress()),它們可以做同樣的事情。

product.csv:

name, description, price 
"Apple", "red apple from Italy","2.5€" 
"Orange", "orange from Spain","3€" 

address.csv:

firstname, lastname 
"John", "Doe" 
"Coole", "Piet" 

基礎上CSV文件的頭信息,我怎麼可能定義映射的產品CSV一個POJO? Cell處理器的相同問題?我怎麼能夠定義一個非常簡單的單元處理器,它基本上具有構造函數的正確參數量,例如對於product.csv

CellProcessor[] processor = new CellProcessor[] { 
    null, 
    null, 
    null 
}; 

,爲address.csv:

CellProcessor[] processor = new CellProcessor[] { 
    null, 
    null 
}; 

這甚至可能嗎?我在錯誤的軌道上實現這一目標嗎?

編輯1:尋找能夠處理具有在一個文件中的變量列的CSV文件的解決方案。我試圖找出是否可以在運行時處理任意的CSV文件,也就是說,我可以僅基於包含在CSV文件中的標題信息在運行時創建POJO。事先不知道csv文件將有多少列。基於答案

解決方案 和@baba評論

private static void readWithCsvListReader() throws Exception { 

     ICsvListReader listReader = null; 
     try { 
       listReader = new CsvListReader(new FileReader(fileName), CsvPreference.TAB_PREFERENCE); 

       listReader.getHeader(true); // skip the header (can't be used with CsvListReader) 
       int amountOfColumns=listReader.length(); 
       CellProcessor[] processor = new CellProcessor[amountOfColumns]; 
       List<Object> customerList; 

       while((customerList = listReader.read(processor)) != null) { 
         System.out.println(String.format("lineNo=%s, rowNo=%s, customerList=%s", listReader.getLineNumber(), 
           listReader.getRowNumber(), customerList)); 
       } 

     } 
     finally { 
       if(listReader != null) { 
         listReader.close(); 
       } 
     } 
} 

回答

3

也許有點晚,但可能會有所幫助......

CellProcessor[] processors=new CellProcessor[properties.size()]; 

    for(int i=0; i< properties.zise(); i++){ 
      processors[i]=new Optional(); 

    } 
    return processors; 
+0

'for(int i = 0; i Sid

1

這是一個很常見的問題,也有對internetz多個教程,包括超級的CSV頁:

http://supercsv.sourceforge.net/examples_reading_variable_cols.html

正如此行所示:

如下所示,可以通過調用executeProcessors()方法調用 read()後執行單元處理器。因爲在讀取CSV行之後完成了 ,所以您有機會檢查有多少列(使用listReader.length())並提供了正確數量的處理器。

+0

這似乎不是「變量列」實際上他們的意思_optional欄_。看起來您已經爲每個可能的列數提供了一個處理器,以使其工作。 – Kapep

+0

您可以通過解析頭文件預先觀察cols的數量,然後對您使用的處理器數量做出明智的決定。 –

+0

感謝@baba,我編輯我的問題更加精確。我知道我可以解析頭並計數列,但是如何在運行時創建一個具有動態數量參數的新CellProcessor對象(例如每列有一個「null」參數)? – Stefan