Книга знаний

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

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

А то достали уже с этим вопросом.Автор статьи: Fragster | Редакторы: Живой Ископаемый, Kreont,
Последняя редакция №13 от 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));
        КонецЦикла;
    КонецЦикла;

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



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


Также можно сделать через ADO:
    Файл = Новый Файл(ИмяФайла);
    Если Не Файл.Существует() Тогда
        Предупреждение("Файл не существует!");
        Возврат;
    КонецЕсли;

    Connection    = Новый ComОбъект("ADODB.Connection");
    Command        = Новый ComОбъект("ADODB.Command");
    СтрокаПодключения = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+Файл.Путь+";Extensions=csv;";
    Connection.ConnectionString = СтрокаПодключения;
    Connection.Open();
    Сообщить("Подключился");
    Command.ActiveConnection = Connection;
    
    Команда = "SELECT * FROM ["+файл.Имя+"]";

   и т.д.

==========

Дополнение:
функция, которая правильно раскладывает строки типа вида:
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);
            КонецЦикла;    
        КонецЦикла;
    Иначе
        //Сообщить("Вхождений шаблона не найдено");
    КонецЕсли;
    Возврат Результат;


Пример:
http://screencast.com/t/WeZtHFKzhsob

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

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