朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら 
基本 DataTableをCSVにして保存





DataTableに入っているデータをCSVファイルに保存したいときに利用できるメソッドを紹介します。
ファイルのエンコーディングも指定できます。
フォームの例はC#のデザイナーファイルを紹介しています。
CSVファイルをDataTableに読み込むサンプルはCSVファイルをDataTableに読み込んで表示するを参考にしてみてください。

Form1.Designer.csの一部

        #region Windows フォーム デザイナーで生成されたコード
        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.cmbEncoding = new System.Windows.Forms.ComboBox();
            this.ckOutputColumnName = new System.Windows.Forms.CheckBox();
            this.btnOpen = new System.Windows.Forms.Button();
            this.cmbSeparator = new System.Windows.Forms.ComboBox();
            this.cmbQuote = new System.Windows.Forms.ComboBox();
            this.dataGridView1 = new System.Windows.Forms.DataGridView();
            this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
            this.btnSave = new System.Windows.Forms.Button();
            this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
            this.panel1.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // panel1
            // 
            this.panel1.Controls.Add(this.btnSave);
            this.panel1.Controls.Add(this.cmbEncoding);
            this.panel1.Controls.Add(this.ckOutputColumnName);
            this.panel1.Controls.Add(this.btnOpen);
            this.panel1.Controls.Add(this.cmbSeparator);
            this.panel1.Controls.Add(this.cmbQuote);
            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
            this.panel1.Location = new System.Drawing.Point(0, 0);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(745, 42);
            this.panel1.TabIndex = 0;
            // 
            // cmbEncoding
            // 
            this.cmbEncoding.FormattingEnabled = true;
            this.cmbEncoding.Items.AddRange(new object[] {
            "SHIFT_JIS",
            "UTF-8",
            "EUC-JP"});
            this.cmbEncoding.Location = new System.Drawing.Point(330, 13);
            this.cmbEncoding.Name = "cmbEncoding";
            this.cmbEncoding.Size = new System.Drawing.Size(121, 20);
            this.cmbEncoding.TabIndex = 4;
            // 
            // ckOutputColumnName
            // 
            this.ckOutputColumnName.AutoSize = true;
            this.ckOutputColumnName.Location = new System.Drawing.Point(475, 14);
            this.ckOutputColumnName.Name = "ckOutputColumnName";
            this.ckOutputColumnName.Size = new System.Drawing.Size(66, 16);
            this.ckOutputColumnName.TabIndex = 3;
            this.ckOutputColumnName.Text = "列名あり";
            this.ckOutputColumnName.UseVisualStyleBackColor = true;
            // 
            // btnOpen
            // 
            this.btnOpen.Location = new System.Drawing.Point(547, 11);
            this.btnOpen.Name = "btnOpen";
            this.btnOpen.Size = new System.Drawing.Size(75, 23);
            this.btnOpen.TabIndex = 2;
            this.btnOpen.Text = "読み込む";
            this.btnOpen.UseVisualStyleBackColor = true;
            this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
            // 
            // cmbSeparator
            // 
            this.cmbSeparator.FormattingEnabled = true;
            this.cmbSeparator.Items.AddRange(new object[] {
            "カンマ区切り",
            "タブ区切り",
            "スペース区切り"});
            this.cmbSeparator.Location = new System.Drawing.Point(182, 12);
            this.cmbSeparator.Name = "cmbSeparator";
            this.cmbSeparator.Size = new System.Drawing.Size(121, 20);
            this.cmbSeparator.TabIndex = 1;
            // 
            // cmbQuote
            // 
            this.cmbQuote.FormattingEnabled = true;
            this.cmbQuote.Items.AddRange(new object[] {
            "\"",
            "なし"});
            this.cmbQuote.Location = new System.Drawing.Point(13, 13);
            this.cmbQuote.Name = "cmbQuote";
            this.cmbQuote.Size = new System.Drawing.Size(121, 20);
            this.cmbQuote.TabIndex = 0;
            // 
            // dataGridView1
            // 
            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.dataGridView1.Location = new System.Drawing.Point(0, 42);
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.RowTemplate.Height = 21;
            this.dataGridView1.Size = new System.Drawing.Size(745, 297);
            this.dataGridView1.TabIndex = 1;
            // 
            // openFileDialog1
            // 
            this.openFileDialog1.FileName = "openFileDialog1";
            // 
            // btnSave
            // 
            this.btnSave.Location = new System.Drawing.Point(641, 11);
            this.btnSave.Name = "btnSave";
            this.btnSave.Size = new System.Drawing.Size(75, 23);
            this.btnSave.TabIndex = 5;
            this.btnSave.Text = "保存する";
            this.btnSave.UseVisualStyleBackColor = true;
            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(745, 339);
            this.Controls.Add(this.dataGridView1);
            this.Controls.Add(this.panel1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.panel1.ResumeLayout(false);
            this.panel1.PerformLayout();
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
            this.ResumeLayout(false);
        }
        #endregion
        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.ComboBox cmbSeparator;
        private System.Windows.Forms.ComboBox cmbQuote;
        private System.Windows.Forms.Button btnOpen;
        private System.Windows.Forms.DataGridView dataGridView1;
        private System.Windows.Forms.OpenFileDialog openFileDialog1;
        private System.Windows.Forms.CheckBox ckOutputColumnName;
        private System.Windows.Forms.ComboBox cmbEncoding;
        private System.Windows.Forms.Button btnSave;
        private System.Windows.Forms.SaveFileDialog saveFileDialog1;

