DB2/iSeries SQL清理CR/LF、选项卡等

DB2/iSeries SQL清理CR/LF、选项卡等,sql,db2,ibm-midrange,replace,Sql,Db2,Ibm Midrange,Replace,我需要在一组400k+字符串记录中查找并清理换行符、回车符、制表符和“子”字符,但是这个DB2环境让我付出了代价 我想我可以用REPLACE()和CHR()函数进行一些搜索和替换,但似乎CHR()在这个系统上不可用(错误:CHR in*LIBL type*N not found)。使用\t、\r\n等似乎也不起作用。字符可以在字符串的中间或在它们的结尾。 DBMS = DB2 System = iSeries Language = SQL Encoding = Not sure, possibl

我需要在一组400k+字符串记录中查找并清理换行符、回车符、制表符和“子”字符,但是这个DB2环境让我付出了代价

我想我可以用REPLACE()和CHR()函数进行一些搜索和替换,但似乎CHR()在这个系统上不可用(错误:CHR in*LIBL type*N not found)。使用\t、\r\n等似乎也不起作用。字符可以在字符串的中间或在它们的结尾。

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

有什么关于我能用这个做什么的提示吗?

试试翻译或替换

蛮力方法包括使用POSITION来查找错误的角色,然后在其前后使用SUBSTR。连接两个子字符串(减去不需要的字符)以重新形成列


字符编码几乎肯定是EBCDIC字符集之一。根据表格最初的加载方式,CR可能为x'0d',LF可能为x'15',x'25'。一个简单的方法是找到一个绿色的屏幕,对桌子做一个DSPPFM。按F10,然后按F11以查看原始的十六进制(上/下)格式的表格。

有关可用功能的详细信息,请参阅
.

也许
TRANSLATE()
函数可以满足您的需要

    TRANSLATE( data, tochars, fromchars )
…其中fromchars是您不想要的字符集,tochars是您想要用其替换的相应字符。您可能必须以十六进制格式将其写出来,如
x'nnnnnn…'
,并且您需要知道正在使用的字符集。
使用表上的
DSPFFD
命令应显示字段的CCSID。

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


如果您只想删除不可显示的字符,请查找x'40'下的任何内容。

我使用此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 
选择
,将(x'0D',)定位为“0D”
,将(x'25',)定位为“25”
,长度(修剪())为“长度”
从…起
位置(x'25',)>0
或定位(x'0D',)>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 
更新
集合=替换(替换(,x'0D',''),x'25','')
位置(x'25',)>0
或定位(x'0D',)>0

下面是一个示例脚本,它将
X'41'
替换为
X'40'
。在我们的店内产生问题的东西:

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

如果需要替换多个字符,请将“to”和“from”十六进制字符串扩展到
TRANSLATE
函数中所需的值。

我们在替换新行字符和从平面文件返回的回车符方面做了大量工作

最后,我们使用下面的sql对问题进行排序

REPLACE(REPLACE(COLUMN_NAME, CHR(13), ''), CHR(10), '')
试试看

CR = CHR(13)
LF = CHR(10) 

您可以随时导出、处理并放回数据。我以前做过这个。我已经使用SquirrelSQL将DB2表移动到MySQL中进行测试,然后再将DB2移回生产环境(许多GB)。使用squirrel的问题包括:缺少进度指示,需要将整个表保存在内存中,包括SLQ标记,因此需要增加Java内存限制。取决于字符串大小,但希望几次演奏就足够了。另外,这必须在本地完成,否则带宽可能会成为一个问题。哦,还有一件事。。。由于关键字和引号的不同,在导入之前可能需要应用两个正则表达式。实际上,在一个像样的文本编辑器中搜索和替换不应该能够处理(假设它能够处理至少400k条记录!)哦,Squirrel甚至会为您编写表定义。实际上,换行符是EBCDIC x'25'。x'0A'是ASCII格式的LF。很好地解释了它的工作原理,并且@FrogyTx提供了一个实用的示例,这对任何使用v5r3或更高版本的人来说都是一个不错的解决方案,这是替换函数所必需的。