Как правильно загружать форматы файлов CSV в Snowflake, которые содержат символы кавычек, заключающие строки в поля? - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь загрузить файл CSV со сцены в таблицу, которую я создаю из содержимого файла. Я создал формат файла с типом CSV и настройками, которые, по моему мнению, должны делиться на ',' и использовать '' 'в качестве возможного переноса строковых полей. Но поля все равно снова разделяются, если само содержимое содержитa ','. Кажется, что field_optionally_enclosed_by arg должен обрабатывать это, но это не так.

Вот мое определение формата файла:

create or replace file format mycsvformat
    type = csv
    field_delimiter = ','
    skip_header = 1
    field_optionally_enclosed_by = '"'
    null_if = 'NULL'
    EMPTY_FIELD_AS_NULL = TRUE;

Вот пример данных:

"ColumnA","ColumnB","ColumnC","ColumnD","ColumnE","ColumnF"
"01/01/2019 12:00:03 AM","",Some - Text, Some other text - 1234567890","","",Some more text"
"01/01/2019 12:00:03 AM","",Some - Text, Some other text - 1234567890","","",Some more text"

Вот инструкция создания таблицы:

create or replace temp table mycsvtable as select t.$1 ColumnA, t.$2 ColumnB, t.$3 ColumnC from @myteststage/mycsvfile.csv (file_format => mycsvformat) t;

Когда я окончательно выбираю все данные из таблицы, она разбивается на 7 столбцов с помощью:

  • 01/01/2019 12:00:03
  • Некоторые - Текст

  • Некоторые другиетекст - 1234567890 "
  • " Еще текст "

Что мне здесь не хватает? Кажется, что формат файла, который я настроил, должен обрабатывать поля как целые строки, и я бы предположил, что это означает, что не нужно разделять поле на разделитель «,». Но я не вижу другого формата файла arg, чтобы исправить это здесь.

Редактировать: Расширен пример данных и добавлен EMPTY_FIELD_AS_NULL в формат создания файла. Это должно провалиться, как я и ожидал. Я вижу еще несколько вариантов, когда даже символ кавычки сохраняется в выводе, но я пытаюсь санировать набор данных для публикации.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Даже пытаясь решить это вручную, я не уверен, как данные должны быть разделены .. Как насчет воссоздания файла CSV и выбора другого разделителя, такого как конвейер (|)? Это, возможно, уменьшит некоторую путаницу.

В противном случае, из приведенного вами примера, вы можете дать ожидаемый результат разделения?

0 голосов
/ 14 октября 2019

Я буквально вырезал и вставил ваш код, и он отлично работает. Проверьте правильность создания сцены и наличие необходимого файла на сцене?

create or replace stage hilda_csv_stage;

create or replace file format testcsv1
    type = csv
    field_delimiter = ','
    skip_header = 1
    field_optionally_enclosed_by = '"'
    null_if = 'NULL';

put file:///tmp/x.csv @hilda_csv_stage auto_compress=true;

create or replace temp table test1 as 
select t.$1 ColumnA, t.$2 ColumnB, t.$3 ColumnC 
from @hilda_csv_stage/x.csv (file_format => testcsv1) t;

select * from test1;
+------------------------+-------------------------------------------+----------------+
| COLUMNA                | COLUMNB                                   | COLUMNC        |
|------------------------+-------------------------------------------+----------------|
| 01/01/2019 12:00:03 AM | Some - Text, Some other text - 1234567890 | Some more text |
| 01/01/2019 12:00:03 AM | Some - Text, Some other text - 1234567890 | Some more text |
+------------------------+-------------------------------------------+----------------+
...