Загрузка данных из CSV файла

Загрузка данных из CSV файла

В данной статье рассмотрим пример загрузки данных из CSV файла, или любого текстового файла с разделителями.

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

Мы в качестве примера возьмем файл с выписками из банка и считаем из него данные в таблицу значений.

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

 
        СимволРазделитель = ";";  //Зададим символ разделитель нашего файла
  
  Файл = Новый Файл(ИмяФайлаИмпорт);//ИмяФайлаИмпорт - содержит путь к нашему файлу
  Если Не Файл.Существует() Тогда //Проверка существования файла
    Возврат;
  Конецесли;
  
  Текст = Новый ТекстовыйДокумент();  
  Текст.Прочитать(ИмяФайлаИмпорт, КодировкаТекста.ANSI); //Читаем содержимое нашего файла
  
  //Создаем таблицу значений, в которую занесем считанные с файла данные
  //Количество и поряок значений в файле, с точностью повторяем колонками таблицы значений
  ТаблицаДанных = Новый ТаблицаЗначений;
  ТаблицаДанных.Колонки.Добавить("ЄДРПОУ",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("МФО",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("Счет",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("Валюта",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("ДатаОперации",Новый ОписаниеТипов("Дата"));
  ТаблицаДанных.Колонки.Добавить("КодОперации",Новый ОписаниеТипов("Число"));
  ТаблицаДанных.Колонки.Добавить("МФОБанка",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("НазваниеБанка",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("СчетКорреспондента",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("ЄДРПОУКорреспондента",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("Кореспондент",Новый ОписаниеТипов("Строка")); 
  ТаблицаДанных.Колонки.Добавить("НомерДокумента",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("ДатаДокумента",Новый ОписаниеТипов("Строка"));
  ТаблицаДанных.Колонки.Добавить("Дебет",Новый ОписаниеТипов("Число"));
  ТаблицаДанных.Колонки.Добавить("Кредит",Новый ОписаниеТипов("Число"));
  ТаблицаДанных.Колонки.Добавить("НазначениеПлатежа",Новый ОписаниеТипов("Строка"));     
  
  //Выбираем значения из файла
  //Этот код универсальный, количество загружаемых значений описывается выше в таблице значений
  Для а = 2 по Текст.КоличествоСтрок() Цикл // Задаем цикл выбора, считаем что первая строка это шапка       
    ОбработкаПрерыванияПользователя(); 
    ТекСтрока = Текст.ПолучитьСтроку(а);//Получаем следующую строку  
    
    НоваяСтрока = ТаблицаДанных.Добавить(); //Добавлем строку в нашу итоговую таблицу
    
    Для СчетчикПолей = 1 по ТаблицаДанных.Колонки.Количество() Цикл //Перебираем значения через разделитель
      НомерСимвола       = Найти(ТекСтрока,СимволРазделитель); //ищем первый разделитель в строке
      Если НомерСимвола = 0 Тогда
        ТекЗначение = ТекСтрока; //Если не нашли, считаем что значение последнее в строке  
      Иначе
        ТекЗначение = Лев(ТекСтрока,НомерСимвола - 1); //Получаем значение до разделителя
        ТекСтрока = Сред(ТекСтрока,НомерСимвола + 1); // Сокращаем строку, убираем из нее уже полученное значение 
      Конецесли;
      
      НашаКолонка = ТаблицаДанных.Колонки.Получить(СчетчикПолей - 1); // Получаем колонку в которую запишем значение
      
      // Если тип колонки дата, попробуем полученное значение преобразовать в дату
      Если НашаКолонка.ТипЗначения = Новый ОписаниеТипов("Дата") Тогда 
        ГГГГ = Сред(ТекЗначение,7,4);
        ММ = Сред(ТекЗначение,4 ,2);
        ДД = Сред(ТекЗначение,1,2);
        ЧЧ = Сред(ТекЗначение,12,2);
        МН = Сред(ТекЗначение,15 ,2);
        СС = "00";
        Попытка
          ТекЗначение = Дата("" + ГГГГ + ММ + ДД + ЧЧ + МН + СС);  
        Исключение
        КонецПопытки;
      Конецесли;
      
      НоваяСтрока[НашаКолонка.Имя] = ТекЗначение;  // Запишем в таблицу полученное значение
      Если НомерСимвола = 0 Тогда
        Прервать;
      Конецесли;  
    Конеццикла;      
    
  Конеццикла;    
 
Все данные из файла csv мы загрузили в таблицу значений. Дальше выбираем из таблицы выписки и создаем нужные документы в 1С.