Целью данной статьи будет изучение алгоритмов работы с текстовыми файлами, файлами DBF и CSV. Очень часто приходится использовать данные форматы для обмена данными между несколькими базами, в том числе и отличными от 1С.
Открытие текстового файла для чтения описывается конструкцией:
Текст = Новый ЧтениеТекста;
Текст.Открыть(ПолноеИмяФайла);
В данной конструкции создается неинициализированный объект ЧтениеТекста, а для инициализации используется метод Открыть(<Имя файла>)
Пример:
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
// Вставить содержимое обработчика.
Перем Стр;
Стр = "";
//Открываем диалог выбора файла для чтения
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.МножественныйВыбор = Ложь;
ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'");
ВыборФайла.Фильтр = НСтр("ru = 'Все файлы (*.*)|*.*'");
Если ВыборФайла.Выбрать() Тогда
ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла;
КонецЕсли;
Текст = Новый ЧтениеТекста;
Текст.Открыть(ПолноеИмяФайла);
Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
Стр = Текст.ПрочитатьСтроку();
Сообщить(Стр);
КонецЦикла;
Текст.Закрыть();
КонецПроцедуры
Перебор строк в текстовом документе реализован при помощи функции ПрочитатьСтроку().
После чтения файла не забываем его закрыть функцией Закрыть().
Запись в текстовый файл происходит приблизительно по тому же сценарию:
&НаКлиенте
Процедура ЗаписатьФайл(Команда)
//Открываем диалог выбора файла для записи
СохранениеФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
СохранениеФайла.Заголовок = НСтр("ru = 'Сохранить файл'");
СохранениеФайла.Фильтр = НСтр("ru = 'Все файлы (*.txt)|*.txt'");
Если СохранениеФайла.Выбрать() Тогда
Текст = Новый ЗаписьТекста;
Текст.Открыть(СохранениеФайла.ПолноеИмяФайла,КодировкаТекста.ANSI);
Текст.ЗаписатьСтроку("Программируем в 1С 8.2");
Текст.Закрыть();
КонецЕсли;
КонецПроцедуры
Записать текст в документ можно при помощи функции ЗаписатьСтроку() - в данном случае после записанной строки автоматически добавится разделитель строк и следующая запись начнется с новой строки. Если же необходимо добавить в строку дополнительно текст, то можно воспользоваться функцией без переноса строки - Записать().
CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter) — запятая (,) или точка с запятой (;). (Википедия)
Такой формат часто используют для выгрузки данных из различных баз отличных от 1С. Ниже представлен алгоритм чтения данного формата на основе обычного чтения текстового файла с анализом строки и разбиением ее на поля.
Пример:
&НаКлиенте
ПроцедураПрочитатьЦСВ(Команда)
// Вставить содержимое обработчика.
ПеремСтр,Сч;
Стр = "";
//Открываем диалог выбора файла для чтения
ВыборФайла= НовыйДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.МножественныйВыбор = Ложь;
ВыборФайла.Заголовок =НСтр("ru = 'Выбор файла'");
ВыборФайла.Фильтр=НСтр("ru = 'Все файлы (*.csv)|*.csv'");
ЕслиВыборФайла.Выбрать() Тогда
ПолноеИмяФайла=ВыборФайла.ПолноеИмяФайла;
КонецЕсли;
Текст =НовыйЧтениеТекста;
Текст.Открыть(ПолноеИмяФайла);
Сч = 0;
ПокаСтр <> Неопределено Цикл
Стр =Текст.ПрочитатьСтроку();
//Создаем массив в который будем добавлять выбранные поля
МассивПолей =НовыйМассив();
//Цикл разбивает строку на подстроки по разделителю ";" и заносит их в массив
ПокаСтрДлина(Стр)> 0 Цикл
//Находим позицию первого вхождения символа ";"
ПозицияРазделителя =Найти(Стр, ";");
//Считываем символы до первого найденного символа ";"
МассивПолей.Добавить(Лев(Стр,ПозицияРазделителя - 1));
//Удаляем из строки найденную подстроку и повторяем цикл с оставшейся строкой
Стр =Прав(Стр,СтрДлина(Стр) -ПозицияРазделителя);
КонецЦикла;
//Выводим на экран первое прочитанное поле
Попытка Сообщить(МассивПолей[0]); Исключение КонецПопытки;
КонецЦикла;
Текст.Закрыть();
КонецПроцедуры
|
1С Бухгалтерия, 1С Управление Торговлей, 1С Зарплата и управление персоналом, статьи, новости 1С, помощь программисту и многое другое...
Работа с текстовыми файлами и файлами CSV в 1С 8.2
Подписаться на:
Сообщения (Atom)
в последнем примере бесконечный цикл, т.к. в конце концов ПозицияРазделителя = 0 и СтрДлина(Стр) всегда больше 0.
ОтветитьУдалитьДобрый день!
ОтветитьУдалитьЦикл работает корректно.
В конце концов ПозицияРазделителя = n, где n - длина строки последнего вхождения.
В итоге стр = "" и соответственно СтрДлина(стр) = 0.