Java 以CSV格式将记录从数据库转储到文件
我正在使用Java 以CSV格式将记录从数据库转储到文件,java,sql,jooq,Java,Sql,Jooq,我正在使用Jooq从数据库中读取数据,并将记录转储到文件中。 我想以CSV格式转储记录,并在每个记录之间添加新行。我查看了Jooq文档,在谷歌上进行了研究,但没有找到任何帮助Jooq支持CSV格式,但是如何将该特性合并到我的用例中呢 我正在使用以下代码转储文件中的记录: SelectQuery<Record> query = getDslContext().selectQuery(); try { @Cleanup FileO
Jooq
从数据库中读取数据,并将记录转储到文件中。
我想以CSV格式转储记录,并在每个记录之间添加新行。我查看了Jooq文档,在谷歌上进行了研究,但没有找到任何帮助Jooq
支持CSV格式
,但是如何将该特性合并到我的用例中呢
我正在使用以下代码转储文件中的记录:
SelectQuery<Record> query = getDslContext().selectQuery();
try {
@Cleanup FileOutputStream fileOutputStream = new FileOutputStream(FILE);
@Cleanup GZIPOutputStream gzipOutputStream = new GZIPOutputStream(fileOutputStream);
@Cleanup OutputStreamWriter outputStreamWriter = new OutputStreamWriter(gzipOutputStream, charsetName);
@Cleanup BufferedWriter writer = new BufferedWriter(outputStreamWriter);
@Cleanup Cursor<Record> cursor = query.fetchSize(MAX_FETCH_SIZE).fetchLazy();
while(cursor.hasNext()){
Result<Record> results = cursor.fetchNext(MAX_FETCH_SIZE);
for (Record record : results){
writer.write(record.formatJSON());
writer.newLine();
}
}
SelectQuery query=getDslContext().SelectQuery();
试一试{
@Cleanup FileOutputStream FileOutputStream=新的FileOutputStream(文件);
@Cleanup GZIPOutputStream GZIPOutputStream=新的GZIPOutputStream(fileOutputStream);
@Cleanup OutputStreamWriter OutputStreamWriter=新的OutputStreamWriter(gzip输出流,charsetName);
@Cleanup BufferedWriter writer=新的BufferedWriter(outputStreamWriter);
@Cleanup Cursor Cursor=query.fetchSize(MAX_FETCH_SIZE).fetchLazy();
while(cursor.hasNext()){
结果=cursor.fetchNext(最大取数大小);
记录(记录:结果){
write(record.formatJSON());
writer.newLine();
}
}
您可以直接从结果
格式化记录,而无需手动迭代每个记录
唯一的问题是,由于您是以MAX\u FETCH\u SIZE
批量获取记录,因此每个批的格式化csv将包含标题,您可能只需要在第一批中写入标题
@Cleanup Cursor<Record> cursor = query.fetchSize(2).fetchLazy();
boolean includeHeaders = true;
int dataStartIndex = 0;
while(cursor.hasNext()){
Result<Record> results = cursor.fetchNext(2);
String csv = results.formatCSV();
if (includeHeaders) {
writer.write(csv);
dataStartIndex = csv.indexOf('\n') + 1;
includeHeaders = false;
continue;
}
writer.write(csv.substring(dataStartIndex));
}
@Cleanup Cursor Cursor=query.fetchSize(2.fetchLazy();
布尔includeHeaders=true;
int dataStartIndex=0;
while(cursor.hasNext()){
结果=cursor.fetchNext(2);
字符串csv=results.formatCSV();
如果(包括领导){
writer.write(csv);
dataStartIndex=csv.indexOf('\n')+1;
includeHeaders=假;
继续;
}
write.write(csv.substring(dataStartIndex));
}
使用以下属性:
String csv = results.formatCSV(new CSVFormat().newline("\n\n"));
或者,由于您是在行子集的基础上迭代光标,您可能也希望删除标题:
String csv = results.formatCSV(new CSVFormat().newline("\n\n").header(false));
这还将在末尾生成两个尾随换行符,如果不需要,可以轻松删除它们:
csv = csv.trim();