如何使用Linux Shell和SnowSQL在JSON对象之间添加逗号?

huwehgph  于 2023-01-22  发布在  Linux
关注(0)|答案(1)|浏览(173)

虽然在Stack Overflow上有几篇关于这个主题的文章,但没有一篇与我的用例完全匹配。我正在使用Linux shell脚本运行SnowSQL来生成一个json文件。

我的json文件需要在json对象之间使用逗号。
这一点:

{
  "CAMPAIGN": "Welcome_New",
  "UUID": "fe881781-bdc2-41b2-95f2-e0e8c19dc597"
}
{
  "CAMPAIGN": "Welcome_Existing",
  "UUID": "77a41c02-beb9-48bf-ada4-b2074c1a78cb"
}

......需要看起来像这样:

{
  "CAMPAIGN": "Welcome_New",
  "UUID": "fe881781-bdc2-41b2-95f2-e0e8c19dc597"
},
{
  "CAMPAIGN": "Welcome_Existing",
  "UUID": "77a41c02-beb9-48bf-ada4-b2074c1a78cb"
}

下面是完整的ksh脚本:

#!/usr/bin/ksh

. /appl/.snf_logon
export SNOW_PKEY_FILE=$(mktemp ./pkey-XXXXXX)
trap "rm -f ${SNOW_PKEY_FILE}" EXIT
LibGetSnowCred

{
    
outFile=JSON_FILE_TYPE_TEST.json
inDir=/testing
outFileNm=@my_db.my_schema.my_file_stage/${outFile}

snowsql \
    --private-key-path $SNOW_PKEY_FILE \
    -o exit_on_error=true \
    -o friendly=false \
    -o timing=false \
    -o log_level=ERROR \
    -o echo=true <<!

COPY INTO ${outFileNm}

FROM (SELECT object_construct(
'UUID',UUID
,'CAMPAIGN',CAMPAIGN)
FROM my_db.my_schema.JSON_Test_Table
LIMIT 2)

FILE_FORMAT=(
TYPE=JSON
COMPRESSION=NONE                                                                                             
)
OVERWRITE=True
HEADER=False
SINGLE=True
MAX_FILE_SIZE=4900000000
;

get ${outFileNm} file://${inDir}/;
rm ${outFileNm};

!

if [ $? -eq 0 ]; then
    echo "Export successful"
else
    echo "ERROR in export"
fi

}

最佳实践是在SELECT期间还是在生成文件之后添加逗号?如何添加?

h7appiyu

h7appiyu1#

不管有没有这个逗号,文本仍然不是JSON,而只是一个看起来像JSON的随机文本。您导出了几行,每行作为一个独立的对象。您需要将所有这些对象聚集到一个数组中以生成有效的JSON。
对行数组进行编码的JSON如下所示:

[
  {
    "CAMPAIGN": "Welcome_New",
    "UUID": "fe881781-bdc2-41b2-95f2-e0e8c19dc597"
  },
  {
    "CAMPAIGN": "Welcome_Existing",
    "UUID": "77a41c02-beb9-48bf-ada4-b2074c1a78cb"
  }
]

生成此输出的最简单方法是询问数据库是否支持此选项(在生成JSON之前将所有记录 Package 到一个列表中,而不是在单独的JSON中导出每条记录)。
如果这不可能,那么您有一个包含多个JSON的文件,您可以使用jq将这些单独的JSON转换为类似于上面描述的JSON(编码对象数组)。
事情就这么简单:

jq --slurp '.' input_file > output_file

选项--slurp告诉jq从内存中的input_file文件中读取所有JSON,解析它们并将它们放入一个数组中,这是程序的输入。
'.'jq程序。它说 “转储当前对象”。它不对输入数据做任何处理。当前对象是数组。
在执行程序之后(在本例中,它什么也不做),jq将修改后的值(当然是JSON)转储到标准输出(默认情况下,在屏幕上)。
> output_file部分将此输出重定向到一个文件(名为output_file),而不是在屏幕上显示。
你可以在jq操场上看到how it works

相关问题