【问题标题】:How do you correctly load CSV file formats in Snowflake which have quote characters wrapping string fields?如何在 Snowflake 中正确加载包含引号字符环绕字符串字段的 CSV 文件格式?
【发布时间】:2020-02-10 12:28:45
【问题描述】:

我正在尝试将 CSV 文件从阶段加载到我从文件内容创建的表中。我创建了一个 CSV 类型的文件格式和我认为应该在 ',' 上拆分的设置,并使用 '"' 作为可能的字符串字段换行。但是如果内容本身包含,这些字段仍然会再次拆分一个','。似乎 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 AM
  • 一些 - 文字

  • 其他一些文字 - 1234567890"
  • “还有一些文字”

我在这里缺少什么?似乎我设置的文件格式应该将字段视为整个字符串,我认为这意味着不要在“,”分隔符上拆分字段。但是,我在这里看不到另一种文件格式 arg 来解决这个问题。

编辑:扩展示例数据并将 EMPTY_FIELD_AS_NULL 添加到创建文件格式。这应该像我预期的那样失败。我看到还有一些其他变体,即使是引号字符也保留在输出中,但我正在尝试清理数据集以进行发布。

【问题讨论】:

  • 您确定样本数据正确吗?看起来奇怪的地方有双引号。

标签: snowflake-cloud-data-platform


【解决方案1】:

我确实剪切并粘贴了您的代码,它工作正常。检查您的舞台创建是否正确,以及舞台中的文件是否正确?

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 |
+------------------------+-------------------------------------------+----------------+

【讨论】:

  • 好点!我对要发布的数据集进行了清理,并删除了错误。我测试了你所拥有的,然后对该测试数据集进行了一些添加,并且能够让它失败,我看到了。我用无法正确拆分的新数据更新了上面的数据集。
【解决方案2】:

即使尝试手动解决,我也不确定应该如何拆分数据。如何重新创建 CSV 文件并选择另一个分隔符,例如竖线 (|)?这或许可以减少一些混乱。

否则,从您给出的示例中,您能否给出预期的拆分输出?

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多