.net CSV파일 만들기

.net(c#)으로 그리드의 내용을 CSV파일로 만들수가 있습니다.
두가지 방법이 있는데요. 간단하게 두가지 방식의 차이점을 비교하자면 하나는 Linq를 이용하는 방식이고 다른 하나는 Linq를 사용하지 않는다는 차이점만 있습니다.


오늘은 .net CSV파일 만들기에 관해서 알아보겠습니다.




첫번째 일반적인 방식의 사용은 아래와 같습니다.

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Text;
using MySql.Data.MySqlClient;

namespace CreateToCSV
{
    class Program
    {
        static void Main(string[] args)
        {
           
            DataSet ds = new DataSet();

            string connString = string.Format(@"Data Source={0};Database={1};User ID={2};Password={3};allow user variables=true", "아이피", "데이터베이스", "root", "비밀번호");
            using(MySqlConnection myConn = new MySqlConnection(connString))
            {
                string query = "SELECT " +
               "*FROM " +
               "VISIT_T";

                MySqlCommand myCmd = new MySqlCommand(query, myConn);
                myCmd.CommandType = CommandType.Text;
                myCmd.CommandTimeout = 120;

                MySqlDataAdapter da = new MySqlDataAdapter(myCmd);

                try
                {
                    myConn.Open();
                    da.Fill(ds);
                    myConn.Close();
                }
                catch (System.Exception ex)
                {
                    myConn.Close();
                }
            }


            StreamWriter sw = new StreamWriter("myCSV.csv");
            WriteToStream(sw, ds.Tables[0], false, false);
         
            Console.ReadKey();
        }

        public static void WriteToStream(TextWriter stream, DataTable table, bool header, bool quoteall)
        {
            if (header)
            {
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    WriteItem(stream, table.Columns[i].Caption, quoteall);
                    if (i < table.Columns.Count - 1)
                        stream.Write(',');
                    else
                        stream.Write("\r\n");
                }
            }
            foreach (DataRow row in table.Rows)
            {
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    WriteItem(stream, row[i], quoteall);
                    if (i < table.Columns.Count - 1)
                        stream.Write(',');
                    else
                        stream.Write("\r\n");
                }
            }
            stream.Flush();
            stream.Close();
        }

        private static void WriteItem(TextWriter stream, object item, bool quoteall)
        {
            if (item == null)
                return;
            string s = item.ToString();
            if (quoteall || s.IndexOfAny("\",\x0A\x0D".ToCharArray()) > -1)
                stream.Write("\"" + s.Replace("\"", "\"\"") + "\"");
            else
                stream.Write(s);
            stream.Flush();
        }
    }
}




두번째 방식은 Linq를 이용하하는 방식 입니다.

////// .net 3.5 방식 //////
StringBuilder sb = new StringBuilder();

string[] columnNames = dt.Columns.Cast<DataColumn>().
                                  Select(column => column.ColumnName).
                                  ToArray();
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dt.Rows)
{
    string[] fields = row.ItemArray.Select(field => field.ToString()).
                                    ToArray();
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText("myCSV.csv", sb.ToString());
////// .net 3.5 방식 //////



////// .net 4.0 방식 //////
StringBuilder sb = new StringBuilder();

IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
                                  Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dt.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText("myCSV.csv", sb.ToString());
////// .net 4.0 방식 //////


// 특수한 문자 처리
foreach (DataRow row in dt.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field =>
      string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
    sb.AppendLine(string.Join(",", fields));
}




이상으로 .net CSV파일 만들기에 대해서 알아보았습니다.

댓글

이 블로그의 인기 게시물

껌 떼는 법 (완벽 제거)

인성검사 팁 (인성검사 합격)

석청 효능 및 석청 부작용 알아보기