Программисту для работы с текстовыми файлами Аксапта предлагает несколько инструментов. Во-первых, это семейство классов IO: IO, CommaIO, AsciiIO, BinaryIO. Во-вторых, семейство textBuffer, parseBuffer.
Семейство IO разработано для работы с текстовыми файлами как с неким хранилищем записей и полей. В этом семействе можно указать разделители между строками и между полями. Все классы семейства IO позволяют читать из текстового файла и записывать в него. Все классы семейчас IO возвращают прочитанные данные в контейнер, а также умеют выводить, как контейнер, так и просто переменные.
Детальное описание каждого метода смотрите в ветке System Documentation в AOT.
Описание классов
IO
Класс IO является по сути своей абстрактным классом, хотя и не содержит модификаторов abstract по историческим причинам.
BinaryIO
Класс используется для записи данных в бинарном виде в собственном формате. Именно этот класс используется в Аксапте для экспорта/импорта данных в бинарном виде. Этот же класс используется для экспорта/импорта прав доступа. Для работы с текстовыми файлами непригоден.
CommaIO
Основной класс для работы с данными в текстовом виде. Класс отрабатывает кавычки вокруг текстовых полей, обрабавтывает двойные кавычки внутри текстового поля. Это самый популярный класс для работы с данными в текстовом виде. По-умолчанию, в этом классе установлен разделитель между полями ",".
Этот класс отличается от BinaryIO и AsciiIO тем, что обрабатывает кавычки ". Хотя это нигде не описано, похоже, что перед разбором полей в строке двойные кавычки заменяются одинарными, а затем кавычки в начале и в конце поля просто выкидываются. То, что осталось - считается значением поля. В принципе, работа с кавычками у этого класса выполняется достаточно корректно. Разделитель полей внутри кавычек отрабатывается также вполне корректно.
При чтении, метод read возвращает контейнер. В контейнере хранятся несколько строковых значений. По одному для каждого поля. Внимание, класс не занимается преобразованием типов и всегда возвращает строковые поля (и это хорошо).
Comma7IO
Видимо класс создавался для работы с 7-битными ASCII симовлами. Сейчас этот класс не содрежит описания. Поведение этого класса ничем не отличается от поведения класса CommaIO.
AsciiIO
Этот класс предназначен для построчной работы с текстовым файлом. Этот класс не разбивает строки на поля и не занимается разделителями между полями. Метод read всегда возвращает одно значение в контейнере - всю строку.
TextBuffer
Этот класс образует отдельное семейство. В отличие от IO этот класс загружает в память весь файл целиком, а затем работает с ним. Поэтому этот класс не рекомендуется использовать для больших текстов.
Однако этот класс обладает некоторыми уникальными особенностями именно из-за того, что грузит весь текст в память. Этот класс умеет:
- делать поиск в тексте (регулярные выражения описаны в функции match);
- делать замену в тексте;
- брать текст из буфера обмена (clipboard) и заталкивать текст обратно в буфер;
- брать текст из файла и записывать обратно в файл;
- вставлять строку в произвольное место текста;
- подсчитывать количество строк в тексте;
- шифровать и дешифровать текст по открытому ключу (метод не указан);
- задает интерфейс для работы с токенами (что делает этот класс незаменимым для парсинга синтаксических выражений).
ParseBuffer
Этот класс наследует от TextBuffer и реализует работу с токенами. Из интересного здесь реализована простейшая работа с макросами и комментариями в методе cleanIt.
Выводы
Если вы работаете с данными в текстовых файлах (например, экспортированные из других систем нереляционные данные), то попробуйте использовать CommaIO.
Если вы работаете с с книгами, описаниями и прочими длинными текстами, попробуйте использовать AsciiIO.
Если же вы работаете с синтаксическими конструкциями (например, скрипты, строка параметров, тексты программ), попробуйте использовать TextBuffer. Только помните о том, что TextBuffer очень прожорлив до памяти.
Если вы работаете с буфером обмена, то вам нужен только TextBuffer.
А самое главное. Перед тем как программировать, подумайте, может быть вам подойдет стандартный инструмент для импорта данных? См. Импорт данных из текстового файла
Буду рад Вашим замечаниям и предложениям.
E-Mail: mazzy@mazzy.ru, Мазуркин Сергей