.NET Framework で CSV を簡単に読み書きできるクラスを提供するライブラリです。
SourceForge.jp: Project File List から、リリースされたパッケージをダウンロードすることができます。
パッケージに DLL 形式のバイナリファイルとソースコードが格納されています。お仕事で使用するのなら、どちらかというとソースコードを直接使用するのがお手軽で良い気がします。 CsvReader.cs, CsvWriter.cs と 2 つありますが、それぞれ単独で動作するようになっています。名前空間は適当に変えてしまってください。
CSV 形式のデータを読み込むには CsvReader クラスを使用します。
まず、インスタンス化します。コンストラクタは 2 種類ありますが、基本的には CsvReader(TextReader) コンストラクタを呼び出せば良いです。区切り文字、改行文字を指定する場合、 EOF 行の読み込みについて指定する場合は CsvReader(TextReader, string, string, bool) コンストラクタを呼び出してください。
CsvReader csvReader = new CsvReader(reader);
try
{
...
}
finally
{
csvReader.Close();
}
CsvReader クラスは IDisposable インターフェイスを実装しています。なので、上記の例は次のように置き換えることもできます。
using (CsvReader csvReader = new CsvReader(reader))
{
...
}
インスタンス化の直後、読み込み位置は最初の行の前にあります。最初の行を読み込むために、まず CsvReader#Read() メソッドを呼び出します。 CsvReader#Read() メソッドは次の行を読み込むメソッドで、読み込みに成功した場合は true 、失敗した場合は false を返します。
csvReader.Read();
行の読み込みに成功すると、インデクサ (または CsvReader#Item プロパティ) で列のデータを取得することができます。
string data = csvReader[0];
ループで最後まで読み込むというありがちな処理は、次のようになります。
while (csvReader.Read())
{
string v = csvReader[0];
...
}
使い終わったら CsvReader#Close() メソッドを呼び出します (コンストラクタの例を参照してください) 。
CsvReader#FieldCount プロパティで、現在の行に含まれる列の数を取得することができます。行が読み込まれていないときに参照すると InvalidOperationException 例外をスローします。
for (int i = 0; i < csvReader.FieldCount; i++) {
string data = csvReader[i];
...
}
CsvReader#RowIndex プロパティで、現在の行の位置を表すインデックス番号を取得することができます。最初の行は 0 です。インスタンス化直後の最初の行の前にある状態は -1 です。
Console.WriteLine("{0} 行目を処理中です。", csvReader.RowIndex);
CsvReader#Close() メソッドは、コンストラクタで指定した TextReader インスタンスも閉じます。
CsvReader#IsClosed プロパティは CsvReader インスタンスが閉じられているかどうかを取得することができます。
if (csvReader.IsClosed)
{
...
}
CSV 形式のデータを書き込むには CsvWriter クラスを使用します。
まず、インスタンス化します。コンストラクタは 2 種類ありますが、基本的には CsvWriter(TextWriter) コンストラクタを呼び出せば良いです。改行文字、区切り文字を指定する場合は CsvWriter(TextWriter, string, string) コンストラクタを呼び出してください。
CsvWriter csvWriter = new CsvWriter(writer);
try
{
...
}
finally
{
csvWriter.Close();
}
CsvWriter クラスは IDisposable インターフェイスを実装しています。名ので、上記の例は次のように置き換えることもできます。
using (CsvWriter csvWriter = new CsvWriter(writer))
{
...
}
データを出力するには CsvWriter#Write() メソッドを呼び出します。
csvWriter.Write("foo");
改行するには CsvWriter#WriteNewLine() メソッドを呼び出します。
csvWriter.WriteNewLine()
使い終わったら CsvWriter#Close() メソッドを呼び出します (コンストラクタの例を参照してください) 。
CsvWriter#RowIndex プロパティは現在の行の位置、CsvWriter#ColumnIndex プロパティは現在の列の位置を表すインデックス番号を表すインデックス番号を取得することができます。最初の行、列は 0 です。インデックス化直後は行 0 、列 -1 です。
CsvWriter#IsClosed プロパティは CsvWriter インスタンスが閉じられているかどうかを取得することができます。
if (csvWriter.IsClosed)
{
...
}
CsvWriter#Write() メソッドは数種類のオーバーロードがあります。
CsvWriter#Write(string) メソッドは単一のデータを出力します。
csvWriter.Write("foo");
CsvWriter#Write(string[]) メソッドは複数のデータを複数列に出力します。最後に改行は入りません。
csvWriter.Write(new string[]{"foo", "bar", "boo"});
// output:
// foo,bar,boo
CsvWriter#Write(string[][]) メソッドは、複数列、複数行のデータを出力します。必ず新しい行の先頭から出力され、最後の行は改行されます。
string[][] data = new string[][]{
string[]{"foo", "bar", "boo"},
string[]{"111", "222", "333"},
};
csvWriter.Write(data);
// output:
// foo,bar,boo
// 111,222,333
CsvWriter#Write(IDataReader) メソッドは、データソースからの検索結果を出力します。全ての列、全ての行を一度に出力します。出力は新しい行で開始し、最後は必ず改行されます。
OdbcConnection conn = new OdbcConnection("DSN=csv-io-net");
try
{
conn.Open();
OdbcCommand command = conn.CreateCommand();
command.CommandText = "SELECT * FROM ZIPCODE";
OdbcDataReader dataReader = command.ExecuteReader();
try
{
using (CsvWriter csvWriter = new CsvWriter(writer))
{
csvWriter.Write(dataReader);
}
}
finally
{
dataReader.Close();
}
}
finally
{
conn.Close();
}
検索結果の特定の列、指定した行数を出力する場合は CsvWriter#Write(IDataReader, string[], int) メソッドを呼び出します。
csvWriter.Write(dataReader, new string[]{"ID", "NAME"}, 10);
// ID, NAME 列を 10 行だけ出力します。
修正 BSD ライセンスを適用します。詳細はパッケージに同梱されている LICENSE.txt を参照してください。
不具合報告、サポート要求、パッチ、要望などは SourceForge.jp: トラッキングに登録してください。ちょっとしたことならメールでも受け付けます。