3

我最近从 Informix 数据库中卸载了一个客户表,并且由于客户名称列包含非转义竖线(管道符号)字符,这是源数据库中的默认 DBDELIMITER,因此拒绝了几行。我发现他们的客户表单中的字段有一个输入掩码,允许输入任何字母数字字符,可以包括任何字母、数字或符号。所以我说服用户对该列进行全面更新,以将管道符号更改为分号。我还发现了在不同列中包含星号和逗号的其他行。我可以想象如果这张表以 csv 格式卸载会发生什么,或者星号会造成什么损害!

定义为分隔符的最佳字符是什么?如果表格已经被管道、逗号、星号、制表符、反斜杠等污染,那么清理它们的最佳方法是什么?

4

3 回答 3

5

在我的工作中,我必须处理大量的叙述性数据。这总是一场噩梦,因为用户倾向于在其中放置任何字符,包括不可打印的字符。您可以运行清理操作,但每次加载数据时都必须这样做,而且它可能不会永远有效。最终有人会将您选择的每个字符作为分隔符放入,如果您的 CSV 处理库可以正确处理转义,这不是问题,但很多人不能。如果这是一次加载/卸载,您可能没问题,但如果您必须更频繁地执行此操作....

过去,我将分隔符更改为反引号 '`'、波浪号 '~' 或脱字符号 '^'。目前的努力都失败了。我能想出的最佳解决方案是根本不使用 CSV 格式。我切换到 XML。即便如此,仍然存在 XML 非法字符,但可以使用 atlassian-xml-cleaner-0.1.jar 翻译出来。

于 2013-08-12T17:40:40.237 回答
1

使用默认管道卸载客户表;字符串搜索不存在的字符。IE。“~”

卸载到文件分隔符 "~" select * from customer;

清理文件(或不清理)(vi 替换字符串):g/theoldstring/s//thenewstring/g)或(unix 提示符)sed 's/old-char/new-char/g' fileold > filenew

(一旦 clean id 个人将卸载文件中的“~”更改回“|”或“,”作为 csv 标准)加载到源数据库。

于 2013-08-13T15:55:49.947 回答
0

如果可以,请使用多字符分隔符。它仍然可能失败,但它应该更不可能。

或者,在编写导出文件时转义分隔符(Informix 文档说“LOAD TABLE”通过在分隔符前面加上反斜杠来转义)。正确的 CSV 具有引用和转义,因此数据中是否包含逗号无关紧要,除非您的导出器和加载程序无法处理正确的 CSV。

于 2013-08-19T22:02:17.417 回答