C#에서 DataTable을 CSV로 변환

Muhammad Zeeshan 2023년10월12일
C#에서 DataTable을 CSV로 변환

이 문서에서는 C#을 사용하여 DataTable을 CSV 파일로 변환하는 방법을 안내합니다. 시작하려면 CSV가 무엇인지 알아야 하므로 시작하겠습니다.

CSV 파일이라고도 하는 쉼표 분할 값의 데이터는 공백이 아닌 쉼표로 해당 열로 구분됩니다. CSV 파일의 또 다른 용도는 데이터가 Excel의 해당 셀에 자동으로 입력되는 즉시 Excel에서 파일을 여는 것입니다.

C#에서 DataTable을 CSV로 변환

DataTable을 CSV 파일로 변환하는 첫 번째 단계는 DataTable을 만드는 것입니다. 이렇게 하는 것과 관련된 단계는 다음 단락에 설명되어 있습니다.

DataTable 만들기 및 채우기

  • 시작하려면 다음 라이브러리를 가져와야 합니다.

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
  • 반환 값으로 DataTable을 생성하는 CreateData()라는 메서드를 사용하여 datacreation이라는 클래스를 만들었습니다.

    public static class datacreation {
      public static DataTable CreateData() {}
    }
    
  • 데이터 입력을 시작하려면 CreateData()에서 dt라는 DataTable 개체를 만들어야 합니다.

    DataTable dt = new DataTable();
    
  • 개체가 초기화된 후 다음 단계는 DataTable dt에 데이터 열을 추가하는 것입니다. Rollnum, Firstname, LastnameSubject 필드가 포함되어 있으며 필요한 다른 영역을 자유롭게 추가할 수 있습니다.

    dt.Columns.Add("RollNum", typeof(int));
    dt.Columns.Add("Firstname", typeof(string));
    dt.Columns.Add("Lastname", typeof(string));
    dt.Columns.Add("Subjects", typeof(string));
    
  • 그런 다음 이 열이나 필드에 정보를 입력합니다.

    dt.Rows.Add(3227, "Zeeshan", "Khan", "C#");
    dt.Rows.Add(3290, "Bubby", "Zeeshan", "Java");
    dt.Rows.Add(3247, "Osama", "shanii", "C++");
    dt.Rows.Add(3156, "Haseeb", "Bhatti", "Python");
    dt.Rows.Add(3223, "Saad", "Shukhri", "Mongo Db");
    dt.Rows.Add(3267, "Sheraz", "Malik", "MySQl");
    dt.Rows.Add(3288, "Nabeel", "Sindho", "PHP");
    dt.Rows.Add(3299, "Ahsan", "Chishti", "C");
    
  • CreateData() 함수는 DataTable 유형의 테이블을 반환합니다.

    return dt;
    

C#에서 DataTable을 CSV로 변환

DataTable을 만든 후 다음 단계는 DataTable을 CSV로 변환하는 코드를 작성하는 것입니다.

  • implementCSV 클래스에 ConvertTocsv라는 새로운 메소드를 추가했습니다. dtpath 변수는 필요한 매개변수입니다.

    public static class implementCSV {
      public static void ConvertTocsv(this DataTable dt, string path) {}
    }
    
  • ConvertTocsv 메서드에서 s라는 StreamWriter 개체를 만들었습니다. 이 개체는 지정된 경로에 데이터를 기록합니다.

    StreamWriter s = new StreamWriter(path, false);
    
  • for 루프를 사용하여 각 열 사이에 쉼표를 삽입하여 DataTable의 데이터를 분할합니다.

    for (int i = 0; i < dt.Columns.Count; i++) {
      s.Write(dt.Columns[i]);
      if (i < dt.Columns.Count - 1) {
        s.Write(",");
      }
    }
    s.Write(s.NewLine);
    
  • 그 다음에는 쉼표로 DataTable dt에서 데이터를 쓰는 foreach 루프를 사용합니다.

    foreach (DataRow dr in dt.Rows) {
      for (int i = 0; i < dt.Columns.Count; i++) {
        if (!Convert.IsDBNull(dr[i])) {
          string value = dr[i].ToString();
          if (value.Contains(',')) {
            value = String.Format("\"{0}\"", value);
            s.Write(value);
          } else {
            s.Write(dr[i].ToString());
          }
        }
        if (i < dt.Columns.Count - 1) {
          s.Write(",");
        }
      }
      s.Write(s.NewLine);
    }
    

