私はいくつかのデータを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を取得するにはどうすればよいですか?
CSV spec によると、フィールドを囲む引用符とフィールド内の引用符はCSV形式の一部であり、ここでは必須です。
改行(CRLF)、二重引用符、およびコンマを含むフィールドは、二重引用符で囲む必要があります
フィールドを囲むために二重引用符を使用する場合、フィールド内に表示される二重引用符は、その前に別の二重引用符を付けることでエスケープする必要があります。
私はあなたがあなたのケースで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
を使用してヘッダーとフッターを削除することもできます。
クエリにパラメーターを追加するだけです。
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';
以下も参照してください。