2011-09-27 115 views
3

我需要在一组400k +字符串记录中查找并清理换行符,回车符,制表符和“SUB”字符,但是这个DB2环境正在执行收费我。DB2/iSeries SQL清理CR/LF,制表符等

想到我可以用REPLACE()和CHR()函数进行一些搜索和替换,但似乎CHR()在此系统上不可用(错误:CHR * * LIBL类型* N未找到)。 \ t,\ r,\ n等工作似乎也没有工作。字符可以位于字符串的中间或位于字符串的末尾。

DBMS = DB2 
System = iSeries 
Language = SQL 
Encoding = Not sure, possibly EBCDIC 

任何提示,我可以用这个做什么?

+0

您可以随时导出数据,处理并放回原处。我以前做过这个。我已经使用Squirrel SQL将DB2表移动到MySQL进行测试,然后再回到DB2进入生产环境(许多千兆字节)。使用松鼠的问题包括:缺乏进度指示,需要将整个表格保存在内存中,包括SLQ标记,因此您需要增加Java内存限制。取决于字符串大小,但有几个希望就足够了。这也必须在本地完成,否则带宽可能会成为问题。 – Quaternion

+0

噢,还有一件事...因为关键字和引用的区别,您可能需要应用一对正则表达式才能导入。真的没有什么搜索和替换在一个体面的文本编辑器不应该能够处理(假设它可以处理至少400K的记录!)哦,松鼠甚至会为你写表格定义。 – Quaternion

回答

3

如果要清除回车符(EBCDIC x'0d')和换行符(EBCDIC x'25')等特定字符,应找到translated character in EBCDIC,然后使用TRANSLATE()函数将它们替换为空格。

如果你只是想删除不可显示的字符,然后在x'40'下寻找任何东西。

+2

+1这是另一个不错的转换表:http://www.simotime.com/asc2ebc1.htm –

+2

实际上,换行符是EBCDIC x'25'。 x'0A'是ASCII码中的LF。 –

+0

DOH!谢谢约翰 –

1

尝试TRANSLATE或REPLACE。

蛮力方法涉及使用POSITION找到错误的字符,然后SUBSTR之前和之后。 CONCAT两个子字符串(减去不需要的字符)重新组成列。

字符编码几乎肯定是EBCDIC字符集之一。根据表格如何被首先加载,CR可以是x'0d'和LF x'15',x'25'。找到一个简单的方法是进入绿色屏幕并对桌子做DSPPFM。按F10,然后按F11查看表格是原始的,十六进制(过/不足)格式。

1

也许TRANSLATE()函数将满足您的需求。

TRANSLATE(data, tochars, fromchars) 

...其中fromchars是集你不想要的字符,并tochars是你希望他们替换为相应的字符。您可能必须以十六进制格式编写该文件,如x'nnnnnn...',您将需要知道您正在使用的字符集。 在你的表上使用DSPFFD命令应该显示你的字段的CCSID。

5

我用这个SQL找到x'25' 和x'0D“:

SELECT 
    <field> 
    , LOCATE(x'0D', <field>) AS "0D" 
    , LOCATE(x'25', <field>) AS "25" 
    , length(trim(<field>)) AS "Length" 
FROM <file> 
WHERE LOCATE(x'25', <field>) > 0 
    OR LOCATE(x'0D', <field>) > 0 

而且我用这个SQL来替换它们:

UPDATE <file> 
SET <field> = REPLACE(REPLACE(<field>, x'0D', ' '), x'25', ' ') 
WHERE LOCATE(x'25', <field>) > 0 
    OR LOCATE(x'0D', <field>) > 0 
+0

对于使用v5r3或更高版本的人来说,这是替换功能所需的好方案。 – Greg

1

下面是一个示例脚本,取代X'41'作者:X'40'。东西是在我们店创建问题:

UPDATE [yourfile] SET [yourfield] = TRANSLATE([yourfield], X'40', 
X'41') WHERE [yourfield] like '%' concat X'41' concat '%'  

如果你需要替换多于一个字符,延伸“到”和“从”十六进制字符串您在TRANSLATE功能所需要的值。