【问题标题】:How to append CSV file with PostgreSQL query export in Datagrip?如何在 Datagrip 中使用 PostgreSQL 查询导出附加 CSV 文件?
【发布时间】: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 }) }
}

【问题讨论】:

    标签: postgresql csv groovy datagrip


    【解决方案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,这对我帮助很大。非常感谢!
    猜你喜欢
    • 2015-05-25
    • 2018-09-11
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多