我在将 CSV 数据加载到雪花表时遇到问题。字段用双引号括起来,因此将它们导入表中存在问题。

我知道 COPY TO 具有 CSV 特定选项 FIELD_OPTIONALLY_ENCLOSED_BY = '"' 但它根本不起作用。

以下是一些表定义和复制命令的图片:

CREATE TABLE ...
(
GamePlayId NUMBER NOT ,csv,import,snowflake-cloud-data-platform"/>
	














首页 > 解决方案 > 使用 COPY TO 将引用的数字从 CSV 加载到雪花表中

我在将 CSV 数据加载到雪花表时遇到问题。字段用双引号括起来,因此将它们导入表中存在问题。

我知道 COPY TO 具有 CSV 特定选项 FIELD_OPTIONALLY_ENCLOSED_BY = '"' 但它根本不起作用。

以下是一些表定义和复制命令的图片:

CREATE TABLE ...
(
GamePlayId NUMBER NOT 

问题描述

我在将 CSV 数据加载到雪花表时遇到问题。字段用双引号括起来,因此将它们导入表中存在问题。

我知道 COPY TO 具有 CSV 特定选项 FIELD_OPTIONALLY_ENCLOSED_BY = '"' 但它根本不起作用。

以下是一些表定义和复制命令的图片:

CREATE TABLE ...
(
GamePlayId NUMBER NOT NULL,
etc...
....);


COPY INTO ...
     FROM ...csv.gz'
FILE_FORMAT = (TYPE = CSV 
               STRIP_NULL_VALUES = TRUE 
               FIELD_DELIMITER = ',' 
               SKIP_HEADER = 1  
               error_on_column_count_mismatch=false 
               FIELD_OPTIONALLY_ENCLOSED_BY = '"'
              )
ON_ERROR = "ABORT_STATEMENT"
;

CSV 文件如下所示:

"3922000","14733370","57256","2","3","2","2","2019-05-23 14:14:44",",00000000",",00000000",",00000000",",00000000","1000,00000000","1000,00000000","1317,50400000","1166,50000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000"

我收到一个错误

'''Numeric value '"3922000"' is not recognized '''

我很确定这是因为当雪花正在读取“”标记时,NUMBER 值被解释为字符串,但是因为我使用

FIELD_OPTIONALLY_ENCLOSED_BY = '"' 

它甚至不应该在那里......有没有人对此有一些解决方案?


定义实体方法以渲染为树枝块

我想以更加面向对象的方式编写我的视图层,以利用面向对象模型的一些好处。我想作为一个开始为我的模型定义一种行为,以便能够指定一种由 Twig 呈现的方式。

我看到了这个视频,很好地反映了我的想法。

例如,假设我有一个用户模型,我想在我网站的多个位置显示。我想定义一个“Twigable”接口,它的方法告诉 twig 如何渲染这个模型。

我将如何以可扩展的方式实现这一点?

编辑:我做了一点实验。现在没有太多抽象,包括在这里可能指向我所追求的。

我有我的模型 User.php:

<?php

namespace App\Model;

use Twig\Environment;

class User
{
    private $name;
    private $age;
    private $city;

    public function __construct(string $name, int $age, string $city) {
        $this->name = $name;
        $this->age = $age;
        $this->city = $city;
    }

    public function render(Environment $twig)
    {
        return $twig->load('model/user.html.twig')->render(['name' => $this->name]);
    }
}

然后,我从我的模板添加到我的配置中,以将 twig 环境传递给 render 方法:

twig:
    globals:
        twig_env: '@Twig\Environment'

我将 User 类的一个实例传递给模板:

// ... inside the controller action
        $user = new \App\Model\User('John Doe', 40, 'London');

        return $this->render('index.html.twig', [
            'user' => $user,
        ]);
// ...

最后,在模板中:

{# ... inside index.html.twig #}
{% block body %}
{{ user.render(twig_env) }}
{% endblock %}
{# ... #}

现在,twig 模板不再需要“知道”我的 User 类的样子,只需知道它存在并且可以显示。

这是一个好主意吗?

标签: csvimportsnowflake-cloud-data-platform

解决方案


假设您的数字是欧洲格式的,小数位,并且.数千,阅读数字格式帮助,似乎 Snowflake 不支持将其作为输入。我会打开一个功能请求。

但是,如果您阅读 as 中的列,text则使用REPLACE之类的

SELECT '100,1234'::text as A
    ,REPLACE(A,',','.') as B
    ,TRY_TO_DECIMAL(b, 20,10 ) as C;

给出:

A         B         C
100,1234  100.1234  100.1234000000

更安全的是首先剥离占位符

SELECT '1.100,1234'::text as A
  ,REPLACE(A,'.') as B
  ,REPLACE(B,',','.') as C
  ,TRY_TO_DECIMAL(C, 20,10 ) as D;

推荐阅读