トップ回答者
VB2010でDataGridViewからcsvへセル内の改行を反映させる。

質問
-
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に出力し再び入力するとセル内の改行が反映されず文字が自体が次セルに移動してしまいます。この状態をどのように改善すればよいですか。
改行文字を入れるとかで処理はできるのでしょうか?
回答
-
改行コードやデリミタがフィールド値の中にある場合、フィールド値をダブルクォート (") で囲むと言った約束を設けて対応します。
ただ、そのような 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
-
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/
すべての返信
-
改行コードやデリミタがフィールド値の中にある場合、フィールド値をダブルクォート (") で囲むと言った約束を設けて対応します。
ただ、そのような 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
-
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/