對於需要處理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();
}
}
}
'for(int i = 0; i
Sid