none
VB2010でDataGridViewからcsvへセル内の改行を反映させる。 RRS feed

  • 質問

  • VBを利用したデータベース構築についての質問です。

    Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim t1 As String = Me.TextBox1.Text
    Dim t2 As String = Me.TextBox2.Text
    Dim t3 As String = Me.TextBox3.Text

    Me.DataGridView1.Rows.Add(t1, t2, t3)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click


    Dim fp As String
    fp = "c:\記録.csv"

    ' CSVファイルオープン
    Dim sr As IO.StreamReader = _
    New IO.StreamReader(fp, _
    System.Text.Encoding.GetEncoding("SHIFT-JIS"))
    ' CSVファイルの各セルをDataGridViewに表示
    DataGridView1.Rows.Clear()
    Dim r As Integer = 0
    Dim lin As String = ""
    Do
    lin = sr.ReadLine()
    If lin Is Nothing = False Then
    DataGridView1.Rows.Add()
    Dim csv As String() = lin.Split(",")
    For c As Integer = 0 To csv.GetLength(0) - 1
    If c < DataGridView1.Columns.Count Then
    DataGridView1.Rows(r).Cells(c).Value = csv(c)
    End If
    Next
    r += 1
    End If
    Loop While (lin Is Nothing = False)

    sr.Close()

    End Sub



    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click


    Dim fp As String
    fp = "C:\記録.csv"





    Dim sw As IO.StreamWriter = _
    New IO.StreamWriter(fp, False, _
    System.Text.Encoding.GetEncoding("SHIFT-JIS"))
    For r As Integer = 0 To DataGridView1.Rows.Count - 1
    For c As Integer = 0 To DataGridView1.Columns.Count - 1
    ' DataGridViewのセルのデータ取得
    Dim dt As String = ""
    If DataGridView1.Rows(r).Cells(c).Value _
    Is Nothing = False Then
    dt = DataGridView1.Rows(r).Cells(c).Value.ToString()
    End If
    If c < DataGridView1.Columns.Count - 1 Then
    dt = dt & ","
    End If
    ' CSVファイル書込
    sw.Write(dt)
    Next
    sw.Write(vbCrLf)
    Next
    ' CSVファイルクローズ
    sw.Close()

    End Sub
    End Class

    以上のコードを利用し記録.csvからデータを読み取り→DataGridView1に表示したり入力→記録.csvに出力する処理をおこなっています。
    しかしDataGridView1に入力したセル内の改行を含むテキストをcsvに出力し再び入力するとセル内の改行が反映されず文字が自体が次セルに移動してしまいます。この状態をどのように改善すればよいですか。
    改行文字を入れるとかで処理はできるのでしょうか?

    2014年5月25日 11:41

回答

  • 改行コードやデリミタがフィールド値の中にある場合、フィールド値をダブルクォート (") で囲むと言った約束を設けて対応します。

    ただ、そのような CSV ファイルの処置が可能なパーサーを自力で作るのは簡単ではありません。なので、Jet Provider, A Fast CSV Reader, TextFieldParser などの既存のパーサーを使うのがよさそうです。

    CSV パーサー
    http://surferonwww.info/BlogEngine/post/2010/10/28/CSV-parser.aspx


    それから、CSV のデータを直接 DataGridView に設定するのではなく、一旦 DataTable に取り込んで、それを DataGridView の DataSource に設定するような形にしてはいかがですか?


    ・・・とここまで書いてから質問者さんの ID から前のスレッドを思い出しました。

    一番最初のスレッドでは SQL2012 と書いてあって、そのスレッドをきちんと閉じないままその次のスレッドで SQL Server Compact を使ったコードがアップしてあって、それもどう決着がついたのかよく分からないまま、今度は CSV ですか。一体どうなっているんでしょう?

    SQL Server 2012 を諦めて Compact にしたのか、それもうまく行かないから CSV にしたのか、前のスレッドとは全然関係ないのか、書いていただけませんか。最低限のマナーとして。

    • 編集済み SurferOnWww 2014年5月25日 12:35 追記追加
    • 回答の候補に設定 星 睦美 2014年5月26日 4:23
    • 回答としてマーク 星 睦美 2014年5月30日 7:11
    2014年5月25日 12:16
  • CSVパーサーの追加情報です。リンク先でSurferOnWwwさんがCodeProjectの例もご紹介されていますが、私もCodeProjectから一つご紹介します。ソースコードが短く、条件が合えば扱いやすいと思います。項目をダブルクォートで囲んだり、その中にダブルクォートを入れることもできます。

    Simple CSV Parser/Reader Function Written in C#
    http://www.codeproject.com/Articles/17840/Simple-CSV-Parser-Reader-Function-Written-in-C


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年5月26日 4:23
    • 回答としてマーク 星 睦美 2014年5月30日 7:11
    2014年5月26日 3:02
    モデレータ

すべての返信

  • 改行コードやデリミタがフィールド値の中にある場合、フィールド値をダブルクォート (") で囲むと言った約束を設けて対応します。

    ただ、そのような CSV ファイルの処置が可能なパーサーを自力で作るのは簡単ではありません。なので、Jet Provider, A Fast CSV Reader, TextFieldParser などの既存のパーサーを使うのがよさそうです。

    CSV パーサー
    http://surferonwww.info/BlogEngine/post/2010/10/28/CSV-parser.aspx


    それから、CSV のデータを直接 DataGridView に設定するのではなく、一旦 DataTable に取り込んで、それを DataGridView の DataSource に設定するような形にしてはいかがですか?


    ・・・とここまで書いてから質問者さんの ID から前のスレッドを思い出しました。

    一番最初のスレッドでは SQL2012 と書いてあって、そのスレッドをきちんと閉じないままその次のスレッドで SQL Server Compact を使ったコードがアップしてあって、それもどう決着がついたのかよく分からないまま、今度は CSV ですか。一体どうなっているんでしょう?

    SQL Server 2012 を諦めて Compact にしたのか、それもうまく行かないから CSV にしたのか、前のスレッドとは全然関係ないのか、書いていただけませんか。最低限のマナーとして。

    • 編集済み SurferOnWww 2014年5月25日 12:35 追記追加
    • 回答の候補に設定 星 睦美 2014年5月26日 4:23
    • 回答としてマーク 星 睦美 2014年5月30日 7:11
    2014年5月25日 12:16
  • CSVパーサーの追加情報です。リンク先でSurferOnWwwさんがCodeProjectの例もご紹介されていますが、私もCodeProjectから一つご紹介します。ソースコードが短く、条件が合えば扱いやすいと思います。項目をダブルクォートで囲んだり、その中にダブルクォートを入れることもできます。

    Simple CSV Parser/Reader Function Written in C#
    http://www.codeproject.com/Articles/17840/Simple-CSV-Parser-Reader-Function-Written-in-C


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年5月26日 4:23
    • 回答としてマーク 星 睦美 2014年5月30日 7:11
    2014年5月26日 3:02
    モデレータ