Для работы с текстовыми документами существуют три типа данных – ТекстовыйДокумент, ЗаписьТекста и ЧтениеТекста. Разница двух подходов состоит в способе загрузки документа:
ТекстовыйДокумент загружает файл целиком и далее построчно обрабатывает его;
ЗаписьТекста и ЧтениеТекста загружают файл построчно.
ПРИМЕР 1:
Запись данных справочника в текстовый файл:
1 2 3 4 5 6 7 8 9 10 |
Текст = Новый ТекстовыйДокумент; // перебор элементов справочника Выборка = Справочники.Клиенты.Выбрать(); Пока Выборка.Следующий() Цикл // выводим в файл код и наименование, разделенные // каким-либо разделителем, например, ‘;’ Текст.ДобавитьСтроку(""+Выборка.Код+";"+Выборка.Наименование); КонецЦикла; // запись в текстовый файл Текст.Записать("C://1.txt"); |
С помощью типа ЗаписьТекста этот код будет таким:
1 2 3 4 5 6 7 8 9 10 11 |
// файл в формате Unicode Текст = Новый ЗаписьТекста("C://1.txt", КодировкаТекста.UTF8); // перебор элементов справочника Выборка = Справочники.Клиенты.Выбрать(); Пока Выборка.Следующий() Цикл // выводим в файл код и наименование, разделенные // каким-либо разделителем, например, ‘;’ Текст.ЗаписатьСтроку(""+Выборка.Код+";"+Выборка.Наименование); КонецЦикла; // запись в текстовый файл Текст.Закрыть(); |
Чтение данных из текстового файла в справочник:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Текст = Новый ТекстовыйДокумент; // открытие файла Текст.Прочитать("C://1.txt"); // перебор строк текстового документа Для НомерСтроки=1 по Текст.КоличествоСтрок() Цикл // получить строку файла с указанным номером Стр = Текст.ПолучитьСтроку(НомерСтроки); // «распарсивание» строки // ищем позицию символа-разделителя Позиция = Найти (Стр, ‘;’); // создаем новый элемент справочника Спр=Справочники.Клиенты.СоздатьЭлемент(); // в код записывается подстрока от первого символа до позиции // символа-разделителя Спр.Код = Сред(Стр,1,Позиция-1); // за символом-резделителем – наименование клиента Спр.Наименование = Сред (Стр, Позиция+1); Спр.Записать(); КонецЦикла; |
С помощью типа ЗаписьТекста этот код будет таким:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// файл в формате Unicode Текст = Новый ЧтениеТекста("C://1.txt", КодировкаТекста.UTF8); // перебор элементов справочника Стр=""; // пока строки в файле остались Пока Стр<>Неопределено Цикл // получить очередную строку файла Стр = Текст.ПрочитатьСтроку(); // «распарсивание» строки // ищем позицию символа-разделителя Позиция = Найти (Стр, ‘;’); // создаем новый элемент справочника Спр=Справочники.Клиенты.СоздатьЭлемент(); // в код записывается подстрока от первого символа до позиции // символа-разделителя Спр.Код = Число(Сред(Стр,1,Позиция-1)); // за символом-резделителем – наименование клиента Спр.Наименование = Сред (Стр, Позиция+1); Спр.Записать(); КонецЦикла; |
ПРИМЕР 2:
В строке текста значения реквизитов справочника разделяются символом кавычка. Его можно получить, например, используя функцию Символ(34).
В случае если символ разделителя (в данном случае – кавычка) может встречаться в выгружаемых данных,
перед помещением в строку меняем этот символ на заранее определенную комбинацию символов.
В нашем случае это %квч%.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
// Выгрузка данных в текстовый файл Текст = Новый ТекстовыйДокумент; Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Стр = СтрЗаменить(Выборка.Наименование, Символ(34), "%квч%"); Код = Строка(Выборка.Код) + Символ(34); Текст.ДобавитьСтроку(Код + Стр); КонецЦикла; Текст.Записать("c:\temp\text.txt"); //Загрузка данных из текстового файла. При загрузке ориентируемся на используемый разделитель значений (это кавычка). //После получения значения делаем обратное преобразование для разделителя (при выгрузке //данных кавычку, встречающуюся в выгружаемых строках, заменяли комбинацией символов %квч%) Текст = Новый ТекстовыйДокумент; Текст.Прочитать("c:\temp\text.txt"); Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл Стр = Текст.ПолучитьСтроку(НомерСтроки); Позиция = Найти(Стр, Символ(34)); Код = Сред(Стр, 1, Позиция-1); прНаименование = Сред(Стр, Позиция + 1); Наименование = СтрЗаменить(прНаименование, "%квч%", Символ(34)); Сообщить(Код + "–" + Наименование); КонецЦикла; "В предыдущем примере файл ЗАГРУЖАЛСЯ ПОЛНОСТЬЮ, а в следующем примере ЗАГРУЖАЕТСЯ ПОСТРОЧНО." "Это позволяет при работе с файлами больших размеров значительно уменьшить время выполнения задачи." //Запись данных в файл построчно Путь = "c:\temp\text.txt"; Текст = Новый ЗаписьТекста(Путь, КодировкаТекста.UTF8); Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Текст.ЗаписатьСтроку(Выборка.Наименование); КонецЦикла; Текст.Закрыть(); //Чтение данных из файла построчно Путь = "c:\temp\text.txt"; Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8); Стр = Текст.ПрочитатьСтроку(); Пока Стр <> Неопределено Цикл Стр = Текст.ПрочитатьСтроку(); Сообщить(Стр); КонецЦикла; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//Выгрузка данных в TXT файл Данные = СоздатьОбъект("Текст"); Данные.КодоваяСтраница(0); // принудительная установка НачВремя = _GetPerformanceCounter(); // Запоминаем время запуска алгоритма ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Стр = ""+ТЗ.ЭтоГруппа+";"+ТЗ.Уровень+";"+ ТЗ.КодРодителя+";"+ТЗ.Код+";"+ТЗ.Наименование; // Символ - разделитель полей - ";" Данные.ДобавитьСтроку(Стр); КонецЦикла; Данные.Записать("c:\export.txt"); КонВремя = _GetPerformanceCounter(); // Запоминаем время окончания алгоритма // Рассчитываем продолжительность выполнения алгоритма в секундах Длительность = Окр((КонВремя-НачВремя)/1000,3); Сообщить("Время выгрузки в TXT файл: "+Длительность+" с"); //Загрузка, чтение данных из TXT файла: НачВремя = _GetPerformanceCounter(); // Запоминаем время запуска алгоритма Данные = СоздатьОбъект("Текст"); Данные.КодоваяСтраница(0); // принудительная установка Данные.Открыть("c:\export.txt"); КолСтр = Данные.КоличествоСтрок(); Для н=1 по КолСтр Цикл ТекСтр = Данные.ПолучитьСтроку(н); Состояние("В файле прочитано строк "+н+" из "+КолСтр); КонецЦикла; КонВремя = _GetPerformanceCounter(); // Запоминаем время окончания алгоритма // Рассчитываем продолжительность выполнения алгоритма в секундах Длительность = Окр((КонВремя-НачВремя)/1000,3); Сообщить("Время чтения TXT файла: "+Длительность+" с"); |