Книга знаний

1С:Предприятие / Приемы программирования / Внешние обработки

Преобразование csv в таблицу значений

А то достали уже с этим вопросом.Автор статьи: Fragster | Редакторы: Живой Ископаемый, Kreont,
Последняя редакция №7 от 17.01.11 | История
URL: http://kb.mista.ru/article.php?id=711

Ключевые слова: csv, преобразовать, открыть


На выходе - в Список - список колонок, Таблица - таблица с данными.


Функция СтрокаВСписок(Стр,Разделитель = ";")
   Список = СоздатьОбъект("СписокЗначений");
   Б = СтрДлина(Разделитель)-1;
   Пока СтрДлина(Стр)>0 Цикл
       А = Найти(Стр,Разделитель);
       Если А>0 Тогда
           ВрСтр = СокрЛП(Лев(Стр,А-1));
           Стр = СокрЛП(Прав(Стр,СтрДлина(Стр)-А-Б));
       Иначе
           // последняя
           ВрСтр = СокрЛП(Стр);
           Стр = "";
       КонецЕсли;

       Если (Лев(ВрСтр,1) = """") И (Прав(ВрСтр,1) = """") Тогда
           ВрСтр = Сред(ВрСтр,2,СтрДлина(ВрСтр)-2);
       КонецЕсли;

       Список.ДобавитьЗначение(ВрСтр);
   КонецЦикла;

   Возврат(Список)
КонецФункции

Процедура Парсер(ИмяФайла, Список, Таблица);
   Текст = СоздатьОбъект("Текст");
   Сообщить(ИмяФайла);
   Текст.Открыть(ИмяФайла);
   Если Текст.КоличествоСтрок()=0 Тогда
       Возврат;
   КонецЕсли;
   Заголовки = СокрЛП(Текст.ПолучитьСтроку(1));
   Список = СоздатьОбъект("СписокЗначений");
   Список = СтрокаВСписок(Заголовки);

   Таблица = СоздатьОбъект("ТаблицаЗначений");
   Для Сч = 1 По Список.РазмерСписка() Цикл
       Таблица.НоваяКолонка(Список.ПолучитьЗначение(Сч));
   КонецЦикла;

   Для Сч = 2 По Текст.КоличествоСтрок() Цикл
       Список1 = СтрокаВСписок(Текст.ПолучитьСтроку(Сч));
       Если СокрЛП(Текст.ПолучитьСтроку(Сч))="" Тогда
           Продолжить;
       КонецЕсли;
       Таблица.НоваяСтрока();
       Для Сч1 = 1 По Список1.РазмерСписка() Цикл
           Таблица.УстановитьЗначение(Сч-1,Сч1,Список1.ПолучитьЗначение(Сч1));
       КонецЦикла;
   КонецЦикла;

КонецПроцедуры


Заляпуха, конечно, но работает в простейших случаях


==========

Дополнение:
функция, которая правильно раскладывает строки типа вида:
20100912; 17.19;"Назначение платежа; которое не нужно делить на подстроки"
То есть на три подстроки:


    RegExp = Новый COMОбъект("VBScript.RegExp");

   Результат = Новый Массив();
   
   RegExp.IgnoreCase = Ложь; //Игнорировать регистр
   RegExp.Global = Истина; //Поиск всех вхождений шаблона
   RegExp.MultiLine = Ложь; //Многострочный режим
   
   RegExp.Pattern = "(?:^|;)(\""(?:[^\""]+|\""\"")*\""|[^;]*)"; //вот наш супер шаблон
   //RegExp.Pattern = ";|;|;|;|;;|;|;|;|;|;|;|;|;;|;|;"; //вот наш супер шаблон
   Matches=RegExp.Execute(Стр);
   ЧислоВхождений=Matches.Count();
   //Сообщить(Стр,СтатусСообщения.Важное);
   Если ЧислоВхождений>0 Тогда
       Для к = 0 По ЧислоВхождений-1 Цикл
           Match = Matches.Item(к);
           
           SubMatches = Match.SubMatches;
           ЧислоПодвыражений=SubMatches.Count();
           Для н = 0 По ЧислоПодвыражений-1 Цикл
               SubMatch=SubMatches.Item(н);
               Если SubMatch="" Тогда
                   //Продолжить;
               КонецЕсли;    
               Результат.Добавить(SubMatch);
               //Сообщить("Подстрока: "+SubMatch);
           КонецЦикла;    
       КонецЦикла;
   Иначе
       //Сообщить("Вхождений шаблона не найдено");
   КонецЕсли;
   Возврат Результат;

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика