Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

CSV読み込み時にDataGridViewに表示される文字が " " を含んで困っています。 解決済み

タグの編集...

投稿者 K&S   (社会人)   投稿日時 2014/5/4 09:33:54
たびたびすみません、CSV読み込み時にDataGridView1に表示される文字が " " を含んで表示されてしまい困っています。一旦ODBファイルを読み込み表示させ、CSV書き込みはしているのですが・・・。
よろしくお願いします。
-----------------------------------------------------------------------------------
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'CSV ファイルをDataGridView1 に表示
        'すでに表示されている場合、一旦消去
        If DataGridView1.Rows.Count > 2 Then
            'データの表示を消去
            DataGridView1.Columns.Clear()
            DataGridView1.DataSource = Nothing
            DataGridView1.Refresh()
        End If

        Dim DS As New DataSet
        Dim DT As DataTable = DS.Tables.Add      'テーブルを追加する
        Dim dbFileName As String = "C:\Users\???\Documents\test.csv"  'CSVファイルを指定
        Dim n As Integer

        'CSVファイルをSHIFT_JISで読込み
        Using sr1 As New System.IO.StreamReader(dbFileName, System.Text.Encoding.GetEncoding("SHIFT_JIS"))
           'ファイルの最後までループ
            Do Until sr1.Peek = -1
                n = n + 1
                If n = 1 Then

          '先頭行を項目として表示する
                    Dim cmDat() As String = Split(sr1.ReadLine, ",")                    
                    'テーブルにフィールドを追加する
                    For i As Integer = 0 To UBound(cmDat)
                        Select Case i
                            Case 1, 7, 13, 19, 25, 31, 37 
                                DT.Columns.Add(cmDat(i), Type.GetType("System.String"))
                            Case Else     
                                DT.Columns.Add(cmDat(i), Type.GetType("System.Object"))
                        End Select
                    Next
                Else
                    '2行目以降のデータ設定
                    Dim cmDat() As String = Split(sr1.ReadLine, ",")
                    DT.Rows.Add(cmDat)
                End If
            Loop
        End Using

        'データグリッドにテーブルを表示する
        DataGridView1.DataSource = DT
      
    End Sub
    '---------------------------------------------------------------

投稿者 YuO   (社会人)   投稿日時 2014/5/4 23:14:14
そうなる書き方をしているように思いますが……。

単純に「,」 (カンマ) で分割しているだけですよね。
ということは,空白を削除するような記述が無いので,プログラムは書かれたとおり,空白を含んだ形で処理します。
空白を削除したいのであれば,空白を削除するようなコードをちゃんと追加する必要があります。

投稿者 K&S   (社会人)   投稿日時 2014/5/5 04:50:14
アドバイスありがとうございます。色々な処理を試してみたのですが、なぜかダメでした。?・・・で変だなと思ったのが、CSVへの書き込みの問題ではないかと思ってしまった次第です。色々とご面倒おかけいたします。以下のコードなのですが、ご指摘のほどよろしくお願い致しします。


 Dim dbFileName As String = SaveFileName
        'csv書込
        Using swCsv As New System.IO.StreamWriter(dbFileName, False, System.Text.Encoding.GetEncoding("SHIFT_JIS"))
            Dim sf As String = Chr(34)     
            Dim se As String = Chr(34) & ","   
            Dim i, j As Integer
            Dim WorkText As String = ""     
            Dim LineText As String = ""     

            With DataGridView1
                'ヘッダーの取得・保存
                For i = 0 To .Columns.Count - 1
                    WorkText = .Columns.Item(i).HeaderText
                    If WorkText.IndexOf(Chr(34)) > -1 Then        'データ内に " があるかどうか
                        WorkText = WorkText.Replace("""", """""")     'あれば " を "" にする
                    End If
                    If i = .Columns.Count - 1 Then            'ヘッダー行連結
                        LineText &= sf & .Columns.Item(i).HeaderText & sf    '最後の列の場合
                    Else
                        LineText &= sf & .Columns.Item(i).HeaderText & se
                    End If
                Next i
                swCsv.WriteLine(LineText)                'ヘッダーへの書込                
                DataGridView1.AllowUserToAddRows = False
                'データの取得・書込
                For i = 0 To .RowCount - 1
                    LineText = ""                     '1行データクリア
                    For j = 0 To .Columns.Count - 1            '1行データ取得
                        WorkText = .Item(j, i).Value.ToString       'セルデータ取得
                        If WorkText.IndexOf(Chr(34)) > -1 Then       ' " があるか検索
                            WorkText = WorkText.Replace("""", """""")    ' " を "" に置換える
                        End If
                        If j = .Columns.Count - 1 Then           '列データ連結
                            LineText &= sf & WorkText & sf         '最後の列の場合
                        Else
                            LineText &= sf & WorkText & se
                        End If
                    Next j
                    swCsv.WriteLine(LineText)               'データ書込
                Next i
            End With
        End Using

投稿者 某サイト管理人   (社会人)   投稿日時 2014/5/5 14:15:28
保存時に、"" を付加して保存したらなら、読み込み表示時にそれが障害となるなら
削除すればいいだけの事です。
cmDat(i) = cmDat(i).Trim(Chr(34))

但し、すべてのデータに対して実行する事になり、処理時間がかかる可能性があります。
又、ADO.NET 等で読み込み表示する等すれば取り除く必要はありません。
CSV ファイルといっても色々ありますので、データの形に合った読み込みをしないと...。

PS: 
他人が作成されたサンプルを無断で投稿して、挙句の果て、欠席裁判のような事を
されるのはどうかと思いますが。

コードに問題があるなら、作者の掲示板かメールで報告するようにすべきでは。



投稿者 K&S   (社会人)   投稿日時 2014/5/5 15:11:56
大変申し訳ありませんでした。以後気を付けます、ありがとうございました。

投稿者 おっお   (社会人)   投稿日時 2014/5/7 09:46:58
http://dobon.net/vb/dotnet/file/readcsvfile.html

そんなめんどくさい事しないでこの中から好きな方法を使ったらいいと思いますよ

投稿者 K&S   (社会人)   投稿日時 2014/5/11 10:31:35
おっおさん、ありがとうございました。始めたばかりの初心者なので頭がこんがらがってしまいました。とても参考になりました。感謝です!!!