완전한 소스 코드

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataTableExport {
  public static class datacreation {
    public static DataTable CreateData() {
      DataTable dt = new DataTable();
      dt.Columns.Add("RollNum", typeof(int));
      dt.Columns.Add("Firstname", typeof(string));
      dt.Columns.Add("Lastname", typeof(string));
      dt.Columns.Add("Subjects", typeof(string));

      dt.Rows.Add(3227, "Zeeshan", "Khan", "C#");
      dt.Rows.Add(3290, "Bubby", "Zeeshan", "Java");
      dt.Rows.Add(3247, "Osama", "shanii", "C++");
      dt.Rows.Add(3156, "Haseeb", "Bhatti", "Python");
      dt.Rows.Add(3223, "Saad", "Shukhri", "Mongo Db");
      dt.Rows.Add(3267, "Sheraz", "Malik", "MySQl");
      dt.Rows.Add(3288, "Nabeel", "Sindho", "PHP");
      dt.Rows.Add(3299, "Ahsan", "Chishti", "C");
      return dt;
    }
  }
  public static class implementCSV {
    public static void ConvertTocsv(this DataTable dt, string path) {
      StreamWriter s = new StreamWriter(path, false);
      for (int i = 0; i < dt.Columns.Count; i++) {
        s.Write(dt.Columns[i]);
        if (i < dt.Columns.Count - 1) {
          s.Write(",");
        }
      }
      s.Write(s.NewLine);
      foreach (DataRow dr in dt.Rows) {
        for (int i = 0; i < dt.Columns.Count; i++) {
          if (!Convert.IsDBNull(dr[i])) {
            string value = dr[i].ToString();
            if (value.Contains(',')) {
              value = String.Format("\"{0}\"", value);
              s.Write(value);
            } else {
              s.Write(dr[i].ToString());
            }
          }
          if (i < dt.Columns.Count - 1) {
            s.Write(",");
          }
        }
        s.Write(s.NewLine);
      }
      s.Close();
    }
  }
}

Windows Form 만들기

DataTable에 데이터를 만들고 쉼표로 구분한 후 다음 단계는 데이터를 표시하고 .csv 형식으로 변환할 수 있는 Windows Form을 구성하는 것입니다.

  • 시작하기 위해 아래와 같이 Windows Form을 만들고 그 안에 DataGridView데이터를 CSV로 변환이라는 버튼을 넣습니다. 생성된 데이터를 표시하는 DataGridView와 DataTable을 CSV로 변환하는 버튼이 포함되어 있습니다.

    데이터 테이블 양식

  • Windows Form 실행이 완료되면 다음과 같이 표시됩니다.

    런닝폼

Windows Form용 코드 작성

Windows Form을 만든 후 다음 단계는 데이터를 CSV로 변환 버튼에 대한 코드를 작성하는 것입니다.

  • 아래 나열된 메서드를 호출하여 개체를 초기화하고 데이터로 채웁니다.

    DataTable dt = datacreation.CreateData();
    
  • OpenSavefileDialog()는 주어진 이름으로 파일을 저장하는 데 사용할 수 있습니다.

    string filename = OpenSavefileDialog();
    
  • ConvertTocsv는 우리가 만든 데이터에서 CSV 파일을 만드는 데 사용됩니다.

    dt.ConvertTocsv(filename);
    

Windows Form 소스 코드

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  DataTable dt = datacreation.CreateData();
  dataGridView1.DataSource = dt;
}

private void btnCSV_Click(object sender, EventArgs e) {
  DataTable dt = datacreation.CreateData();
  string filename = OpenSavefileDialog();
  dt.ConvertTocsv(filename);
}

private string OpenSavefileDialog() {
  string filename = null;
  SaveFileDialog saveFileDialog = new SaveFileDialog();
  saveFileDialog.Filter = "csv File|*.csv";
  saveFileDialog.Title = "Save";
  DialogResult dialogResult = saveFileDialog.ShowDialog();
  if (dialogResult == DialogResult.OK) {
    filename = saveFileDialog.FileName;
  }
  return filename;
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

관련 문장 - Csharp CSV

관련 문장 - Csharp DataTable