我想导出Bigquery中的列值,如下所示:
| NAME | JSON |
| abc | {"test": 1} |
但是,当我想通过python代码将其导出到gzip压缩的csv / tsv到具有字段分隔符='\ t'(https://google-cloud.readthedocs.io/en/latest/bigquery/generated/google.cloud.bigquery.client.Client.extract_table.html)的Google云存储时,我总是得到类似的东西:
| NAME | JSON |
| abc | "{""test"": 1}" |
我知道转义,并且我一直在尝试转义(使用“”来转义“或添加-values)的多种可能性,但我似乎无法获得导出的信息:
{"test": 1}
请帮助我吗?
答案 0 :(得分:2)
工具输出正确,但是您需要阅读RFC 4180(CSV文件的标准)以了解原因。
基本上,JSON spec说test
需要带双引号,即"test"
。
在CSV中允许在整个字段中使用双引号。但是CSV规范还指出,在带引号字段的CSV中,内部引号是重复的。这是RFC 4180第2部分的规则7:
如果使用双引号将字段括起来,则使用双引号 出现在字段中的内容必须通过在前面加上来进行转义 另一个双引号。例如:
“ aaa”,“ b”,“ bb”,“ ccc”
那该怎么解决?
可能地,您需要一个符合RFC 4180的CSV阅读器,因此您不必自己在使用文件的地方编写解析代码。
您可以将双精度双引号替换为单双引号,并将大括号处的引号替换为以下形式:
sed -e 's/"{/{/g; s/}"/}/g; s/""/"/g;' in.csv > out.csv
转换
"{""test"": 1}"
到
{ "test": 1}
或在JavaScript中使用String.replace
,但随后生成的csv文件不符合RFC 4180。