Form1.cs

        //dt:データを入れるDataTable
        //fileName:ファイル名
        //hasHeader:CSVの一行目がカラム名かどうか
        //separator:カラムを分けている文字(,など)
        //quote:カラムを囲んでいる文字("など)
        //replace:クォーテーション文字のデータ内でのエスケープ処理のための文字
        //ed:CSVファイルのエンコーディング
        private void SaveToCSV(DataTable dt, string fileName, bool hasHeader, string separator, string quote, string replace, Encoding ed)
        {
            int rows = dt.Rows.Count;
            int cols = dt.Columns.Count;
            string text;
            //保存用のファイルを開く。上書きモードで。
            StreamWriter writer = new StreamWriter(fileName, false, ed);
            //カラム名を保存するか
            if (hasHeader)
            {
                //カラム名を保存する場合
                for (int i = 0; i < cols; i++)
                {
                    //カラム名を取得
                    if (quote != "")
                    {
                        //データ内のクォーテーション文字のエスケープ処理
                        text = dt.Columns[i].ColumnName.Replace(quote, replace);
                    }
                    else
                    {
                        text = dt.Columns[i].ColumnName;
                    }
                    //レコード内の最後の列かどうか
                    if (i != cols - 1)
                    {
                        writer.Write(quote + text + quote + separator);
                    }
                    else
                    {
                        //最後のレコードなら区切り文字は要らない
                        writer.WriteLine(quote + text + quote);
                    }
                }
            }
            //データの保存処理
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    if (quote != "")
                    {
                        //データ内のクォーテーション文字のエスケープ処理
                        text = dt.Rows[i][j].ToString().Replace(quote, replace);
                    }
                    else
                    {
                        text = dt.Rows[i][j].ToString();
                    }
                    //レコード内の最後の列かどうか
                    if (j != cols - 1)
                    {
                        writer.Write(quote + text + quote + separator);
                    }
                    else
                    {
                        //最後のレコードなら区切り文字は要らない
                        writer.WriteLine(quote + text + quote);
                    }
                }
            }
            //ストリームを閉じる
            writer.Close();
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            Encoding ed = null;
            string quote = "";
            string separator = "";
            string replace = "";
            //クォーテーションの設定
            switch (this.cmbQuote.SelectedIndex)
            {
                case 0:
                    //ダブルクォーテーション
                    quote = "\"";
                    //エスケープ処理の為の文字
                    replace = "\"\"";
                    break;
                case 1:
                    //クォーテーションなし
                    quote = "";
                    //エスケープ処理の為の文字だがここでは特に無し
                    replace = "";
                    break;
            }
            //区切り文字の設定
            switch (this.cmbSeparator.SelectedIndex)
            {
                case 0:
                    //カンマ区切り
                    separator = ",";
                    break;
                case 1:
                    //タブ区切り
                    separator = "\t";
                    break;
                case 2:
                    //スペース区切り
                    separator = " ";
                    break;
            }
            //ファイルのエンコーディングの設定
            switch (this.cmbEncoding.SelectedIndex)
            {
                case 0:
                    //SHIFT-JIS
                    ed = Encoding.GetEncoding("shift_jis");
                    break;
                case 1:
                    //UTF-8
                    ed = Encoding.GetEncoding("utf-8");
                    break;
                case 2:
                    //EUC-JP
                    ed = Encoding.GetEncoding("euc_jp");
                    break;
            }
            if (this.saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                SaveToCSV(this._dt, this.saveFileDialog1.FileName, ckOutputColumnName.Checked, separator, quote, replace, ed);
            }
        }

