从CSV中排除字段
问题描述:
我使用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]
有没有什么办法可以实现呢?
答
目前,作者是由您定义的标题控制的。字段选择只会让作者在未选中的列中打印空白。
下一个版本将在写入时提供列重新排序,它应该做你想做的。如果你可以使用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);
希望它有帮助!
感谢您的持续支持。当前我正在做的一个解决方法是在将结果集写入它之后将StringWriter转换为InputStream:csvRoutines.write(resultSet,stringWriter)。将此InputStream馈送到CsvParser:csvParser.parse(new InputStreamReader(inputStream)),并调用csvParserSettings.selectFields(“Name”,“Email”),并再次使用CsvWriter写入输出csv。我不确定它是否是唯一有效的方法,但是如果结果集很大,我会发现在此过程中需要消耗大量时间。 – HyperioN
我们什么时候可以期待2.5.0的发布?因为我不认为在生产环境中使用2.5.0-SNAPSHOT是不明智的。 – HyperioN
您的解决方法可以正常工作。版本2.5.0将在一个月左右发布。 –