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





DataTableのデータをファイルに保存するときにCSVにして保存したい時がある。そんな時に汎用的に利用できるコードをご紹介しましょう。
CSVファイルを読み込む例はこちらを参考にしてください。
Visual Studio 2010版はこちらを参考にしてみてください。

C#の汎用関数

        private void SaveToCSV(DataTable dt, string fileName, bool hasHeader, string separator, string quote, string replace)
        {
            int rows = dt.Rows.Count;
            int cols = dt.Columns.Count;
            string text;
            //保存用のファイルを開く。上書きモードで。
            StreamWriter writer = new StreamWriter(fileName, false, Encoding.GetEncoding("shift_jis"));
            //カラム名を保存するか
            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();
        }

VB.NETの汎用関数

    Private dt As New DataTable
    'dt:保存すべきデータ
    'hasHeader:CSVファイルの1行目にカラム名を入れるか
    'separator:カラムとカラムの間の文字(,など)
    'quote:カラムを囲む文字
    'replace:"などのエスケープの仕方
    Private Sub SaveToCSV(ByVal dt As DataTable, ByVal fileName As String, ByVal hasHeader As Boolean, ByVal separator As String, ByVal quote As String, ByVal replace As String)
        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, Encoding.GetEncoding("shift_jis"))
        'カラム名を保存するか
        If hasHeader Then
            'カラム名を保存する場合
            For i As Integer = 0 To cols - 1 Step 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
        End If
        'データの保存処理
        For i As Integer = 0 To rows - 1 Step 1
            For j As Integer = 0 To cols - 1 Step 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
                    '行の最後のカラムでない場合は後ろにまだカラムが続くので、separatorを入れておく
                    writer.Write(quote + text + quote + separator)
                Else
                    writer.WriteLine(quote + text + quote)
                End If
            Next j
        Next i
        'ストリームを閉じる
        writer.Close()
    End Sub

呼び出し例 C#

        private void Button1_Click(object sender, EventArgs e)
        {
            string quote = "";
            string separator = "";
            string replace = "";
            switch (this.cmbQuote.SelectedIndex)
            {
                case 0:
                    //ダブルクォーテーション
                    quote = "\"";
                    replace = "\"\"";
                    break;
                case 1:
                    //シングルクォーテーション
                    quote = "\'";
                    replace = "\'\'";
                    break;
                case 2:
                    //クォーテーションなし
                    quote = "";
                    replace = "";
                    break;
            }
            switch (this.cmbSeparator.SelectedIndex)
            {
                case 0:
                    //カンマ区切り
                    separator = ",";
                    break;
                case 1:
                    //タブ区切り
                    separator = "\t";
                    break;
                case 2:
                    //スペース区切り
                    separator = " ";
                    break;
            }
            SaveToCSV(this.dt, this.txtFileName.Text, ckOutputColumnName.Checked, separator, quote, replace);
        }

呼び出し例 VB.NET

    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        Dim quote As String = ""
        Dim separator As String = ""
        Dim replace As String = ""
        Select Case Me.cmbQuote.SelectedIndex
            Case 0
                'ダブルクォーテーション
                quote = """"
                replace = """"""
            Case 1
                'シングルクォーテーション
                quote = "'"
                replace = "''"
            Case 2
                'クォーテーションなし
                quote = ""
                replace = ""
        End Select
        Select Case Me.cmbSeparator.SelectedIndex
            Case 0
                'カンマ区切り
                separator = ","
            Case 1
                'タブ区切り
                separator = "\t"
            Case 2
                'スペース区切り
                separator = " "
        End Select
        SaveToCSV(Me.dt, Me.txtFileName.Text, Me.ckOutputColumnName.Checked, separator, quote, replace)
    End Sub








良いやや良い普通やや悪い悪い
6 1 3 0 6

投稿日時評価コメント
2021/12/08 悪い 分からない
2020/12/04 やや良い 間違って削除してしまいました。すみません。
2020/07/02 悪い 速度に対する考慮が無い