gifts2017

Чтение строк файла CSV в список значений с помощью метода ИзСтрокиСРазделителями

Опубликовал Ilya (ivisor_fil) в раздел Программирование - Практика программирования

Чтение строк файла CSV в список значений с помощью метода ИзСтрокиСРазделителями

Возникла необходимость написать загрузку данных из клиент-банка в 1с 7.7. Файла формата CSV (iBank2)

И поскольку надо было "очень быстро"  (как это не редко бывет Smile) родилась вот такая функция.

Решил ею поделится т.к. кода очень немного (собственно ключевые всего 3 строки):

        ТекСтрока = СтрЗаменить(ТекСтрока,"""","'");
        ТекСтрока = """" + СтрЗаменить(ТекСтрока,РазделительВФайле ,""",""") + """";
        спЗначений.ИзСтрокиСРазделителями(ТекСтрока);


а кому-то может пригодится как раз когда нужно будет "очень быстро"

Единственное - двойные кавычки " будут заменены на одинарные '.

Но если это не критично то код можно использовать.

Функция ЧтениеФайлаCSV(Путь)
    ТекстФайла = СоздатьОбъект("Текст");
    Попытка
        ТекстФайла.Открыть(Путь);
    Исключение
        Предупреждение("Ошибка отрытия файла " + Путь);
        Возврат "";
    КонецПопытки;
    
    РазделительВФайле = ";"   
    спЗначений = СоздатьОбъект("СписокЗначений");
    Для НомСтр=1 по ТекстФайла.КоличествоСтрок() Цикл
        ТекСтрока = ТекстФайла.ПолучитьСтроку(НомСтр);
        
        // Найдем и заменим в строке символ " на символ ' чтобы при замене разделителей не было ошибки
        // т.о. из строки вида:
        // 123;"ООО "МММ" ";Кафе "Пирожок"
        // получим:
        // 123;'ООО 'МММ' ';Кафе 'Пирожок'
        ТекСтрока = СтрЗаменить(ТекСтрока,"""","'");
   
      
        // добавим в начало и конец строки символ " и заменим разделитель используемый в файле CSV на ","
        // т.о. из:
        // 123;'ООО 'МММ' ';Кафе 'Пирожок'
        // получаем:
        //"123","'ООО 'МММ' '","Кафе 'Пирожок'"
        ТекСтрока = """" + СтрЗаменить(ТекСтрока,РазделительВФайле ,""",""") + """";
 
      
        // а это уже методом ИзСтрокиСРазделителями можно превратить в список
        спЗначений.ИзСтрокиСРазделителями(ТекСтрока);

      
        // Длальше уже обрабатываем как кому нужно
        Стр = "";
        Для Ном = 1 По спЗначений.РазмерСписка() Цикл
            Сообщить(спЗначений.ПолучитьЗначение(Ном, Стр));
        КонецЦикла;   
    КонецЦикла;
КонецФункции

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Орефков (orefkov) 04.04.13 13:47
Мне одному показалось, что csv на картинке мне фак показывает?
zoolog; cool.vlad4; Ibrogim; +3 Ответить 2
2. Ийон Тихий (cool.vlad4) 04.04.13 13:50
(1) сам по себе csv - это уже фак.
3. Александр Орефков (orefkov) 04.04.13 13:53
12;"А как быть с запяточкой в поле ;?";14
ivisor_fil; +1 Ответить 1
4. Алекс Ю (AlexO) 04.04.13 13:57
(0)
Решил ею поделится

автор, а просто выложить обработку?
5. Ilya (ivisor_fil) 04.04.13 16:07
Просто выложить не вижу особого смысла т.к. обработка состои из 2-х частей:
Основной-интерфейстной (в которой происходит интерактив и заполнение реквизитов метаданных)
и обработки относящейся к конкретному банку, которая вызывается из основной, читает данные из файла и возвращает результат через параметр формы.
Основная обработка написана не мной и потому не считаю себя вправе выкладывать ее здесь.
А то что я написал под конкретный банк могу выложить но сама по себе обработка не обладает полным функционалом.
6. Ilya (ivisor_fil) 04.04.13 16:25
(1) orefkov,
показалось - не хватает пальцев справа :)

(3) orefkov,
с запяточкой оно конечно да ...
но я создавал статью просто чтобы показать что есть вот такая возможность.
В наименованиях контрагентов и банков я обычно не встречал символа ; потому для КБ посчитал такой вариант уместным. Но для случаев когда ; встречается в данных - будет читать неправильно.
7. Александр (МимохожийОднако) 10.04.13 07:58
Можно еще сделать вторую серию статьи со ссылками на функции общих модулей вместо авторских ))
8. Ilya (ivisor_fil) 10.04.13 12:05
(7) МимохожийОднако,
О каких общих модулях речь?
Может вы 8.х имели ввиду?
Так это для 7.7
9. Александр (МимохожийОднако) 10.04.13 20:10
В 7-ке есть глобальный модуль. Там разве нет подобных функций?
10. Ilya (ivisor_fil) 10.04.13 20:54
Все же не понимаю о каких функциях речь (приведите пример).
Здесь всего одна функция ЧтениеФайлаCSV. Остальное предопределенные методы объектов 1с 7.7.
Функции чтения CSV в глобальных модулях типовых конфигураций, которые мне попадались или в самом языке 1с 7.7 (без использования ВК)нет.
Поэтому я к сожалению совершенно не пойму что вы подразумеваете под "ссылками на функции общих модулей".
Собственно по тому я и выложил пример быстрого и краткого так сказать "пожарного" способа чтения CSV-файла т.к. ни каких "штатных" средств нет а для 2-3-х едино разовых эпизодических задач обычно не охота писать полноценный парсер.