今回は CSV ファイルをC#で1行ずつ読み取む方法を紹介します。
CSV ファイルはデータを保存するファイルとしてよく利用されるので、アプリケーションにインポートしたいという場面は多々あることでしょう。
記事内ではサンプルコードを紹介していますので、ぜひ最後まで読んでみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
CSVファイルとは
CSV ファイルとは、Comma Separated Value の略で、カンマ( , )でデータとデータを区切って保存するファイルのことです。
このファイルの拡張子は「.csv」で、Excelやメモ帳などを使ってファイルを開く事ができ、閲覧や編集をすることができます。
CSV ファイルをエクセルで開いた場合、カンマで区切られた部分が別のセルとして認識され、セルが分かれて表示されます。
テキストファイルで開いた場合、カンマも全て表示されます。
CSV ファイルは、データのみ保存するので容量が少なく、互換性が高いことから、データのやり取りを行う上で非常に便利なファイルです。
さまざまな場面で利用する事が多い CSV ファイルを、C# で取り込む方法について知っておくことで、スムーズに開発を進めることができます。
CSVファイルを読み込む
それでは CSV ファイルに保存されているデータを1行ずつ読み取りする方法を紹介します。
まず、読み取りするファイルデータは次の通りです。
heder1,heder2,heder3,heder4
aaa,bbb,ccc,ddd
eee,fff,ggg,hhh
iii,jjj,kkk,lll
先頭行は「項目名」で、2行目以降に「データ」があります。
ファイル名を「sample.csv」として保存し、プロジェクトの実行ファイルがある場所(Project名 > bin > Debug)に貼り付けます。
StreamReader クラスを使う
このファイルを1行ずつ読み込みには、StreamReader クラスを使います。StreamReader クラスの使い方を詳しく知りたい方は以下のURLを参考にしてみてください。
Split メソッドを使う
読み取りしたデータはカンマで区切られています。後でデータを利用しやすいように、カンマで分割をして別々のデータとして取得します。
C# には手軽に分割できるメソッドが用意されていて、それがString クラスの Split メソッドです。Split
メソッドは引数に指定した Char 型文字(1文字)で文字列を区切ってくれます。戻り値は string 型の配列です。
ソースコードの全体
上記で紹介したStreamReader
とSplit
を組み合わせれば、CSV ファイルを簡単に読み取りすることができます。
全体のソースコードは次の通りです。
private void CsvReader()
{
//ファイル名
var fileName = "sample.csv";
//先頭行を読み取りするかどうか
var isFirstLineSkip = true;
//取得したデータを保存するリスト
var lines = new List<Data>();
try
{
//ファイルをオープンする
using (StreamReader sr = new StreamReader(fileName))
{
while (0 <= sr.Peek())
{
//カンマ区切りで分割して配列で格納する
var line = sr.ReadLine()?.Split(',');
if (line is null) continue;
//先頭行は項目名なのでスキップする
if (isFirstLineSkip)
{
isFirstLineSkip = false;
continue;
}
//リストにデータを追加する
lines.Add(new Data(line[0], line[1], line[2], line[3]));
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//読み込んだデータを確認
foreach (var line in lines)
{
Debug.WriteLine($"1列目 : {line.heder1}");
Debug.WriteLine($"2列目 : {line.heder2}");
Debug.WriteLine($"3列目 : {line.heder3}");
Debug.WriteLine($"4列目 : {line.heder4}");
Debug.WriteLine("--------------------");
}
}
//1行分のデータを格納するレコード
record Data(string heder1, string heder2, string heder3, string heder4);
ファイルの最初の行は項目名になるので、リストに項目名は追加せずにスキップします。
このソースコードを実行した結果が以下になります。
1列目 : aaa
2列目 : bbb
3列目 : ccc
4列目 : ddd
——————–
1列目 : eee
2列目 : fff
3列目 : ggg
4列目 : hhh
——————–
1列目 : iii
2列目 : jjj
3列目 : kkk
4列目 : lll
——————–
ちゃんとカンマ毎にデータの取得ができていることが確認できました。
列が4列以上または以下になる場合は、レコードの引数を調整してソースコードを修正する必要があります。
まとめ
今回は CSV ファイルをC#で1行ずつ読み取む方法を紹介しました。
単純にカンマ区切りで出力するだけであれば、紹介したソースコードで事足りますが、データの中にダブルクォーテーションで括られたカンマがデータ中にあると、プログラムで読み取りした時に正しい値が取得できません。
ダブルクォーテーションで括られたカンマがデータ中にある場合は、そのことを考慮した記述が必要になるので注意しておきましょう。
こういう場面でオススメするライブラリが「CsvHelper」です。このライブラリはオプション設定によって柔軟にCSVの読み込みが行えます。興味がある方は以下の記事を参考にしてみてください。
以上、最後まで読んで頂きありがとうございました。