Postgresql 面临正确格式化CSV数据的问题

Postgresql 面临正确格式化CSV数据的问题,postgresql,csv,sed,import,Postgresql,Csv,Sed,Import,在我开始我的问题和背景资料之前,我想说的是,我意识到很多人都问过类似的问题,但他们问题的答案都不适用于我的情况 背景信息:我正在尝试正确格式化一个非常大的CSV文件,以便将其导入到PostgreSQL数据库的表中。此CSV文件仅包含两个字段,分隔符为 遇到的问题/尝试的解决方案 问题#1:分隔符是分号,其中一个字段中的许多值都包含分号。PostgreSQL显然不喜欢这样 解决方案#1:我使用sed将分隔符更改为我知道只能作为分隔符出现的字符串 问题2:分隔符只能是单个字符 解决方案#2:我将分隔

在我开始我的问题和背景资料之前,我想说的是,我意识到很多人都问过类似的问题,但他们问题的答案都不适用于我的情况

背景信息:我正在尝试正确格式化一个非常大的CSV文件,以便将其导入到PostgreSQL数据库的表中。此CSV文件仅包含两个字段,分隔符为

遇到的问题/尝试的解决方案 问题#1:分隔符是分号,其中一个字段中的许多值都包含分号。PostgreSQL显然不喜欢这样

解决方案#1:我使用sed将分隔符更改为我知道只能作为分隔符出现的字符串

问题2:分隔符只能是单个字符

解决方案#2:我将分隔符更改为unicode字符,我知道除了分隔符以外不会出现其他字符

问题3:分隔符只能是单字节字符

解决方案#3:我决定回到我的步骤中,并没有弄乱分隔符,而是尝试使用sed将所有字段值括在双引号中,以避免某些值包含分隔符的问题。更具体地说,我尝试使用这个问题的答案中的命令-

问题#4:这导致了许多数据错误,因为任何时候一个分隔符出现在其中一个值中,都会在其周围加上双引号,这导致Postgre SQL试图复制太长且不是单个值的值。这一排就是一个完美的例子-

    "m[redacted]@[redacted].com";"mk,l.";"/'"
这一行尤其让PostgreSQL认为它在复制3列。更不用说这场争吵了-

    "[redacted]&#39";"of&#39";"all&#39";"your&#39";"[redacted]@[redacted].com";"[redacted]@[redacted].com:hapa[redacted]hoha"
这使得PostgreSQL试图将文件的整个剩余部分作为单个值复制到第二个字段中

问题: 说到这里,我的最后一个问题是——如何将CSV文件中的每个值用双引号括起来,以便正确地导入PostgreSQL

现在,我背靠着一堵墙,希望得到任何建议,即使这不是一个明确的答案。我已经尝试了我能想到的一切。如果答案是可能的,我想要一个可以应用于包含两个以上字段的CSV文件的答案,因为在这个答案之后,我还有更多的CSV文件要导入。

您声明这两个字段中的一个可以包含分号。如果是这样(另一个字段不包含任何内容),则与此字段相邻的第一个分号为分隔符。如果包含分号作为数据一部分的字段是第一个,则需要查找行中的最后一个分号,否则为第一个


我从未使用过SED,但正则表达式允许您在字符的第一次或最后一次出现时进行匹配,因此您可以用临时字符或模式替换此分号,然后您应该能够成功地在字段周围加引号,最后更改临时字段分隔符。

我知道我可以做到这一点,然而,这就是我所说的“黑客解决方案”,因为这个解决方案不适用于我以后必须导入的任何其他东西。此解决方案仅适用于1。第一个字段中的值肯定不包含分隔符和2的情况。只有两个字段。在此文件之后,我必须再导入205个CSV文件,其中肯定会包含多个包含2个以上字段的文件。如果每个文件都有不同但相似的问题,那么我同意,但我认为没有太多机会解决它。问题的根源在于提供数据的人。理想情况下,您可以通过任何渠道返回到它们,并让它们以不同的格式设置内容-简单到在CommaSV文件中使用逗号作为分隔符和/或在包含分隔符的任何字段值周围加引号。如果这是不可能的,那么我想你可能会做很多“黑客”解决方案。