З реалізаціє імпорту як в таблицю значень, так і кожного рядка формату dsv в масив значень. Зручно використовувати для імпорту файлів вивантаження клієнт-банків, табличної частини файлів формату mmo, так і будь-яких даних з правильною структурою і розділювачем.
// Основна функція №1 !!! // При копіювання в інші модулі, для роботи необхідно ще ф-ї: ОтриматиСтрічку() + ОчисткаСтрічки() // На вхід: рядок формату csv // На виході: масив зі значеннями // Для "розділювачПолів" звичайно що можна задавати будь-яке значення, популярні: ";", "Символы.Таб" Функция ПарсингCSVрядкаВМасив(Знач Рядок,РозділювачПолів = ",",РозділювачТексту = """")
МасивРезультат = Новый Массив;
СтрічкаНаПарсинг = Рядок;
Если Прав(СтрічкаНаПарсинг,1) <> РозділювачПолів Тогда СтрічкаНаПарсинг = СтрічкаНаПарсинг + РозділювачПолів;// Екрануємо на всякий випадок остатній символ розділювачем КонецЕсли;
і = СтрДлина(СтрічкаНаПарсинг); Пока і > 1 Цикл Кусок = ОтриматиСтрічку(СтрічкаНаПарсинг,РозділювачПолів,РозділювачТексту); МасивРезультат.Добавить(ОчисткаСтрічки(Кусок,РозділювачПолів,РозділювачТексту)); СтрічкаНаПарсинг = Сред(СтрічкаНаПарсинг,СтрДлина(Кусок)+1); і = СтрДлина(СтрічкаНаПарсинг); КонецЦикла;
Возврат МасивРезультат; КонецФункции
// Основна функція №2 !!! // При копіювання в інші модулі, для роботи необхідно ще ф-ї: ОтриматиСтрічку() + ОчисткаСтрічки() // На вхід: тип "ТекстовийДокумент" (прямо зачитаний з файлу потрібного) // На виході: таблиця значень на основі CSV файлу // Для "розділювачПолів" звичайно що можна задавати будь-яке значення, популярні: ";", "Символы.Таб" Функция ПарсингCSVрядкаВТаблицюЗначень(Знач Текст,РозділювачПолів = ",",РозділювачТексту = """")
ТЗ = Новый ТаблицаЗначений;
// Зачитуєм по черзі рядки з файлу і "проганяєм" їх через парсер, для отримання ТЗ КстьРядків = Текст.КоличествоСтрок(); Для і_рядків = 1 По КстьРядків Цикл
Если Прав(СтрічкаНаПарсинг,1) <> РозділювачПолів Тогда СтрічкаНаПарсинг = СтрічкаНаПарсинг + РозділювачПолів;// Екрануємо на всякий випадок остатній символ розділювачем КонецЕсли;
СтрокаТЗ = ТЗ.Добавить();
ТЗКолонка = -1;
і_перебор = СтрДлина(СтрічкаНаПарсинг); Пока і_перебор > 1 Цикл
ТЗКолонка = ТЗКолонка + 1;
Если і_рядків = 1 Тогда // Для першого рядка формуємо потрібну кількість колонок в ТЗ. ТЗ.Колонки.Добавить(); КонецЕсли;
// Призначення: Вертає стрічку першу до розділювача полів для стрічки вхідної в стандарті csv // РозділювачПолів - для тексту csv, стандартно = , // РозділювачТексту - для стрічок в csv, стандартно = " Функция ОтриматиСтрічку(СтрічкаВхідна,РозділювачПолів = ",",РозділювачТексту = """") Результат = ""; і = 1; Пока і < СтрДлина(СтрічкаВхідна) Цикл Если Сред(СтрічкаВхідна,і,1) = РозділювачПолів Тогда Результат = Результат + РозділювачПолів; Прервать; ИначеЕсли Сред(СтрічкаВхідна,і,1) = РозділювачТексту Тогда ЧастковийРезультат = Сред(СтрічкаВхідна,і,1) + ОтриматиСтрічку(Сред(СтрічкаВхідна,і+1),РозділювачТексту,РозділювачТексту); Результат = Результат + ЧастковийРезультат; і = і + СтрДлина(ЧастковийРезультат); Иначе Результат = Результат + Сред(СтрічкаВхідна,і,1); і = і + 1; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции
// Вертає для стрічки отриманої з файлу csv // відфільтровану гарну без всіх розділювачів Функция ОчисткаСтрічки(Знач СтрічкаВхідна,РозділювачПолів = ",",РозділювачТексту = """") Если Прав(СтрічкаВхідна,1) = РозділювачПолів Тогда СтрічкаВхідна = Сред(СтрічкаВхідна,1,СтрДлина(СтрічкаВхідна)-1);// Забираєм остатній розділювач полів КонецЕсли; Если Сред(СтрічкаВхідна,0,1) = РозділювачТексту Тогда СтрічкаВхідна = Сред(СтрічкаВхідна,2,СтрДлина(СтрічкаВхідна)-2);// Забираєм крайні з обох сторін розділювачі тексту СтрічкаВхідна = СтрЗаменить(СтрічкаВхідна,РозділювачТексту+РозділювачТексту,РозділювачТексту);// Зменшуєм внутрішні розділювачі тексту в 2-рази КонецЕсли; Возврат СтрічкаВхідна; КонецФункции