tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルCSV読み込み時にカラムに"が含まれるレコードが読み込めない
記事No11567
投稿日: 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

[ツリー表示へ]
タイトルRe: CSV読み込み時にカラムに"が含まれる(追記)
記事No11568
投稿日: 2015/12/28(Mon) 19:08
投稿者花ちゃん
また、マルチポストの方ですか? だったら、ヒントだけ

> ・読み込むCSVにおいて、カラム内に”(ダブルコーテーション)が存在するカラムがあると

データをファイルに保存するときに、 " を区切り記号としてではなく、文字として保存するようにして下さい。
下記のコードを見てどう思いますか?
Label1.Text = "あい"う"えお"

http://hanatyan.sakura.ne.jp/vb2005/vb2013datagridview01.htm#no9

[ツリー表示へ]