Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres COPY命令-带逗号的字段,用双引号引起来_Postgresql_Csv_Copy - Fatal编程技术网

Postgresql Postgres COPY命令-带逗号的字段,用双引号引起来

Postgresql Postgres COPY命令-带逗号的字段,用双引号引起来,postgresql,csv,copy,Postgresql,Csv,Copy,我已经搜索并找到了一些关于postgres csv导入的帖子,但是没有任何东西可以解决我当前的问题 我一直使用postgres copy命令将来自异构数据源的数据带到我们的系统中。目前正在处理一个1亿行的.csv文件,以逗号引号分隔。问题在于这样的行: 009098,0981098094,"something","something else",""this one, well, is a problem"", "another thing" 用嵌入逗号的双引号括起来的字段。字段未正确解析,我

我已经搜索并找到了一些关于postgres csv导入的帖子,但是没有任何东西可以解决我当前的问题

我一直使用postgres copy命令将来自异构数据源的数据带到我们的系统中。目前正在处理一个1亿行的.csv文件,以逗号引号分隔。问题在于这样的行:

009098,0981098094,"something","something else",""this one, well, is a problem"", "another thing"
用嵌入逗号的双引号括起来的字段。字段未正确解析,我得到错误信息:

"ERROR:  extra data after last expected column" 
通常当出现这种情况时,我会特别处理有问题的行,但这个文件太大了,我希望能找到一些更通用的方法来防御它。不可能要求修改数据格式

copy mytable from '/path/to/file.csv' csv header quote '"'

那是格式不正确的CSV。将双引号加倍以在引号字段中嵌入双引号;例如:

"where","is ""pancakes""","house?"
有三个值:

哪里 这是煎饼 房屋 您遇到问题的行有两个双引号:

009098,0981098094,"something","something else",""this one, well, is a problem"", "another thing"
                                               ^^                            ^^ 
我不认为有什么办法可以解决这个问题,因为正确的版本是模棱两可的:是这一个,好吧,是一个问题还是这一个,好吧,是一个问题

我想你得用手把它修好。如果您能够唯一地识别断开的行,那么快速sed one-liner应该能够完成这项工作

出于参考目的,我见过的最接近CSV标准的东西是,第二节有这样一句话:

5.但是,每个字段可以用双引号括起来,也可以不用双引号括起来 有些程序,如Microsoft Excel,不使用双引号 完全如果字段没有用双引号括起来,则 双引号不能出现在字段内。例如: aaa、bbb、ccc CRLF zzz,yyy,xxx [...] 7.如果使用双引号括起字段,则使用双引号 出现在字段中时,必须在其前面加上 另一个双引号。例如: aaa、bbb、ccc
那是格式不正确的CSV。将双引号加倍以在引号字段中嵌入双引号;例如:

"where","is ""pancakes""","house?"
有三个值:

哪里 这是煎饼 房屋 您遇到问题的行有两个双引号:

009098,0981098094,"something","something else",""this one, well, is a problem"", "another thing"
                                               ^^                            ^^ 
我不认为有什么办法可以解决这个问题,因为正确的版本是模棱两可的:是这一个,好吧,是一个问题还是这一个,好吧,是一个问题

我想你得用手把它修好。如果您能够唯一地识别断开的行,那么快速sed one-liner应该能够完成这项工作

出于参考目的,我见过的最接近CSV标准的东西是,第二节有这样一句话:

5.但是,每个字段可以用双引号括起来,也可以不用双引号括起来 有些程序,如Microsoft Excel,不使用双引号 完全如果字段没有用双引号括起来,则 双引号不能出现在字段内。例如: aaa、bbb、ccc CRLF zzz,yyy,xxx [...] 7.如果使用双引号括起字段,则使用双引号 出现在字段中时,必须在其前面加上 另一个双引号。例如: aaa、bbb、ccc
下面是基于Kernighan和Plauger提供的CSV代码的代码,该代码已被改编用于处理格式怪异的CSV数据。这并不难做到;我已经完成了主代码的工作和打包,所以我只需要添加CSV输出函数并修改advquoted函数来处理这个问题中的奇怪格式

