如何在 Datagrip 中使用 PostgreSQL 查询导出附加 CSV 文件?
Posted
技术标签:
【中文标题】如何在 Datagrip 中使用 PostgreSQL 查询导出附加 CSV 文件?【英文标题】:How to append CSV file with PostgreSQL query export in Datagrip? 【发布时间】:2021-05-25 06:38:32 【问题描述】:我想在现有的 CSV 文件 (Template for Google Ads Offline Conversion Tracking) 中附加使用 Datagrip 从 PostgreSQL 查询的结果。 执行到文件可以很好地将查询结果导出为 CSV 文件。但显然这只是创建了一个只包含查询结果的新文件。 我正在考虑在 datagrip 中的 groovy 脚本中加载现有模板,然后将其内容添加到创建的文件的顶部,但我无法在如何执行此操作方面取得任何进展。
我发现(也许?)如何加载文件,但我不知道如何实际使用它并将其放在文件顶部,以便可以在其下方添加查询结果。
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 )
【问题讨论】:
【参考方案1】:您需要将文件内容传递给OUT
变量,如下所示:
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 )
请注意,您可以将CSV-Groovy.csv.groovy
复制粘贴到同一目录(例如MY-CSV.csv.groovy
)并修改新文件。这个新的提取器将与所有提取器一起添加到组合框中
【讨论】:
非常感谢 Liudmila,这对我帮助很大。非常感谢!以上是关于如何在 Datagrip 中使用 PostgreSQL 查询导出附加 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章
在 psql shell 中所做的更改不会显示在 Datagrip 会话中
Datagrip - 单击左侧面板中的模式名称时不显示表名称