Поскольку файл в целом не является допустимым JSON, вы не можете прочитать его как полуструктурированные данные.
Вы можете прочитать файл как CSV и собрать его с небольшим умом, если объекты разделенына внутренних }
символах:
CREATE OR REPLACE TABLE T (
LINE_NO NUMBER IDENTITY,
JSON TEXT
);
COPY INTO T(JSON) FROM (SELECT $1||'}' JSON FROM @my_stage/json.csv)
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = NONE RECORD_DELIMITER='}');
SELECT REC_NO, PARSE_JSON(LISTAGG(JSON) WITHIN GROUP (ORDER BY LINE_NO)) JSON FROM (
SELECT
SUM(CASE WHEN NEW_OBJ AND MOD(QUOTE_QTY_AGG - QUOTE_QTY, 2) = 0 THEN 1 ELSE 0 END)
OVER (ORDER BY LINE_NO) REC_NO, LINE_NO, JSON
FROM (
SELECT
REGEXP_COUNT(JSON, '"') - REGEXP_COUNT(JSON, '\\\\"') QUOTE_QTY,
SUM(REGEXP_COUNT(JSON, '"') - REGEXP_COUNT(JSON, '\\\\"'))
OVER (ORDER BY LINE_NO) QUOTE_QTY_AGG,
REGEXP_LIKE(JSON, '\\s*\\{\\s*".*') NEW_OBJ,
LINE_NO, JSON
FROM T
)
)
GROUP BY REC_NO
ORDER BY REC_NO;
Приведенный выше запрос (высовывающий мою голову здесь) анализирует любой"допустимый" (по модулю нескольких объектов) JSON, даже такие объекты, как {"{a}": "{{b}}"}
. Это достигается путем наблюдения следующего:
- Новый объект начинается с
{"
, но не в том случае, если {
находится внутри строки - Начало текущей строкине внутри строки, если число неэкранированных символов в двойных кавычках в предыдущих строках равно