009098,0981098094,"something","something else",""this one, well, is a problem"", "another thing"
123458,1234561007,"anything","nothing else",""this one, well, is a problem"","dohicky
503458,1234598094,"nothing","everything else","""this one, well, it isn't a problem""","abelone"
610078,1236100794,"everything","anything else","this ""isn't a problem"", he said.","Orcas Rule"
csv2.h 示例输出
字段打印两次,一次用于测试字段提取,一次用于测试字段打印。您可以通过删除csvputline之外的打印来简化输出,从而将文件从格式错误的CSV转换为格式正确的CSV。

以下是基于Kernighan和Plauger提供的CSV代码的代码,该代码已被改编以处理格式错误的CSV数据。这并不难做到;我已经完成了主代码的工作和打包,所以我只需要添加CSV输出函数并修改advquoted函数来处理这个问题中的奇怪格式

009098,0981098094,"something","something else",""this one, well, is a problem"", "another thing"
123458,1234561007,"anything","nothing else",""this one, well, is a problem"","dohicky
503458,1234598094,"nothing","everything else","""this one, well, it isn't a problem""","abelone"
610078,1236100794,"everything","anything else","this ""isn't a problem"", he said.","Orcas Rule"
csv2.h 示例输出
字段打印两次,一次用于测试字段提取,一次用于测试字段打印。您可以通过删除csvputline之外的打印来简化输出,从而将文件从格式错误的CSV转换为格式正确的CSV。

您可以编写mytable列定义列表吗?CSV格式错误。在带引号的字段中,双引号的出现也应带双引号。所以,这个,嗯,是一个畸形的问题;要么是这个,好吧,这是个问题,要么是这个,好吧,这是个问题。宽松的CSV解析器会看到前面的两个双引号,将其解释为一个空字段,然后继续到逗号,包括单词this one,然后停止该字段,生成额外的字段,最后引号中的另一个空字符串有问题,依此类推。@JonathanLeffler:你知道更权威的吗
我的CSV导入工具包是标准库、sed、猜测工作和烈性酒的组合。这样一种令人讨厌和不愉快的格式:看起来既好又简单,但每个程序都有自己的怪癖。有趣的是,您提到了2.6,我使用的大多数库都需要明确的指令来处理嵌入的换行符,这可能是因为其他人也省略了2.6。严格地说,逗号后面的空格在另一个事物之前的格式也不正确。我认为您可能需要编写一个自定义CSV解析器来识别并修复这种格式错误的格式。有一个程序可以为你做各种奇妙的事情,但我怀疑它是否能处理这种格式错误的格式,除非有一个已知的异常数据源。最好让提供原始损坏数据的人员不间断地重新提供数据。如果做不到这一点,您可能必须进行修复。您可以编写列的mytable定义列表吗?CSV格式不正确。在带引号的字段中,双引号的出现也应带双引号。所以,这个,嗯,是一个畸形的问题;要么是这个,好吧,这是个问题,要么是这个,好吧,这是个问题。一个宽松的CSV解析器会看到前面的两个双引号,将其解释为一个空字段,然后继续到逗号,包括单词this one,然后停止该字段,为well生成额外的字段,最后引号中的另一个空字符串有问题,等等。@JonathanLeffler:你知道有比RFC 4180更权威的CSV参考吗?@JonathanLeffler:我的CSV导入工具包是标准库、sed、猜测工作和烈酒的组合。这样一种令人讨厌和不愉快的格式:看起来既好又简单,但每个程序都有自己的怪癖。有趣的是,您提到了2.6,我使用的大多数库都需要明确的指令来处理嵌入的换行符,这可能是因为其他人也省略了2.6。严格地说,逗号后面的空格在另一个事物之前的格式也不正确。我认为您可能需要编写一个自定义CSV解析器来识别并修复这种格式错误的格式。有一个程序可以为你做各种奇妙的事情,但我怀疑它是否能处理这种格式错误的格式,除非有一个已知的异常数据源。最好让提供原始损坏数据的人员不间断地重新提供数据。如果做不到这一点,您可能不得不进行修复。