今回は、VB.NETでCSVファイルの読み込み・書き込みを行う方法についてご紹介します。
CSVファイルを読み込む方法
CSVファイルの読み込み方法としては、StreamReaderとString.Splitを組み合わせる方法、もしくはTextFieldParserを使う方法がよく利用されます。
以下では、それぞれの具体的な実装例と、実行結果を示します。
StreamReaderとString.Splitで読み込む
StreamReaderを用いてファイルの各行を読み込み、その内容をString.Splitでカンマ区切りに分割する方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Imports System.IO Module Module1 Sub Main() ' CSVファイルのパス Dim filePath As String = "sample.csv" ' StreamReaderを利用してファイルを読み込み Using sr As New StreamReader(filePath) ' 末尾まで読み込む While Not sr.EndOfStream ' 1行読み取り Dim line As String = sr.ReadLine() ' カンマ区切りで分割 Dim values() As String = line.Split(","c) ' 各フィールドを出力 For Each value In values Console.WriteLine(value) Next End While End Using Console.ReadLine() End Sub End Module |
この方法はシンプルですが、フィールド内にカンマが含まれている場合や、引用符を扱いたい場合には注意が必要です。
TextFieldParserで読み込む
Microsoft.VisualBasic.FileIO.TextFieldParserを利用すると、CSVファイルのルールに即した柔軟なパース処理が可能になります。例えば引用符や改行の扱いに対応しやすくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Imports Microsoft.VisualBasic.FileIO Imports System.IO Module Module2 Sub Main() ' CSVファイルのパス Dim filePath As String = "sample.csv" ' TextFieldParserを利用してファイルを読み込み Using parser As New TextFieldParser(filePath) ' 区切り文字としてカンマを指定 parser.TextFieldType = FieldType.Delimited parser.SetDelimiters(",") ' 末尾まで読み込む While Not parser.EndOfData ' フィールドを配列として取得 Dim fields As String() = parser.ReadFields() ' 各フィールドを出力 For Each field As String In fields Console.WriteLine(field) Next End While End Using Console.ReadLine() End Sub End Module |
TextFieldParserは引用符やエスケープされた引用符を自動的に処理してくれるため、より複雑なCSVファイルを扱う場合に有効です。
CSVファイルを書き込む方法
CSVファイルへの書き込みでは、StreamWriterを使い、行ごとに整形した文字列を書き込む方法が一般的です。
以下の例では、フィールド内にカンマが含まれる場合に引用符で囲む処理や、引用符が含まれる場合のエスケープ処理も行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Imports System.IO Imports System.Text Module Module3 Sub Main() ' 出力先となるCSVファイルのパス Dim filePath As String = "output.csv" ' 書き込みたいデータを準備 Dim data As New List(Of String()) From { New String() {"Name", "Age", "City"}, New String() {"Alice", "30", "Tokyo"}, New String() {"Bob, Jr.", "25", "Osaka"} } ' CSVファイルを書き込み Using sw As New StreamWriter(filePath, False, Encoding.UTF8) For Each row As String() In data ' フィールド内にカンマや引用符がある場合は加工 Dim processedRow = row.Select(Function(field) If field.Contains(",") OrElse field.Contains("""") Then ' 引用符を二重にする Dim escaped As String = field.Replace("""", """""") Return $"""{escaped}""" Else Return field End If End Function) ' カンマ区切りの1行データに変換 Dim line As String = String.Join(",", processedRow) sw.WriteLine(line) Next End Using Console.WriteLine("ファイルの書き込みが完了しました。") Console.ReadLine() End Sub End Module |
ファイルの書き込みが完了しました。
このコードを実行後、生成されたoutput.csvを開くと、カンマを含むフィールドが正しく引用符で囲まれて出力されていることを確認できます。
CSVファイル操作時の注意点
CSVファイルを扱う際に、特に注意しておきたい点を以下にまとめます。
- エンコーディング:UTF-8やShift_JISなど、使用するエンコーディングが正しいか確認します。
- フィールド内のカンマや引用符:Splitだけでは対応しきれないケースに備えてTextFieldParserや専用のライブラリを検討します。
- デリミタの違い:カンマ以外にもセミコロンなどの区切り文字を使うCSVがある点に留意します。
- 例外処理:ファイルの存在チェックや読み書き時のエラーをハンドリングしておくと安全です。
- パフォーマンス:大きなファイルでは一行ずつ読み書きするなど、メモリ管理に気を配ります。
以上の注意点を踏まえ、用途に合わせて実装を行うと、CSVファイルを扱うプログラムをスムーズに開発できます。
まとめとして、StreamReaderとString.Split、TextFieldParser、StreamWriterを使った基本的なCSVの操作方法を解説しました。CSV特有のカンマや引用符の取り扱いは慎重に実装する必要があります。適切なエンコーディングと例外処理も組み合わせて、確実にデータの入出力を行ってください。