在开始提出问题和背景信息之前,我想说明一下,我意识到很多人都提出了类似的问题,但是他们所提问题的答案都没有应用于我的情况。
背景信息:我正在尝试正确格式化一个非常大的CSV文件,以便可以将其导入到PostgreSQL数据库中的表中。此CSV文件仅包含两个字段,分隔符为;
问题1:定界符是分号,并且其中一个字段中的许多值都包含分号。 PostgreSQL显然不喜欢这样。
解决方案1:我使用sed将分隔符更改为我知道只会作为分隔符出现的字符串。
问题2:分隔符只能是单个字符。
解决方案2:我将分隔符更改为一个Unicode字符,我知道除了分隔符以外,其他字符都不会出现。
问题3:分隔符只能是单字节字符。
解决方案#3:我决定返回步骤,而不是弄乱定界符,而是尝试使用sed将所有字段值括在双引号中,以避免出现某些包含定界符的值的问题字符。更具体地说,我尝试使用在此问题的答案中找到的命令-sed statement to change/modify CSV separators and delimiters
问题4:这会导致许多数据错误,因为任何时候在其中一个定界符中使用双引号,这都会导致Postgre SQL尝试复制太长且太长的值根本不是个人价值观。这行是一个完美的例子-
"m[redacted]@[redacted].com";"mk,l.";"/'"
该行特别使PostgreSQL认为它正在复制3列。更不用说这一行-
"[redacted]'";"of'";"all'";"your'";"[redacted]@[redacted].com";"[redacted]@[redacted].com:hapa[redacted]hoha"
这使PostgreSQL尝试将文件的其余部分作为单个值复制到第二个字段中。
说了这么多,我的最后一个问题是-如何将CSV文件中的每个值都用双引号引起来,以便将其正确导入到PostgreSQL中?
现在,我背对墙支持,并且希望得到任何建议,即使这不是一个明确的答案。我已经尝试了所有我能想到的。如果甚至有可能找到答案,我希望它可以应用于包含两个以上字段的CSV文件,因为在此答案之后我还有很多要导入的CSV文件。
答案 0 :(得分:0)
您声明两个字段中的一个可以包含分号。如果是这样(另一个字段永远不包含任何字段),则邻接该字段的第一个分号是定界符。如果包含分号作为数据一部分的字段是第一位的,那么您需要在该行上找到最后一个分号,否则要找到第一个。
我从没使用过SED,但是正则表达式允许您在字符的第一个或最后一个出现时进行匹配,因此您可以使用临时字符或模式替换此单个分号,那么您应该能够成功在字段周围加上引号,最后改回临时字段定界符。