如何在 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 中的“脚本到...”选项?

Datagrip - 单击左侧面板中的模式名称时不显示表名称

Snowflake 是不是向 DataGrip 等 SQL 客户端提供解释计划中的成本信息?

如何在 DataGrip 中使用参数运行查询?

如何在 DataGrip 中打印查询结果?