DB2 / iSeries SQL очищает CR / LF, вкладки и т. Д. - PullRequest
3 голосов
/ 27 сентября 2011

Мне нужно найти и очистить разрывы строк, возврат каретки, вкладки и символы "SUB" в наборе записей из 400 тыс. Строк +, но эта среда DB2 сказывается на мне.

Я подумал, что мог бы выполнить поиск и замену функциями REPLACE () и CHR (), но кажется, что CHR () недоступен в этой системе (ошибка: CHR в * LIBL тип * N не найден). Работа с \ t, \ r, \ n и т. Д. Тоже не работает. Символы могут быть в середине или в конце строки.

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

Есть какие-нибудь намеки на то, что я могу сделать с этим?

Ответы [ 6 ]

6 голосов
/ 17 октября 2013

Я использовал этот 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 
3 голосов
/ 30 сентября 2011

Если вы хотите очистить определенные символы, такие как возврат каретки (EBCDIC x'0d ') и перевод строки (EBCDIC x'25'), вы должны найти переведенный символ в EBCDIC , затем использовать TRANSLATE ( ) функция для замены их пробелом.

Если вы просто хотите удалить неиграемых персонажей, ищите что-нибудь под x'40 '.

1 голос
/ 03 апреля 2014

Вот пример сценария, который заменяет X'41' на X'40'. Что-то, что создавало проблемы в нашем магазине:

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

Если вам нужно заменить более одного символа, расширьте шестнадцатеричные строки «to» и «from» до значений, которые вам нужны в функции TRANSLATE.

1 голос
/ 28 сентября 2011

Возможно, функция TRANSLATE() будет соответствовать вашим потребностям.

    TRANSLATE( data, tochars, fromchars )

... где fromchars - набор символов, которые вам не нужны, а tochars - соответствующие символы, которыми вы хотите заменить их.Возможно, вам придется записать это в шестнадцатеричном формате, как x'nnnnnn...', и вам нужно будет знать, с каким набором символов вы работаете.Использование команды DSPFFD в вашей таблице должно показать CCSID ваших полей.

1 голос
/ 27 сентября 2011

Подробную информацию о доступных функциях см. В справочнике DB2 для i5 / OS SQL .

1 голос
/ 27 сентября 2011

Попробуйте перевести или заменить.

Метод грубой силы включает использование POSITION для поиска ошибочного символа, а затем SUBSTR до и после него. СОЕДИНИТЕ две подстроки (за исключением нежелательного символа), чтобы переформировать столбец.

Кодировка символов почти наверняка является одним из наборов символов EBCDIC. В зависимости от того, как таблица была загружена в первую очередь, CR может быть x'0d ', а LF x'15', x'25 '. Простой способ выяснить это - добраться до зеленого экрана и выполнить DSPPFM на столе. Нажмите F10, затем F11, чтобы просмотреть таблицу в необработанном шестнадцатеричном (более или менее) формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...