2017-06-19 124 views
1

我使用Univocity解析器將結果集轉換爲CSV。如果字段存在於結果集中,我只希望用戶提供的字段出現在輸出CSV中。如果該字段不存在於結果集中,則相應的列應該爲空。我有一個不修改SQL查詢的限制。從CSV中排除字段

我使用的是excludeFields()方法,但它使輸出CSV中的字段值與分隔符一起留空。

例如:

Name, Age, Email 
Joe, 20, [email protected] 

施加排斥域excludeFields後( 「年齡」)。由於setHeaders()方法有一些已知問題,因此我使用自己的邏輯來設置標題。

Name, Email 
Joe, , [email protected] 

但我希望它是這樣的:

Name, Email 
Joe, [email protected] 

有沒有什麼辦法可以實現呢?

回答

1

目前,作者是由您定義的標題控制的。字段選擇只會讓作者在未選中的列中打印空白。

下一個版本將在寫入時提供列重新排序,它應該做你想做的。如果你可以使用2.5.0-SNAPSHOT它應該已經工作:

ResultSet resultSet = statement.executeQuery("SELECT * FROM users"); 

CsvWriterSettings csvWriterSettings = new CsvWriterSettings(); 
csvWriterSettings.excludeFields("Age"); 
csvWriterSettings.setHeaderWritingEnabled(true); 
csvWriterSettings.setColumnReorderingEnabled(true); //this does the trick 

CsvRoutines csvRoutines = new CsvRoutines(csvWriterSettings); 
csvRoutines.write(resultSet, output); 

希望它有幫助!

+0

感謝您的持續支持。當前我正在做的一個解決方法是在將結果集寫入它之後將StringWriter轉換爲InputStream:csvRoutines.write(resultSet,stringWriter)。將此InputStream饋送到CsvParser:csvParser.parse(new InputStreamReader(inputStream)),並調用csvParserSettings.selectFields(「Name」,「Email」),並再次使用CsvWriter寫入輸出csv。我不確定它是否是唯一有效的方法,但是如果結果集很大,我會發現在此過程中需要消耗大量時間。 – HyperioN

+0

我們什麼時候可以期待2.5.0的發佈?因爲我不認爲在生產環境中使用2.5.0-SNAPSHOT是不明智的。 – HyperioN

+0

您的解決方法可以正常工作。版本2.5.0將在一個月左右發佈。 –