LINQ2CSVを使ったCSVの扱い

#久しぶりの更新
Visual Basic Advent Calendar 2014 - Qiita の記事です。

参考:LINQ to CSV (CodeProject, CSVデータをLINQで扱うライブラリ, LinqToCsv) - いろいろ備忘録日記
こちらではC#で書かれているので、VB.NETに書き直してみるとだいたいこんな感じ。

パッケージや詳細な使用方法に関してはこちら(英語サイト)
LINQ to CSV library - CodeProject

たとえば、こんなCSVファイルがあったとして(データは適当なのでツッコミ勘弁してください)

氏名 住所 電話番号 性別 生年月日 年齢
山田太郎 東京都なんとか 00-0000-0000 1950/1/1 64
田中二郎 東京都なんとか 00-0000-0001 1950/1/2 64
鈴木三郎 東京都なんとか 00-0000-0002 1950/1/3 64

このCSVデータを処理するとこんな感じです。(列名はCSVデータに含まないものとする)

まず、nugetでパッケージのインストール

Install-Package LINQToCSV

クラスを作る時にCSVの各列に属性を与える
属性でフィールドの何番目の列か(最初が1)を指定します。

Imports LINQtoCSV

Class cCSVDataDefine

    Private _氏名 As String
    <CsvColumn(FieldIndex:=1)>
    Public Property 氏名() As String
        Get
            Return _氏名
        End Get
        Set(ByVal value As String)
            _氏名 = value
        End Set
    End Property

    Private _住所 As String
    <CsvColumn(FieldIndex:=2)>
    Public Property 住所() As String
        Get
            Return _住所
        End Get
        Set(ByVal value As String)
            _住所 = value
        End Set
    End Property

    Private _電話番号 As String
    <CsvColumn(FieldIndex:=3)>
    Public Property 電話番号() As String
        Get
            Return _電話番号
        End Get
        Set(ByVal value As String)
            _電話番号 = value
        End Set
    End Property

    Private _性別 As String
    <CsvColumn(FieldIndex:=4)>
    Public Property 性別() As String
        Get
            Return _性別
        End Get
        Set(ByVal value As String)
            _性別 = value
        End Set
    End Property

    Private _生年月日 As String
    <CsvColumn(FieldIndex:=5)>
    Public Property 生年月日() As String
        Get
            Return _生年月日
        End Get
        Set(ByVal value As String)
            _生年月日 = value
        End Set
    End Property

    Private _年齢 As String
    <CsvColumn(FieldIndex:=6)>
    Public Property 年齢() As String
        Get
            Return _年齢
        End Get
        Set(ByVal value As String)
            _年齢 = value
        End Set
    End Property
End Class
                                      • -

読み込み

    Dim ds_Csv As New LINQtoCSV.CsvContext
    Dim dsfile As String = "foobar.csv"

    Dim ds_csvDesciption As New CsvFileDescription
    ds_csvDesciption.SeparatorChar = ","	’CSVファイルの区切り文字
    ds_csvDesciption.FirstLineHasColumnNames = False	'一行目はカラム名かどうか
    ds_csvDesciption.EnforceCsvColumnAttribute = True
    ds_csvDesciption.QuoteAllFields = False	’””で囲まれたデータかどうか
    ds_csvDesciption.TextEncoding = System.Text.Encoding.GetEncoding("Shift-JIS") ' いつものSystem.Text.Encoding です。エンコード指定。

    Dim ds_datalist As New List(Of cCSVDataDefine)

    ds_datalist = ds_Csv.Read(Of cCSVDataDefine)(dsfile, ds_csvDesciption).ToList

TextEncodingは適宜合わせてください。

                                      • -

取得

    For Each d in ds_Datalist
	Console.WriteLine(d.氏名 & ", " & d.住所 & ", " & d.電話番号 & ", " & d.性別 & ", " & d.生年月日 & ", " & d.年齢 )
	
    Next
                                      • -

書き込み(書き込み用データ作成)

    Dim ExportData As New List(Of cCSVDataDefine)

    For i As Integer = 1 to 100
        Dim d As New cCSVDataDefine
            d.氏名= "ユーザー" & i
            d.住所 = "FooBar-" & i
            d.電話番号 = Format(i,"00-0000-0000") 
            d.性別 = IIf(i Mod 2 = 0, "男", "女")
            d.生年月日 = Now.Date.AddDays(i).ToString("yyyy/MM/dd")
            d.年齢 = i

            ExportData.Add(d)
    Next
                                      • -

書き込み

    Dim csv As New CsvContext

    Dim csvDescription As New CsvFileDescription()
    csvDescription.SeparatorChar = ","
    csvDescription.FirstLineHasColumnNames = False
    csvDescription.EnforceCsvColumnAttribute = True
    csvDescription.TextEncoding = System.Text.Encoding.GetEncoding("Shift-JIS")


    Dim outfile As String ="ExportData.csv"
    csv.Write(Of cCSVDataDefine)(ExportData, outfile, csvDescription)

このような感じでCSVファイルを扱えます。