使用正确的引号从Bigquery导出表中的JSON值

时间:2019-02-15 14:34:32

标签: json csv google-bigquery double-quotes

我想导出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}

请帮助我吗?

1 个答案:

答案 0 :(得分:2)

工具输出正确,但是您需要阅读RFC 4180(CSV文件的标准)以了解原因。

基本上,JSON spectest需要带双引号,即"test"

在CSV中允许在整个字段中使用双引号。但是CSV规范还指出,在带引号字段的CSV中,内部引号是重复的。这是RFC 4180第2部分的规则7:

  
      
  1. 如果使用双引号将字段括起来,则使用双引号      出现在字段中的内容必须通过在前面加上来进行转义      另一个双引号。例如:

         

    “ aaa”,“ b”,“ bb”,“ ccc”

  2.   

那该怎么解决?

可能地,您需要一个符合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。