All infos - Создание файла .csv из объекта с#
02
дек

Создание файла .csv из объекта с#

Создание файла csv из свойств объекта, экранирование запятых и ковычек.

using (var writer = new CsvFileWriter(File.Open(pathToDirectory, FileMode.Create), Encoding.GetEncoding(1251)))
            {
                CSVRowCreator row = new CSVRowCreator();

                row.MedicalProductRow(medicalProduct, PrepareStringForDbfColumn);
                writer.WriteRow(row);
            }
        }

Класс обработчик строк:

public class CsvFileWriter : StreamWriter
    {
        public CsvFileWriter(Stream stream, Encoding encoding)
            : base(stream, encoding)
        {
        }

        public CsvFileWriter(string filename)
            : base(filename)
        {
        }
        /// 
        /// Запись строки в файл CSV.
        /// 
        ///Строка для записи.
        public void WriteRow(CsvRow row)
        {
            if(row == null) return;
            StringBuilder builder = new StringBuilder();
            bool firstColumn = true;
            foreach (string value in row)
            {
                // Добавляем сепаратор если не превая строка
                if (!firstColumn)
                    builder.Append(',');
                // Обработка для значений, содержащих запятую или кавычки
                if (value.IndexOfAny(new char[] { '"', ',' }) != -1)
                    builder.AppendFormat("\"{0}\"", value.Replace("\"", "\"\""));
                else
                    builder.Append(value);
                firstColumn = false;
            }
            row.LineText = builder.ToString();
            WriteLine(row.LineText);
        }
    }
}

Класс создатель строк из объекта:

 public class CSVRowCreator : CsvRow
    {
        public void MedicalProductRow(MyProductObject mp)
        {
            Add(mp.Id.ToString());
            Add(mp.Name);
            Add(mp.FactoryName);            
        }
    } 
    public class CsvRow : List
    {
        public string LineText { get; set; }
    }

Share this post