Каталог решений - Как сделать csv-файл согласно RFC4180

Как сделать csv-файл согласно RFC4180

Как сделать csv-файл согласно RFC4180

В наличии

На днях потребовалось выгрузить данные из таблицы значений в CSV-файл. Спросил у гугла готовый код и… поставил его в тупик. Тогда отправился в закрома и нарыл универсальную процедуру на Delphi, которую когда-то (много-много лет тому назад) написал. Перевел ее на 1С-овременный язык. И вот что получилось…

Категория:

Описание

Увы! Статья не может состоять только из кода. После некоторых раздумий я решился осквернить этот скрижаль мысли в рамках RFC4180, квинтэссенцию материализации файла с разделителями на накопителях и прочее и прочее своим косноязычным описанием сего таинства.
Пролью свет и приоткрою глаза начинающего программиста Архипа на это чудо. Итак, слушай, о достопочтенный начинающий программист Архип.

... 
имяФайлаCSV = КаталогВременныхФайлов()+"anycsvfile.txt"; 
Кодировка = КодировкаТекста.ANSI; разделитель = ","; 
текст = СоздатьДанныеCSV(ТаблицаЗначенийПолученнаяИзЗапроса, разделитель); 
ЗаписатьCSV(текст, имяФайлаCSV, Кодировка); 
... 

Прежде всего должен ты получить таблицу значений. Самый простой способ — написать запрос и выгрузить результат в упомянутую мной сущность бытия данных. Затем надо определиться с именем файла. После этого дозволь обратить твой взор, о начинающий программист Архип, на функцию СоздатьДанныеCSV(таблицаЗначений, разделитель = «,», выводитьЗаголовок = ЛОЖЬ). В эту функцию передается та самая таблица значений, полученная из запроса. А кроме нее разделитель полей. А потом принять ответственное решение на заполнение первой строки названиями колонок этой самой, выше упомянутой таблицы значений (см. функцию СоздатьЗаголовкиCSV).

А дальше таблица значений будет читаться построчно, и каждая строка ее будет превращаться в сроковое значение в соответствии с заклинанием манускрипта СоздатьСтрокуCSV(запись,разделитель).

// Создаем строку загоовков для CSV-файла
Функция СоздатьЗаголовкиCSV(таблицаЗначений, разделитель)
	
    колонкиТЗ = ТаблицаЗначений.колонки;
	
    Для каждого колонка Из колонкиТЗ Цикл
		
		Если СтрДлина(стрКолонки)>0 Тогда
			стрКолонки = стрКолонки + разделитель;
		КонецЕсли;	
		
		стрКолонки = стрКолонки + колонка.Имя;
		
	КонецЦикла; 
	
    Возврат стрКолонки;
	
КонецФункции

// Создаем строку записи ТаблицыЗначений для CSV-файла
Функция СоздатьСтрокуCSV(записьТаблицаЗначений, разделитель)    
	
	стрЗапись = "";    
	
	Для каждого поле Из записьТаблицаЗначений Цикл
		
		Если СтрДлина(стрЗапись)>0 Тогда
			стрЗапись = стрЗапись + разделитель;
		КонецЕсли;	
		
		Если ТипЗнч(поле) = Тип("Число") Тогда
			стрПоле = ?(ЗначениеЗаполнено(поле),Формат(поле,"ЧРД=."),"0");
		
		ИначеЕсли ТипЗнч(поле) = Тип("Дата") Тогда 
			стрПоле = Формат(поле,"ДФ=dd.MM.yyyy");
			
		Иначе //Если ТипЗнч(поле) = Тип("Строка") Тогда
			
			стрПоле = СтрЗаменить(Строка(поле),"""","""""");
			
			Если 
				( СтрНайти(стрПоле," ")>0  ) ИЛИ
          		( СтрНайти(стрПоле,"""")>0 ) ИЛИ
          		( СтрНайти(стрПоле,",")>0  ) ИЛИ
          		( СтрНайти(стрПоле,";")>0  ) ИЛИ
          		( СтрНайти(стрПоле,Символы.Таб)>0 )  ИЛИ
          		( СтрНайти(стрПоле,Символы.ВК)>0 )   ИЛИ
          		( СтрНайти(стрПоле,Символы.ПФ)>0 )   ИЛИ
          		( СтрНайти(стрПоле,Символы.ВТаб)>0 ) ИЛИ
          		( СтрНайти(стрПоле,Символы.НПП)>0 )  ИЛИ
          		( СтрНайти(стрПоле,Символы.ПС)>0 ) 
			Тогда 
				стрПоле = """"+стрПоле+"""";
			КонецЕсли;	
			
		КонецЕсли; 	
		
        стрЗапись = стрЗапись + Строка(стрПоле);
		
	КонецЦикла; 
	
    Возврат стрЗапись;
	
КонецФункции

// 
Функция СоздатьДанныеCSV(таблицаЗначений, разделитель = ",", выводитьЗаголовок = ЛОЖЬ)
	
	текстЗапись="";
	
	Если выводитьЗаголовок Тогда
	    текстЗапись=СоздатьЗаголовкиCSV(ТаблицаЗначений, разделитель);    
	КонецЕсли;
	
	Для Каждого запись Из таблицаЗначений Цикл
		
        стрЗапись = СоздатьСтрокуCSV(запись,разделитель);            
		Если СтрДлина(стрЗапись)>0 Тогда
			текстЗапись = текстЗапись +	Символы.ПС;
		КонецЕсли;	
        текстЗапись = текстЗапись + стрЗапись;
		
    КонецЦикла;        

    Возврат текстЗапись;

КонецФункции // СоздатьДанныеCSV()

// Запишем данные в файл
Процедура ЗаписатьCSV(текст, имяФайла, кодировка)              

    ТекстовыйФайлЗапись = Новый ЗаписьТекста(имяФайла, кодировка);            
    ТекстовыйФайлЗапись.Записать(Текст); 
    ТекстовыйФайлЗапись.Закрыть();    
	
КонецПроцедуры // ЗаписатьCSV()
has been added to your cart:
Оформление заказа