Form1.vb

    'dt:データを入れるDataTable
    'fileName:ファイル名
    'hasHeader:CSVの一行目がカラム名かどうか
    'separator:カラムを分けている文字(,など)
    'quote:カラムを囲んでいる文字("など)
    'replace:クォーテーション文字のデータ内でのエスケープ処理のための文字
    'ed:CSVファイルのエンコーディング
    Private Sub SaveToCSV(dt As DataTable, fileName As String, hasHeader As Boolean, separator As String, quote As String, replace As String, ed As Encoding)
        Dim rows As Integer = dt.Rows.Count
        Dim cols As Integer = dt.Columns.Count
        Dim text As String
        '保存用のファイルを開く。上書きモードで。
        Dim writer As StreamWriter = New StreamWriter(fileName, False, ed)
        'カラム名を保存するか
        If hasHeader = True Then
            'カラム名を保存する場合
            For i As Integer = 0 To cols - 1
                'カラム名を取得
                If quote <> "" Then
                    'データ内のクォーテーション文字のエスケープ処理
                    text = dt.Columns(i).ColumnName.Replace(quote, replace)
                Else
                    text = dt.Columns(i).ColumnName
                End If
                'レコード内の最後の列かどうか
                If i <> cols - 1 Then
                    writer.Write(quote + text + quote + separator)
                Else
                    '最後のレコードなら区切り文字は要らない
                    writer.WriteLine(quote + text + quote)
                End If
            Next i
        End If
        'データの保存処理
        For i As Integer = 0 To rows - 1
            For j As Integer = 0 To cols - 1
                If (quote <> "") Then
                    'データ内のクォーテーション文字のエスケープ処理
                    text = dt.Rows(i)(j).ToString().Replace(quote, replace)
                Else
                    text = dt.Rows(i)(j).ToString()
                End If
                'レコード内の最後の列かどうか
                If j <> cols - 1 Then
                    writer.Write(quote + text + quote + separator)
                Else
                    '最後のレコードなら区切り文字は要らない
                    writer.WriteLine(quote + text + quote)
                End If
            Next j
        Next i
        'ストリームを閉じる
        writer.Close()
    End Sub
    Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click
        Dim ed As Encoding = Nothing
        Dim quote As String = ""
        Dim separator As String = ""
        Dim replace As String = ""
        'クォーテーションの設定
        Select Me.cmbQuote.SelectedIndex
            Case 0
                'ダブルクォーテーション
                quote = """"
                'エスケープ処理の為の文字
                replace = """"""
            Case 1
                'クォーテーションなし
                quote = ""
                'エスケープ処理の為の文字だがここでは特に無し
                replace = ""
        End Select
        '区切り文字の設定
        Select Me.cmbSeparator.SelectedIndex
            Case 0
                'カンマ区切り
                separator = ","
            Case 1
                'タブ区切り
                separator = "\t"
            Case 2
                'スペース区切り
                separator = " "
        End Select
        'ファイルのエンコーディングの設定
        Select Me.cmbEncoding.SelectedIndex
            Case 0
                'SHIFT-JIS
                ed = Encoding.GetEncoding("shift_jis")
            Case 1
                'UTF-8
                ed = Encoding.GetEncoding("utf-8")
            Case 2
                'EUC-JP
                ed = Encoding.GetEncoding("euc_jp")
        End Select
        If Me.SaveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            SaveToCSV(Me._dt, Me.SaveFileDialog1.FileName, ckOutputColumnName.Checked, separator, quote, replace, ed)
        End If
    End Sub








良いやや良い普通やや悪い悪い

投稿日時評価コメント