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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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