воскресенье, 8 мая 2011 г.

Импорт из таблицы в CSV-файл

Потребовалось мне сделать выгрузку данных в CSV файл. Написал небольшой класс -


using System;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Text;
 
namespace sqllite_test
{
    class dt_export_to_csv
    {
        #region Создание CSV
        //Передаваемые параметры - Таблица, имя файла, символ разделитель, Выгружать или нет имена столбцов
        public static void Create(DataTable dt, string strFilePath, string separator, bool ColName)
        {
            if (strFilePath == string.Empty) return;
            if (!testseparetor("", separator)) return;
 
            StringBuilder str = new StringBuilder();
 
            #region ColumnNameToCSV
            if (ColName)
            {
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    if (testseparetor(dt.Columns[i].ToString(), separator))
                    {
                        str.Append(dt.Columns[i].ColumnName);
                        str.Append(i == dt.Columns.Count - 1 ? "\n" : ";");
                    }
                    else
                    {
                        MessageBox.Show("Имя столбца (" + dt.Columns[i].ToString() + ") не должно содержать символ разделитель!");
                        return;
                    }
                }
            }
            #endregion
 
            #region DataTableToCSV
            foreach (DataRow dr in dt.Rows)
            {
                foreach (object field in dr.ItemArray)
                {
                    if (testseparetor(field.ToString(), separator))
                    {
                        str.Append(field.ToString() + separator);
                    }
                    else
                    {
                        MessageBox.Show("Значение в поле " + field.ToString() + " содержит символ-разделитель");
                        return;
                    }
                }
                str.Replace(separator, Environment.NewLine, str.Length - 1, 1);
            }
            #endregion
 
            try
            {
                File.WriteAllText(strFilePath, str.ToString(), Encoding.UTF8);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Write Error - " + ex.ToString());
            }
        }
        #endregion
 
        #region Проверяет строку на присутствие символа разделителя
        private static bool testseparetor(string str, string separator)
        {
            if (separator != string.Empty)
            {
                if (str.IndexOf(separator) == -1)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                MessageBox.Show("Символ-разделитель не должен быть пустым!");
                return false;
            }
        }
        #endregion
    }
}


Вызов класса осуществляется следующим образом -


private void btnExpToCSV_Click(object sender, EventArgs e)
        {
            //CreateCSVFile
            //Имя таблицы, Имя файла, Символ разделитель, выгружать ли первой
            //строкой имена столбцов
            dt_export_to_csv.Create(DT,  "test.csv", ";", true);            
        }