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ファイルを扱えます。