CSVファイルの読み書き

CSVファイルの規格

一般にCSVファイルの仕様は2つあります。

1つ目がルーズな仕様で、カンマ前後のスペースを無効とし、文字列をダブルクォーテーションで囲むことで、その中のダブルクォーテーション及び空白を有効とするものです。この仕様では文字列中のカンマおよび改行を認めていません。

2つ目が厳格な仕様で、文字列をダブルクォーテーションで囲むことで、その中のダブルクォーテーション及びカンマ、空白、改行を有効とするものです。

1つ目のルーズな仕様では、一般的なテキスト処理のように1行ずつ順次読み取ってカンマで分解するという簡易な手法でCSVファイルを項目に分解することが出来ますが、2つ目の厳格な仕様では専用のクラスを使用する必要があります。

RFC4180

→ 参考)http://dobon.net/vb/dotnet/file/readcsvfile.html

CSVファイルの読み書き

Microsoft.VisualBasic.FileIO.TextFieldParserクラスを使用した原始的な方法

この方法は厳格な仕様にも適用可能です。

        Using textParser As New Microsoft.VisualBasic.FileIO.TextFieldParser("C:\Users\daiyu39\Documents\test.csv", System.Text.Encoding.GetEncoding("UTF-8"))

            'CSVファイル 
            textParser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited

            '区切り文字 
            textParser.SetDelimiters(",")

            'ファイルの終端までループ 
            While Not textParser.EndOfData
                '1行読み込み 
                Dim row As String() = textParser.ReadFields()

                For Each col As String In row
                    '項目値を表示 
                    Debug.Print(col)
                Next
                Console.WriteLine()
            End While
        End Using

 

Dim csvRecords As New System.Collections.ArrayList()

'CSVファイル名
Dim csvFileName As String = "C:\test.csv"

'Shift JISで読み込む
Dim tfp As New FileIO.TextFieldParser(csvFileName, _
    System.Text.Encoding.GetEncoding(932))
'フィールドが文字で区切られているとする
'デフォルトでDelimitedなので、必要なし
tfp.TextFieldType = FileIO.FieldType.Delimited
'区切り文字を,とする
tfp.Delimiters = New String() {","}
'フィールドを"で囲み、改行文字、区切り文字を含めることができるか
'デフォルトでtrueなので、必要なし
tfp.HasFieldsEnclosedInQuotes = True
'フィールドの前後からスペースを削除する
'デフォルトでtrueなので、必要なし
tfp.TrimWhiteSpace = True

While Not tfp.EndOfData
    'フィールドを読み込む
    Dim fields As String() = tfp.ReadFields()
    '保存
    csvRecords.Add(fields)
End While

'後始末
tfp.Close()

IOクラスを使用した方法

この方法はルーズな仕様にのみ適用可能です。

        path = "C:\Users\daiyu39\Documents\test.csv"

        'Dim Reader As New IO.StreamReader(path, System.Text.Encoding.GetEncoding("utf-8"))
        'Dim Reader As New IO.StreamReader(path, System.Text.Encoding.UTF8)
        Dim Reader As New IO.StreamReader(path)
        Dim Line As String = Reader.ReadLine 'CSVの一行

        Do Until IsNothing(Line)

            Items = Line.Split(",") '一行を, (カンマ)で区切って項目ごとに分解

            For n As Long = 0 To Items.Length - 1
                Items(n) = Items(n).Replace("""", "")
            Next n

            i += 1
            Line = Reader.ReadLine '次の行を読み込む。
        Loop
        Reader.Close()

Encodingについて

UTF-8,UTF-16は自動判定、それ以外は明示的な指定が必要です

StreamReaderクラスの主なメソッド

メソッド 内容
ReadLine 入力ストリームからの次の行。入力ストリームの末尾に到達した場合は Nothing
ReadToEnd ストリームの現在位置から末尾までのストリームの残り部分 (文字列)。現在の位置がストリームの末尾である場合は、空の文字列 (“”)
が返されます。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です