Текущее время: Вт, июл 22 2025, 16:38

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 12:27 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
Наабапили загрузку из очень большого TXT-файла, который лежит на сервере приложений. Сервер на Солярке, файл туда заливается в кодировке Win-1251.
Чтение построчно через
OPEN DATASET apps_file FOR INPUT IN LEGACY TEXT MODE CODE PAGE '1504' WITH WINDOWS LINEFEED.

Спотыкается дампом на READ DATASET, если в читаемой строке есть например символ x096 "длинное тире". Если убрать LEGACY TEXT MODE CODE PAGE '1504' - конвертирует русские буквы в чёрти-что, даже translate to codepage '1504' не помогает :(

Если грузануть файл с клиента, ФМом GUI_UPLOAD, то заменяет кривой символ на '#', дампа нету.

Вопрос - как посмотреть, какие конкретно символы ASCII входят в состав CODEPAGE '1504' ? Брутфорсить посимвольно от 0 до 255 както не хочется :D
Есть штатный способ вычленить разом все кривые символы в строке (или прогрузить файл в Win-кодировке с Unix-сервера)?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 12:41 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Попробуйте грузить в бинарном режиме и потом конвертировать классом CL_ABAP_CONV_IN_CE


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 12:43 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
поправка - GUI_UPLOAD получается протаскивает такой символ без преобразования. В таблицу БД ложится символ "длинное тире", но если его write на экран, то получаем '#'. :(


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 12:48 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
да именно не хотелосьбы без лишних преобразований в памяти сервера приложений, - файл неприличного объёма.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 12:51 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, апр 18 2012, 14:20
Сообщения: 252
Откуда: РБ, г. Гомель
Пол: Мужской
файл в UNICODE переделать никак?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 12:56 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
А преобразования так или иначе все равно будут. Либо сам сервер приложений в ядре будет из win1251 в юникод преобразовывать, либо вы ручками туже операцию вызовите.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 12:58 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, апр 18 2012, 14:20
Сообщения: 252
Откуда: РБ, г. Гомель
Пол: Мужской
AFH написал(а):
А преобразования так или иначе все равно будут. Либо сам сервер приложений в ядре будет из win1251 в юникод преобразовывать, либо вы ручками туже операцию вызовите.

имелось ввиду изначально файл создавать не в WIN1251, а в UNICODE
чтобы избежать дампа используйте OPEN DATASET ... IGNORING CONVERSION ERRORS, все непонятые символы будет заменять на "#"


Последний раз редактировалось MantiCore1977 Вт, окт 16 2012, 13:02, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 13:01 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
MantiCore1977 написал:
AFH написал(а):
А преобразования так или иначе все равно будут. Либо сам сервер приложений в ядре будет из win1251 в юникод преобразовывать, либо вы ручками туже операцию вызовите.

имелось ввиду изначально файл создавать не в WIN1251, а в UNICODE


Ой, я это замечание топикстартеру адресовал :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Вт, окт 16 2012, 15:03 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
спасибо, IGNORING CONVERSION ERRORS помогло.

Единственное что пока непонятно - GUI_UPLOAD, даже если явно передавть в него CODEPAGE = '1504' всёравно протаскивает с клиента этот символ без преобразования (как будто внутри ФМа алгоритм трансляции кодовых страниц совершенно другой, чем в OPEN DATASET, и этот символ не считается неправильным). А в решётку он превращается только при write (в АLV отображается норамльно как "длинное тире"). Т.е. одна и та-же загрузка с сервера и с клиента - даёт разное наполнение таблиц в SAPe. Вроде мелочь, но с учётом что по этому тексту пользователи SAP ищут соответствия ... :cry:

Насчёт конверсии файла в UNICODE - попробую, т.к. он формируется самописными SQL-скриптами в MSSQLserver. Но тогда у него объём ещё удвоится при загрузке.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: дамп CONVT_CODEPAGE - есть ли способ отфильтровать "кривые" символы?
СообщениеДобавлено: Ср, окт 17 2012, 04:02 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Попробуйте:

Code:
data: bytes type xstring.
data: str type string.
bytes = '96'.

data: lo_converter type ref to cl_abap_conv_in_ce.

lo_converter = cl_abap_conv_in_ce=>create(
    encoding    = '1504'
*    endian      =
*    replacement = '#'
*    ignore_cerr = ABAP_FALSE
*    input       =
).

lo_converter->convert(
  exporting
    input           = bytes    " Byte Sequence to Be Converted
*    n               = -1    " Number of Units To Be Read
  importing
    data            = str    " Field to Be Filled
*    len             =     " Number of Converted Units
*    input_too_short =     " Input Buffer Was too Short
).

write str.


У меня тире выводится даже врайтом, но система довольно новая.
А какой объем вы экономите? Место на жестком диске или память системы? Если память системы - то объем все равно удваивается, т.к. юникод система хранит строки у себя только в юникоде и при загрузке их преобразовывает.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB