//ПреобразоватьТекстCSVвТЗ () импортирует данные в ТЗ из текста формата CSV //Параметры: //ТекстCSV - Строка, содержащая текст в формате csv //Разделитель - Для формата CSV разделителем является ',', но т.к. // Excel берет разделитель из региональных стандартов, то // используется ';', поддерживает многострочные поля // &НаСервереБезКонтекста Функция ПреобразоватьТекстCSVвТЗ(ТекстCSV="", Разделитель=";") Экспорт ТЗ = Новый ТаблицаЗначений; ОсобаяСтрока = "$#%^&*!xyxb$#%&*!^"; // для замены "" НомерСтроки = 1; Стр = СтрПолучитьСтроку(ТекстCSV,НомерСтроки); Пока НомерСтроки <= СтрЧислоСтрок(ТекстCSV) Цикл СтрокаТЗ = ТЗ.Добавить(); НомерПоля = 0; Пока Стр <> "" Цикл Токен = ""; ПозицияРазделителя = Найти(стр, Разделитель); ПозицияОткрКавычек = Найти(стр, """"); Если (ПозицияРазделителя > ПозицияОткрКавычек ИЛИ ПозицияРазделителя = 0) И ПозицияОткрКавычек > 0 Тогда // начинающееся с кавычек читаем до тех пор Токен = Сред(Стр, 1, ПозицияОткрКавычек); Стр = СтрЗаменить(Сред(Стр, ПозицияОткрКавычек+1), """""", ОсобаяСтрока); ПозицияЗакрКавычек = Найти(Стр, """"); Пока ПозицияЗакрКавычек = 0 Цикл Токен = Токен + Стр + Символы.ПС; НомерСтроки = НомерСтроки + 1; Стр = СтрПолучитьСтроку(ТекстCSV, НомерСтроки); Стр = СтрЗаменить(Стр, """""", ОсобаяСтрока); // пока не встретим закрывающие ПозицияЗакрКавычек = Найти(Стр, """"); КонецЦикла; ПозицияРазделителя=Найти(Сред(Стр,ПозицияЗакрКавычек), Разделитель); ПозицияРазделителя = ?(ПозицияРазделителя>0, ПозицияЗакрКавычек + ПозицияРазделителя-1, 0); КонецЕсли; Токен = Токен + ?(ПозицияРазделителя>0, Сред(Стр, 1, ПозицияРазделителя-1), Стр); Стр = ?(ПозицияРазделителя>0, Сред(Стр, ПозицияРазделителя+1), ""); Если Лев(Токен, 1) = """" Тогда Токен = Сред(Токен, 2); Токен = ?(Прав(Токен, 1) = """", Сред(Токен, 1, СтрДлина(Токен)-1), Токен); КонецЕсли; Токен = СтрЗаменить(Токен, ОсобаяСтрока, """"); НомерПоля = НомерПоля + 1; Если ТЗ.Колонки.Количество()<НомерПоля Тогда ТЗ.Колонки.Добавить("Колонка"+НомерПоля, Новый ОписаниеТипов("Строка")); КонецЕсли; СтрокаТЗ[НомерПоля-1] = Токен; КонецЦикла; НомерСтроки = НомерСтроки + 1; Стр = СтрПолучитьСтроку(ТекстCSV, НомерСтроки); КонецЦикла; Возврат ТЗ; КонецФункции //ПреобразоватьТЗвТекстCSV () экспортирует данные ТЗ в текст в формате CSV //Параметры: //ТЗ - Таблица значений данные которые сохраняются в файл //флЭкспортироватьИменаКолонок - Первой строкой выводить имена колонок //Разделитель - Для формата CSV разделителем является ',', но т.к. // Excel берет разделитель из региональных стандартов, то // используется ';' // &НаСервереБезКонтекста Функция ПреобразоватьТЗвТекстCSV(ТЗ, Разделитель = ";", флЭкспортироватьИменаКолонок = Ложь) Экспорт ТекстCSV = ""; Если флЭкспортироватьИменаКолонок Тогда //Если нужно выгружать наименование колонок Выгружаем ПодготовленнаяСтрока = ""; Для Каждого Колонка Из ТЗ.Колонки Цикл ПодготовленнаяСтрока = ПодготовленнаяСтрока + Колонка.Имя + Разделитель; КонецЦикла; ПодготовленнаяСтрока = Лев (ПодготовленнаяСтрока,СтрДлина(ПодготовленнаяСтрока)-1); ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы.ПС; КонецЕсли; Для Каждого Строка Из ТЗ Цикл ПодготовленнаяСтрока = ""; Для Каждого Колонка Из ТЗ.Колонки Цикл ПреобразованноеПоле = Строка[Колонка.Имя]; //по правилам CSV если поле содержит двойные ковычки они должны повторятся дважды Если Найти(ПреобразованноеПоле,"""") Тогда ПреобразованноеПоле = СтрЗаменить(ПреобразованноеПоле,"""",""""""); КонецЕсли; //по правилам CSV если поле содержит перенос строки или запятую оно должно заключатся в двойные кавычки Если Найти(ПреобразованноеПоле,Разделитель) ИЛИ Найти(ПреобразованноеПоле,Символы.ПС) ИЛИ Найти(ПреобразованноеПоле,"""") Тогда ПреобразованноеПоле = """" + ПреобразованноеПоле + """"; КонецЕсли; ПодготовленнаяСтрока = ПодготовленнаяСтрока + ПреобразованноеПоле + Разделитель; КонецЦикла; ПодготовленнаяСтрока = Лев (ПодготовленнаяСтрока,СтрДлина(ПодготовленнаяСтрока)-1); ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы.ПС; КонецЦикла; Возврат ТекстCSV; КонецФункции
Источник