【问题标题】:Import CSV file to PostgreSQL database with weird text column使用奇怪的文本列将 CSV 文件导入 PostgreSQL 数据库
【发布时间】:2017-11-07 07:40:56
【问题描述】:

我需要将 100,000 个地址的地理编码结果导入我的数据库。结果以 CSV 文件的形式提供。我的同事使用 mySQL 导入了它。但是,我正在使用 PostgreSQL 并且导入不起作用。我正在尝试用 42 列填充一个空表。第二列包含来自地理编码 API 的原始数据作为文本。随后的列用逗号分隔。请以 CSV 中的显示方式查看一个地址的示例(稍后应在我的数据库中显示为一行)。 说清楚: 第一栏应填写 00012 VILLANOVA DI GUIDONIA, IT, 第二列包含原始数据, 确定的第三列, 第 4 列有 1, 拉齐奥第五纵队, 等等。

00012 VILLANOVA DI GUIDONIA, IT,"{\
   \"results\" : [\
      {\
         \"address_components\" : [\
            {\
               \"long_name\" : \"Villanova\",\
               \"short_name\" : \"Villanova\",\
               \"types\" : [ \"locality\", \"political\" ]\
            },\
            {\
               \"long_name\" : \"Guidonia\",\
               \"short_name\" : \"Guidonia\",\
               \"types\" : [ \"administrative_area_level_3\", \"political\" ]\
            },\
            {\
               \"long_name\" : \"Città Metropolitana di Roma\",\
               \"short_name\" : \"RM\",\
               \"types\" : [ \"administrative_area_level_2\", \"political\"      ]\
            },\
            {\
               \"long_name\" : \"Lazio\",\
               \"short_name\" : \"Lazio\",\
               \"types\" : [ \"administrative_area_level_1\", \"political\"     ]\
            },\
            {\
               \"long_name\" : \"Italy\",\
               \"short_name\" : \"IT\",\
               \"types\" : [ \"country\", \"political\" ]\
            },\
            {\
               \"long_name\" : \"00012\",\
               \"short_name\" : \"00012\",\
               \"types\" : [ \"postal_code\" ]\
            }\
         ],\
         \"formatted_address\" : \"00012 Villanova RM, Italy\",\
         \"geometry\" : {\
            \"bounds\" : {\
               \"northeast\" : {\
                  \"lat\" : 41.9732526,\
                  \"lng\" : 12.7654465\
               },\
               \"southwest\" : {\
                  \"lat\" : 41.9560237,\
                  \"lng\" : 12.745568\
                }\
            },\
            \"location\" : {\
               \"lat\" : 41.96298669999999,\
               \"lng\" : 12.7566109\
            },\
            \"location_type\" : \"APPROXIMATE\",\
            \"viewport\" : {\
               \"northeast\" : {\
                  \"lat\" : 41.9732526,\
                  \"lng\" : 12.7654465\
               },\
               \"southwest\" : {\
                  \"lat\" : 41.9560237,\
                  \"lng\" : 12.745568\
               }\
            }\
          },\
          \"place_id\" : \"ChIJQbO9a615LxMRMpoTF6_GZ2I\",\
         \"types\" : [ \"locality\", \"political\" ]\
      }\
   ],\
   \"status\" : \"OK\"\
}\
,OK",1,"Lazio","Città Metropolitana di Roma","Guidonia",\N,\N,\N,"Italy"\N,\N,"Villanova",\N,\N,\N,\N,\N,"00012",\N,\N,\N,\N,\N,\N,\N,\N,\N,\N,\N,\N,\N,\N,\N,41.962986,12.756611,"locality","locality, political",3148330,"00012 Villanova RM, Italy","2017-10-30 17:28:40"

我正在使用提示 PostgreSQL csv import from a MySQL csv export?

试过了

\COPY addresses_googleresponse from 'myfile.csv' with delimiter AS ',' NULL AS '\\N' ESCAPE E'\\' CSV

-> 错误:未终止的 csv 引用字段

使用提示

unterminated CSV quoted field in Postgres, 我试过了

\COPY addresses_googleresponse from 'myfile.csv' with delimiter AS ',' NULL AS '\\N' ESCAPE E'\\' quote E'\b'  CSV

-> 错误:“numresults”列缺少数据

我发现这种格式的第二列存在潜在问题,但看起来就是这样。 任何如何使用 \copy 导入它的想法(希望没有预处理)都非常受欢迎(我不能使用 copy,只能使用 \copy)。

【问题讨论】:

  • 我不认为\copy 可以处理多行记录。您将需要一个不同的工具来导入该数据。你知道你的同事用的是什么工具吗?
  • 我认为您的问题可以通过删除 CVS 文件中的 \r\n 来解决,您需要一行一行。

标签: postgresql csv import multiline


【解决方案1】:

您的 CSV 文件不正确。

文件以

开头
00012 VILLANOVA DI GUIDONIA, IT,"{\

你希望第一个字段是00012 VILLANOVA DI GUIDONIA, IT,对吧?

但无法判断第一个逗号是字段的一部分,而第二个逗号分隔字段。

您必须用引号括住地址。

同样,您想成为第三个字段的 ,OK", 实际上是多行数据字段的结尾,因为它位于分隔该字段的引号内。

只要引用正确,多行数据就没有问题。

【讨论】:

    【解决方案2】:

    我们解决了这个问题。对于那些感兴趣的人,以下代码有效:

    \COPY addresses_googleresponse from 'mytable.csv' with csv delimiter ',' null '\N' escape '\'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多