如何在 Datagrip 中使用 PostgreSQL 查询导出附加 CSV 文件?

How to append CSV file with PostgreSQL query export in Datagrip?

我想在现有 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 }) }
}

您需要像这样将文件内容传递给 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)并修改新文件。这个新的提取器将与所有提取器一起添加到组合框中