2017-06-19 77 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将在一个月左右发布。 –