如何在Datagrip中通过PostgreSQL查询导出附加CSV文件?
我想使用Datagrip将PostgreSQL的查询结果附加到现有的CSV文件()中。 “执行到文件”可以很好地将查询结果导出为CSV文件。但很明显,这只会创建一个新文件,其中只包含查询结果。 我曾考虑将现有模板加载到datagrip中的groovy脚本中,然后将其内容添加到创建的文件的顶部,但在如何实现这一点上我没有取得任何进展 我找到了(也许?)如何加载文件,但我不知道如何实际使用它,并将其放在文件的顶部,以便将查询结果添加到文件的下方如何在Datagrip中通过PostgreSQL查询导出附加CSV文件?,postgresql,csv,groovy,datagrip,Postgresql,Csv,Groovy,Datagrip,我想使用Datagrip将PostgreSQL的查询结果附加到现有的CSV文件()中。 “执行到文件”可以很好地将查询结果导出为CSV文件。但很明显,这只会创建一个新文件,其中只包含查询结果。 我曾考虑将现有模板加载到datagrip中的groovy脚本中,然后将其内容添加到创建的文件的顶部,但在如何实现这一点上我没有取得任何进展 我找到了(也许?)如何加载文件,但我不知道如何实际使用它,并将其放在文件的顶部,以便将查询结果添加到文件的下方 fh = new File("C:/1.cs
fh = new File("C:/1.csv")
def csv_content = fh.getText('utf-8')
这就是我在加载文件时所得到的一切,我不知道如何继续使用它
或者,我考虑手动将模板的信息添加到脚本中,这样它就不必加载另一个文件,只需获取该信息,然后添加查询结果。如果你能告诉我如何直接添加这样的行,我也会很有帮助
Datagrip中包含的groovy脚本文件如下所示:
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
SEPARATOR = ","
QUOTE = "\""
NEWLINE = System.getProperty("line.separator")
def printRow = { values, valueToString ->
values.eachWithIndex { value, idx ->
def str = valueToString(value)
def q = str.contains(SEPARATOR) || str.contains(QUOTE) || str.contains(NEWLINE)
OUT.append(q ? QUOTE : "")
.append(str.replace(QUOTE, QUOTE + QUOTE))
.append(q ? QUOTE : "")
.append(idx != values.size() - 1 ? SEPARATOR : NEWLINE)
}
}
if (!TRANSPOSED) {
ROWS.each { row -> printRow(COLUMNS, { FORMATTER.format(row, it) }) }
}
else {
def values = COLUMNS.collect { new ArrayList<String>() }
ROWS.each { row -> COLUMNS.eachWithIndex { col, i -> values[i].add(FORMATTER.format(row, col)) } }
values.each { printRow(it, { it }) }
}
/*
*可用的上下文绑定:
*列列表
*不可分割的行
*OUT{append()}
*格式化程序{format(row,col);formatValue(Object,col);getTypeName(Object,col);isString(Object,col);}
*转置布尔
*加上所有_列、表格、方言
*
*其中:
*DataRow{rowNumber();first();last();data():列表;值(列):对象}
*DataColumn{columnNumber(),name()}
*/
分隔符=“,”
QUOTE=“\”“
NEWLINE=System.getProperty(“line.separator”)
def printRow={值,值字符串->
values.eachWithIndex{value,idx->
def str=valueToString(值)
def q=str.contains(分隔符)| | str.contains(引号)| | str.contains(换行符)
OUT.append(q?引号:“”)
.append(str.replace(引号,引号+引号))
.append(q?引号:“”)
.append(idx!=values.size()-1?分隔符:换行符)
}
}
如果(!转置){
ROWS.each{row->printRow(列,{FORMATTER.format(row,it)})}
}
否则{
def values=COLUMNS.collect{new ArrayList()}
ROWS.each{row->COLUMNS.eachWithIndex{col,i->values[i].add(FORMATTER.format(row,col))}
values.each{printRow(it,{it}}
}
您需要将文件内容传递给输出
变量,如下所示:
fh = new File("C:/1.csv")
def csv_content = fh.getText('utf-8')
OUT.append(csv_content).append("\n")
传递到OUT.append
的所有内容都将写入新文件
只需将其添加到脚本的开头:
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
SEPARATOR = ","
QUOTE = "\""
NEWLINE = System.getProperty("line.separator")
fh = new File("C:/1.csv")
def csv_content = fh.getText('utf-8')
OUT.append(csv_content).append("\n")
def printRow = { values, valueToString ->
values.eachWithIndex { value, idx ->
def str = valueToString(value)
def q = str.contains(SEPARATOR) || str.contains(QUOTE) || str.contains(NEWLINE)
OUT.append(q ? QUOTE : "")
.append(str.replace(QUOTE, QUOTE + QUOTE))
.append(q ? QUOTE : "")
.append(idx != values.size() - 1 ? SEPARATOR : NEWLINE)
}
}
if (!TRANSPOSED) {
ROWS.each { row -> printRow(COLUMNS, { FORMATTER.format(row, it) }) }
}
else {
def values = COLUMNS.collect { new ArrayList<String>() }
ROWS.each { row -> COLUMNS.eachWithIndex { col, i -> values[i].add(FORMATTER.format(row, col)) } }
values.each { printRow(it, { it }) }
}
/*
*可用的上下文绑定:
*列列表
*不可分割的行
*OUT{append()}
*格式化程序{format(row,col);formatValue(Object,col);getTypeName(Object,col);isString(Object,col);}
*转置布尔
*加上所有_列、表格、方言
*
*其中:
*DataRow{rowNumber();first();last();data():列表;值(列):对象}
*DataColumn{columnNumber(),name()}
*/
分隔符=“,”
QUOTE=“\”“
NEWLINE=System.getProperty(“line.separator”)
fh=新文件(“C:/1.csv”)
def csv_content=fh.getText('utf-8')
OUT.append(csv\u内容)。append(“\n”)
def printRow={值,值字符串->
values.eachWithIndex{value,idx->
def str=valueToString(值)
def q=str.contains(分隔符)| | str.contains(引号)| | str.contains(换行符)
OUT.append(q?引号:“”)
.append(str.replace(引号,引号+引号))
.append(q?引号:“”)
.append(idx!=values.size()-1?分隔符:换行符)
}
}
如果(!转置){
ROWS.each{row->printRow(列,{FORMATTER.format(row,it)})}
}
否则{
def values=COLUMNS.collect{new ArrayList()}
ROWS.each{row->COLUMNS.eachWithIndex{col,i->values[i].add(FORMATTER.format(row,col))}
values.each{printRow(it,{it}}
}
请注意,您可以将粘贴
CSV Groovy.CSV.Groovy
复制到同一目录(例如MY-CSV.CSV.Groovy
)并修改新文件。这个新的提取器将与所有提取器一起添加到combobox中非常感谢Liudmila,这对我帮助很大。我非常感激!