C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: CSVデータを取得・分割時、ダブルクォーテーションも取得


(過去ログ 116 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■68365 / inTopicNo.1)  CSVデータを取得・分割時、ダブルクォーテーションも取得
  
□投稿者/ みや (1回)-(2013/10/16(Wed) 19:29:57)

分類:[VB.NET/VB2005 以降] 

いつもこちらで勉強させていただいてます、みやと申します。

使用言語
VB2012

やりたいこと
CSVの情報を読み込んで処理したいのですが、その際、値を囲むダブルクォーテーションごとデータを取得したい。

-------------------------------------------
CSVデータ
 "111","222,222",333,"ああああ"


現状では以下のように取得してしまうが、
  111
  222,222
  333
  ああああ

↓のようにダブルクォーテーションごと取得したい
  "111"
  "222,222"
  333
  "ああああ"


現在のPGは、以下のようになっております
 Using parser As New TextFieldParser("test.csv", _
    System.Text.Encoding.GetEncoding("Shift_JIS"))

   parser.TextFieldType = FieldType.Delimited
   parser.SetDelimiters(",")

   While Not parser.EndOfData
     Dim row As String() = parser.ReadFields() ' 1行読み込み

     For Each field As String In row
       'カンマ区切りで分割したCSVデータを加工してデータセットに登録
     Next
   End While
 End Using

ダブルクォーテーションごと値を取得する方法をご存じの方、お手数ですがご教授をお願いいたします。
何卒よろしくお願いいたします。
引用返信 編集キー/
■68366 / inTopicNo.2)  Re[1]: CSVデータを取得・分割時、ダブルクォーテーションも取得
□投稿者/ WebSurfer (78回)-(2013/10/16(Wed) 20:36:39)
No68365 (みや さん) に返信
> ダブルクォーテーションごと値を取得する方法をご存じの方、お手数ですがご教授をお願いいたします。
> 何卒よろしくお願いいたします。


TextFieldParser を使っているんですよね。そういう方法はないと思います。なので、取得した後、
プログラムで再度ダブルクォーテーションで囲ったらどうですか?
引用返信 編集キー/
■68367 / inTopicNo.3)  Re[1]: CSVデータを取得・分割時、ダブルクォーテーションも取得
□投稿者/ 魔界の仮面弁士 (373回)-(2013/10/16(Wed) 21:08:40)
No68365 (みや さん) に返信
> CSVの情報を読み込んで処理したいのですが、その際、値を囲むダブルクォーテーションごとデータを取得したい。

TextFieldParser に、そういった機能は無いと思います。


以下、手抜き実装。「改行を含んだデータ」は考慮していません。


Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim rows = System.IO.File.ReadLines("C:\temp\test.csv", System.Text.Encoding.GetEncoding("Shift_JIS"))

        'XML に変換
        Dim data = <sample><%= From row In rows Select
                            <csv>
                                <%= Miya68365(row).Select(Function(f, i) <<%= "F" & CStr(i) %>><%= f %></>) %>
                            </csv>
                           %>
                   </sample>

        'XML を DataSet に変換
        Dim ds As New DataSet()
        Using r = data.CreateReader()
            ds.ReadXml(r)
            r.Close()
        End Using

        'DataGridView に表示
        DataGridView1.DataSource = ds.Tables("csv")
    End Sub



    '行の解析処理(手抜き)
    Public Iterator Function Miya68365(ByVal line As String) As IEnumerable(Of String)
        Dim col As New System.Text.StringBuilder()
        col.Clear()
        Dim quot As Boolean = False
        For Each c As Char In line
            If c = ","c Then
                If quot Then
                    col.Append(c)
                Else
                    Yield col.ToString()
                    col.Clear()
                End If
            ElseIf c = """"c Then
                col.Append(c)
                quot = Not quot
            Else
                col.Append(c)
            End If
        Next
        If quot Then
            Throw New ArgumentOutOfRangeException("line", line, "ダブルクォーテーションが閉じられていません。")
        Else
            Yield col.ToString()
        End If
    End Function

End Class

引用返信 編集キー/
■68368 / inTopicNo.4)  Re[2]: CSVデータを取得・分割時、ダブルクォーテーションも取得
□投稿者/ みや (2回)-(2013/10/16(Wed) 21:19:30)
No68366 (WebSurfer さん) に返信
> ■No68365 (みや さん) に返信
>>ダブルクォーテーションごと値を取得する方法をご存じの方、お手数ですがご教授をお願いいたします。
>>何卒よろしくお願いいたします。
>
>
> TextFieldParser を使っているんですよね。そういう方法はないと思います。なので、取得した後、
> プログラムで再度ダブルクォーテーションで囲ったらどうですか?
引用返信 編集キー/
■68369 / inTopicNo.5)  Re[2]: CSVデータを取得・分割時、ダブルクォーテーションも取得
□投稿者/ ??? (1回)-(2013/10/16(Wed) 21:31:11)
>>魔界の仮面弁士 様

うわ、うわ!コードまで載せていただいてありがとうございます!

> TextFieldParser に、そういった機能は無いと思います。
あ、やっぱないんですか。ネットで散々探しても見つからなかったので、もしかしたら…とは思ってたんですが(´・ω・`)


> 以下、手抜き実装。「改行を含んだデータ」は考慮していません。
ありがとうございます、十分です!
頂いたコードを元に、改行を含むデータも考慮して作成いたします。
本当に助かりました、感謝します!


皆様、ご教授ありがとうございましたm(__)m

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -