C# で DataTable を CSV に変換する

Muhammad Zeeshan 2023年10月12日
C# で DataTable を CSV に変換する

この記事では、C# を使用して DataTable を CSV ファイルに変換する方法について説明します。まず、CSV とは何かを知る必要があるので、CSV に取り掛かりましょう。

CSV ファイルとも呼ばれるカンマ分割値のデータは、スペースではなくコンマでそれぞれの列に区切られます。CSV ファイルのもう 1つの使用法は、データが 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 にデータ列を追加することです。RollnumFirstnameLastname、および Subject フィールドが含まれており、必要な他の領域を自由に追加できます。

    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);
    
  • 続いて、foreach ループを利用します。このループは、DataTable dt からコンマを使用してデータを書き込みます。

    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 フォームを作成する

DataTable にデータを作成し、コンマを使用してデータを区切った後、次のステップは、データを表示して .csv 形式に変換できる Windows フォームを作成することです。

  • 開始するには、以下に示すように Windows フォームを作成し、その中に DataGridViewConvert data to CSV というボタンを配置します。作成されたデータを表示する DataGridView と DataTable を CSV に変換するボタンが含まれています。

    DataTable フォーム

  • Windows フォームの実行が終了すると、次のようになります。

    ランニングフォーム

Windows フォームのコードを書く

Windows フォームを作成したら、次のステップは、Convert data to CSV ボタンのコードを記述することです。

  • 以下にリストされているメソッドを呼び出して、オブジェクトを初期化し、データを入力します。

    DataTable dt = datacreation.CreateData();
    
  • OpenSavefileDialog() を使用して、指定した名前でファイルを保存できます。

    string filename = OpenSavefileDialog();
    
  • ConvertTocsv は、作成したデータから CSV ファイルを作成するために使用されます。

    dt.ConvertTocsv(filename);
    

Windows フォームのソースコード

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