タイトル | : CSV読み込み時にカラムに"が含まれるレコードが読み込めない |
記事No | : 11567 |
投稿日 | : 2015/12/28(Mon) 17:59 |
投稿者 | : ZIPPO |
いつも書くときに参考にさせていただいています。 VBは学生のころ少しかじったきり2年ほど触っておらず、思い出しながら調べながらの開発となっています。 VB2013にて開発中行き詰ってしまいましたのでご教示いただきたいです。
今回、複数カラムあるCSVファイルから特定のカラムだけを抜き出し、全レコードCSV出力を行うVBを組みました。 しかし、読み込んだCSVで特定の条件があるとそのレコードが読み込まれない不具合が発生してしまいました。
@条件 読み込むCSV:文字列、HTML、数値が混在した30カラム/レコード程度、2万レコード程度のCSV 書き出すCSV:読み込むCSVから5カラムを抜き出し書き出す。
A不具合が発生してしまう条件 ・読み込むCSVにおいて、カラム内に”(ダブルコーテーション)が存在するカラムがあると、そのカラム以降のデータが読み込まれない(空っぽになる) 影響範囲は該当するカラムが存在したレコードのみで、他のレコードは問題なし
B目標 カラム内に”が存在したレコードもすんなりと欲しいカラムのデータを取りたい。
以下にソースを記載します。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim openFile As New OpenFileDialog() openFile.FileName = "default.csv" 'openFile.InitialDirectory = C:\Users\Default\Desktop openFile.Filter = "CSVファイル(*.csv)|*.csv" openFile.Title = "CSVファイルを選択"
If openFile.ShowDialog() = Windows.Forms.DialogResult.OK Then
Else MsgBox("読み込み失敗") End If
Dim csvDirFilename As String = openFile.FileName.ToString Dim csvFileName As String = Path.GetFileName(csvDirFilename) Dim csvDir As String = Path.GetDirectoryName(csvDirFilename)
Dim ConStr As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + csvDir + ";Extensions=csv;" Dim Con As New System.Data.Odbc.OdbcConnection(ConStr)
Dim CommText As String = "SELECT * FROM " + csvFileName + ""
Dim da As New System.Data.Odbc.OdbcDataAdapter(CommText, Con)
Dim dt As New DataTable
da.Fill(dt)
DataGridView1.DataSource = dt DataGridView1.Columns(2).HeaderText = "hogehoge" DataGridView1.Columns(4).HeaderText = "hoge" '
Dim answer As Long = MsgBox("現在のhogeを読み込みました。hogehogeを書き出しますか?", vbYesNo) Select Case answer Case vbYes Dim datenow As DateTime = DateTime.Now Dim datenowst As String = datenow.ToString("yyyyMMdd") Dim savefilename As String = "hoge_" + datenowst + ".csv"
Dim sfd As New SaveFileDialog() sfd.FileName = savefilename sfd.InitialDirectory = csvDir sfd.Filter = "CSVファイル(*.csv)|*.csv" sfd.Title = "hogeの出力先を選択してください。" Dim encd As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift-JIS") Dim colCount As Integer = dt.Columns.Count Dim lastColIndex As Integer = colCount - 1 If sfd.ShowDialog() = DialogResult.OK Then Dim sr As New System.IO.StreamWriter(csvDir + "\\" + savefilename, True, encd) Dim field As String = "A,B,C,D,E" sr.Write(field) sr.Flush() sr.Write(vbCrLf) sr.Flush()
Dim row As DataRow For Each row In dt.Rows For i = 0 To colCount - 1 Dim field2 As String
Select Case i Case 0 field2 = row(i).ToString() sr.Write(field2) sr.Flush() sr.Write(","c) sr.Flush() Case 10 field2 = row(i).ToString() sr.Write(field2) sr.Flush() sr.Write(","c) sr.Flush() sr.Write(field2) sr.Flush() sr.Write(","c) sr.Flush()
Case 12 field2 = row(i).ToString() sr.Write(field2) sr.Flush() sr.Write(","c) sr.Flush() sr.Write(field2) sr.Flush() End Select Next sr.Write(vbCrLf) Next sr.Close() End If
MsgBox("hogeを" + csvDir + "に書き出しました。")
Case vbNo
MsgBox("hogeの書き出しをキャンセルしました。最初からやり直して下さい。")
End Select
End Sub
|