使用奇怪的文本列

时间:2017-11-07 07:40:57

标签: postgresql csv import multiline

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

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)。

2 个答案:

答案 0 :(得分:0)

您的CSV文件不正确。

文件以

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

并且您希望第一个字段为00012 VILLANOVA DI GUIDONIA, IT,对吗?

但是没有办法告诉第一个逗号是字段的一部分,而第二个逗号分隔字段。

你必须用引号括住地址。

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

只要您获得正确的报价,拥有多行数据就没有问题。

答案 1 :(得分:0)

我们解决了这个问题。对于那些受到关注的人,以下代码有效:

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