13.01.2004, 11:15 | #1 |
1C
|
Импорт из текстового файла - один их вариантов.
Была поставлена задача осуществить импорт из системы клиент-банк (КБ) платежных поручений. КБ для обмена с внешними системами предоставляет текстовый файл примерно в таком виде:
Поле 1 = 111 Поле 2 = 444 Поле 3 = 555 Кон Поле 1 = 888 Поле 2 = 777 Поле 3 = 999 Кон Для осуществления сего за основу для работы с текстовым файлом взял класс AsciiIo. В качестве примера взял класс CustInPaymCH_DebitDirect. Открытие для чтения файла: |
|
13.01.2004, 11:25 | #2 |
1C
|
Извините нечаянно отправил недописанное сообщение
boolean openFile()
{ boolean ret = false; ; aSCIIFile = new AsciiIo(filename, 'r'); if (aSCIIFile) { if (aSCIIFile.status()) { throw error("@SYS52680"); } aSCIIFile.inFieldDelimiter('\r\n'); aSCIIFile.inRecordDelimiter('\r\n'); ret = true; } return ret; } Параметры \r\n надо обязательно проставить, при условии, если вы не хотите вводит разделители полей и записей. Если не проставишь то чтение строки будет происходить до первого пробела. Далее происходит чтение файла в память. Сдела это так: if (aSCIIFile) { while (aSCIIFile.Status() == IO_Status::Ok) { memoryFile = conins(memoryFile, fileCountFile, aSCIIFile.read()); fileCountFile++; } } Каждый элемент контейнера - это строка файла. Потом перемещаясь по контейнеру, вы фактически пермещатесь по строкам файла. Ну и наконец в цикле возможна обработка строк стандарными функциями Ax, например subStr итд. Единственная оговорка, что при вставки записи вполне понадобиться измнение номерной серии программно. Я делал это так: Мое поле = NumberSeq::newGetNumFromCode("Моя серия", true, false).num(); За совет спасибо форуму. Описание классов, отвечающих за работу с текстовыми файлами в Ax можно найти: http://axapta.mazzy.ru/hints/textfile/ |
|
13.01.2004, 12:03 | #3 |
Administrator
|
А почему Вы решили не использовать "Кон\r\n" в качестве inRecordDelimeter?
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
13.01.2004, 12:17 | #4 |
1C
|
А как же тогда поля разделять...?.Тем более нужно не всю строку, а подстроку...
Поле 1 = 111 Из этой строки нужно 111. |
|
13.01.2004, 13:18 | #5 |
Administrator
|
Секундочку, за разделение полей отвечает inFieldDelimeter. Вот вам маленький Job. Попробуйте почитать Ваш файл с его помощью. Потом подставьте Ваше значение для inRecordDelimeter и почувствуйте разницу
PHP код:
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
13.01.2004, 16:31 | #6 |
1C
|
Получилось не плохо. Это более оптимальный вариант. Я делал разделение записей уже потом при сканировании в цикле контейнера со строками. "Кон" в файле встречается через определенное количество строк. У меня это 27. Если счетчик цикла был равен 27, то это признак конца записи. Он увеличивается опять на 27. В общем я понял, что Ваш вариант намного удобней. Просто немного не понял механизм с делиметрами.
Спасибо большое. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
импорт текст.файла во временную таблицу | 5 | |||
Импорт данных из текстового файла | 17 | |||
Импорт данных из XML файла | 0 | |||
Импорт из текстового файла | 8 | |||
импорт из текстового файла | 1 |
|