AS400 SQL Script для файла параметров возвращает - PullRequest
0 голосов
/ 25 октября 2018

Я интегрирую приложение в AS400 с помощью драйвера Java / JT400.У меня возникла проблема при извлечении данных из файла параметров - полученные данные, кажется, закодированы.

SELECT SUBSTR(F00001,1,20) FROM QS36F."FX.PARA" WHERE K00001 LIKE '16FFC%%%%%' FETCH FIRST 5 ROWS ONLY

Вывод

00001: C6C9D9C540C3D6D4D4C5D9C3C9C1D34040404040,  - 1
00001: C6C9D9C5406040C3D6D4D4C5D9C3C9C1D3406040,  - 2

Как я могу преобразовать это в читаемыйформат?Есть ли функция, которую я могу использовать для декодирования этого?

На терминальном соединении с AS400 информация отображается правильно через тот же SQL-запрос.

До этого у меня не было опыта работы с AS400, и я действительно мог бы помочь.Эта проблема только с файлами параметров.Таблицы базы данных работают нормально.

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Большое спасибо за все предоставленные ответы, все они правильные.

Это простой файл параметров в AS400, и я не могу ничего менять в системе.Так что это должно быть во время выполнения SQL-запроса или после его получения.

Я понятия не имел, что такое кодовая страница, поскольку у меня нет опыта работы с AS400 и файлами в нем.Следовательно, все ваши ответы помогли решить и просветить меня в этом.:)

Итак, лучший ответ - последний.Я изменил SQL следующим образом и получаю желаемый результат.

SELECT CAST(F00001 AS CHAR(20) CCSID 37) FROM QS36F."FX.PARA" WHERE K00001 LIKE '16FFC%%%%%' FETCH FIRST 5 ROWS ONLY

00001: ПОЖАРНЫЙ КОММЕРЧЕСКИЙ, - 1 00001: ПОЖАР - КОММЕРЧЕСКИЙ -, - 2

Еще раз спасибо.

Диланке

0 голосов
/ 25 октября 2018

Это шестнадцатеричные байты текста в EBCDIC, кодировке AS / 400.

static String fromEbcdic(String hex) {
    int m = hex.length();
    if (m % 2 != 0) {
        throw new IllegalArgumentException("Must be even length");
    }
    int n = m/2;
    byte[] bytes = new byte[n];
    for (int i = 0; i < n; ++i) {
        int b = Integer.parseInt(hex.substring(i*2, i*2 + 2), 16);
        bytes[i] = (byte) b;
    }
    return new String(bytes, Charset.forName("Cp500"));
}

, проходящий "C6C9D9C540C3D6D4D4C5D9C3C9C1D34040404040".

Преобразование файла с Cp500 как кодировка:

Path path = Paths.get("...");
List<String> lines = Files.readAllLines(path, Charset.forName("Cp500"));

Для концов строк, которые в AS / 400 имеют NEL-символ, U + 0085, можно использовать регулярное выражение:

content = content.replaceAll("\\R", "\r\n");

Регулярное выражение \Rбудет соответствовать ровно одному разрыву строки, будь то \r, \n, \r\n, \u0085.

0 голосов
/ 25 октября 2018

То, что вы видите, это вывод EBCDIC вместо ASCII.Это связано с тем, что CCSID не указан в базе данных, как указано в других ответах.Идеальным решением является назначение CCSID для вашего поля в базе данных.Если у вас нет возможности сделать это и вы не можете убедить ответственных за это, то также должно работать следующее решение:

SELECT CAST(SUBSTR(F00001,1,20) AS CHAR(20) CCSID(37))
FROM QS36F."FX.PARA"
WHERE K00001 LIKE '16FFC%%%%%'
FETCH FIRST 5 ROWS ONLY

Замените CCSID на тот, который вам нужен.Определения CCSID можно найти здесь: https://www -01.ibm.com / software / globalization / ccsid / ccsid_registered.html

0 голосов
/ 25 октября 2018

Поскольку файл находится в QS36F, я бы предположил, что этот файл является плоским файлом и не определен извне ... поэтому данные в файле придется интерпретировать вручную при обращении через SQL.

Вы можете попробовать преобразовать поле после его подстроки в символьный формат.

(у меня нет удобного файла S / 36, поэтому я действительно не могу его попробовать)

...