我最近从Informix数据库中卸载了一个客户表,并且几行被拒绝,因为客户名称列包含非转义竖条(管道符号)字符,这是源数据库中的默认DBDELIMITER。我发现客户表单中的字段有一个输入掩码,允许输入任何字母数字字符,包括任何字母,数字或符号。所以我说服用户对该列进行全面更新,将管道符号更改为分号。我还发现其他行包含不同列中的星号和逗号。我可以想象如果这个表以csv格式卸载或者星号可以造成什么损坏会发生什么!
定义为分隔符的最佳字符是什么? 如果表已经被管道,逗号,星号,标签,反斜杠等污染了,那么清理它们的最佳方法是什么?
答案 0 :(得分:4)
我必须在工作中处理大量的叙事数据。这总是一场噩梦,因为用户容易在其中放置任何角色,包括不可打印的角色。您可以运行清理操作,但每次加载数据时都必须执行此操作,并且可能无法永久运行。最终有人会将您选择的每个字符作为分隔符放入,如果您的CSV处理库可以正确处理转义,这不是问题,但很多人不能。如果这是一次加载/卸载,你可能很好,但如果你不得不经常这样做....
在过去,我已经将分隔符更改为后面的''',代字号'〜'或者插入符'^'。在目前的努力中都失败了。我能想到的最好的解决方案是根本不使用CSV格式。我切换到XML。即便如此,仍然存在XML非法字符,但这些字符可以使用atlassian-xml-cleaner-0.1.jar翻译出来。
答案 1 :(得分:1)
使用默认管道卸载客户表;字符串搜索不存在的字符。即。 “〜”
卸载到文件分隔符“〜” select * from customer;
清理文件(或不清洁) (vi replace string):g / theoldstring / s // thenewstring / g) 要么 (unix提示)sed's / old-char / new-char / g'fileold> filenew
(一旦干净的id个人在卸载文件中将“〜”改回“|”或“,”作为csv标准) 加载到源数据库。
答案 2 :(得分:0)
如果可以,请使用多字符分隔符。它仍然可能失败,但它应该是非常不可能的。
或者,在编写导出文件时转义分隔符(Informix docs说“LOAD TABLE”通过在带有反斜杠的前缀字符前缀来转义)。正确的CSV具有引用和转义功能,因此除非您的导出器和加载程序无法处理正确的CSV,否则数据中是否包含逗号无关紧要。