web-dev-qa-db-ja.com

Postgresqlでcsv有効なjsonにダンプする方法は?

私はいくつかのデータをjsonとしてダンプしようとしています:

\copy (SELECT json_build_object('areaSqft',area_sqft, 'titleNos',title_nos, 'buildingIds',building_ids, 'geometry',geom_json) FROM my_data) to my_data.csv with delimiter ',' csv header

私が期待しているのは、行ごとに有効なjsonですが、私が得るものは次のとおりです:

"{""areaSqft"": 214.394254595041, ""geometry"": {""type"": ""MultiPolygon"", ""coordinates"": [[[[0.000015, 51.449107], [0.000154, 51.441108], [0.000238, 51.44111], [0.00024, 51.441052], [0.000137, 51.441051], [0.000041, 51.441049], [0.000015, 51.441107]]]]}, ""titleNos"": [""ZB78669""], ""buildingIds"": [7521141, 9530393, 7530394]}"

余分な"最初と最後の文字および""単一の代わりに"

不要な引用を取り除いた有効なjsonを取得するにはどうすればよいですか?

3
Randomize

CSV spec によると、フィールドを囲む引用符とフィールド内の引用符はCSV形式の一部であり、ここでは必須です。

  1. 改行(CRLF)、二重引用符、およびコンマを含むフィールドは、二重引用符で囲む必要があります

  2. フィールドを囲むために二重引用符を使用する場合、フィールド内に表示される二重引用符は、その前に別の二重引用符を付けることでエスケープする必要があります。

私はあなたがあなたのケースでCSVを望まないか、必要としないと思います。 SELECTの出力を取得し、unaligned形式のpsqlを使用します。

=# \pset format unaligned 
Output format is unaligned.

=# select json_build_object('foo', 1, bar, 2) AS myjson
   from (values (E'xy\zt'), ('ab,cd')) as b(bar);

myjson
{"foo" : 1, "xyzt" : 2}
{"foo" : 1, "ab,cd" : 2}
(2 rows)

クエリの最後にセミコロンの代わりに\g output.jsonを使用して、psqlにそのクエリの結果をファイルにリダイレクトさせ、\pset tuples_onlyを使用してヘッダーとフッターを削除することもできます。

3
Daniel Vérité

クエリにパラメーターを追加するだけです。

COPY (
       SELECT row_to_json(fruit_data) FROM (
          SELECT
        name AS fruit_name,
             quantity
             FROM data
              ) fruit_data
         , TRUE  -- add this parameter 
           ) TO 'a.file';

以下も参照してください。

2
Steve Ruben