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();