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の各列に属性を与える
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ファイルを扱えます。