C# で CSV ファイルを DataTable に読み込む
-
C#
で CSV ファイルを DataTable に読み込むためのライブラリ -
Andrew Rissing の GenericParser を使用して、CSV ファイルを読み取り、それを
C#
の DataTable に表示する -
Sebastien Lorion の CSV Reader を使用して CSV ファイルを読み取り、それを
C#
の DataTable に表示する -
テキスト フィールド パーサーを使用して CSV ファイルを読み取り、それを
C#
の DataTable に表示する
この記事では、CSV ファイルを解析し、その内容を C# ウィンドウの DataTable に表示するために使用できるさまざまな C# ライブラリについて説明します。
C#
で CSV ファイルを DataTable に読み込むためのライブラリ
プログラミングをしていると、あるデータ形式を別のデータ形式に変換する必要がある状況によく遭遇します。 CSV 形式は、一部の半構造化データをファイルに保存するための形式の 1つです。
CSV ファイルは、データが複数の列とフィールドに格納され、列区切り文字 (,
) を使用して区切られたカンマ区切りファイルです。
このような種類のファイルを解析するために、さまざまな C# ライブラリを使用できます。 この記事では、次の 3つの最も一般的でよく使用されるライブラリについて説明します。
- Andrew Rissing による汎用パーサー
- Sebastien Lorion による CSV リーダー
- テキスト フィールド パーサー
これらのライブラリは C# 言語で開発されており、CSV ファイルからデータを取得して画面に表示する簡単な方法を提供します。
Andrew Rissing の GenericParser を使用して、CSV ファイルを読み取り、それを C#
の DataTable に表示する
GenericParser は、区切られた固定幅データを効率的に解析する軽量でポータブルなソリューションであり、外部要件はほとんどありません。 Microsoft が提供するソリューションは、独自の機能も提供する GenericParser に置き換えることができます。
コードは明確なレイアウトを持ち、理解と変更が簡単です。 このパーサーは、メモリと時間の点で、他の 2つのパーサーと比較して最も効率的です。
GenericParser のインストールと使用
GenericParser に必要なライブラリ ファイルをインストールするには、まず Visual Studio で Windows フォーム アプリケーションを作成し、下のスクリーンショットに示すように、[ツール] -> [ソリューションの Nuget パッケージの管理] に移動します。
プロジェクトで利用可能なさまざまなパッケージを示すウィンドウが表示されます。
[参照] タブに移動し、Generic Parser を検索して、ウィンドウの右側のペインからプロジェクトを選択した後、[インストール] を選択します。 これは、以下のスクリーンショットに示されています。
これにより、必要なすべてのライブラリ ファイルがプロジェクトにインストールされます。 インストールが完了したら、コードでライブラリを使用できます。
コードでは、フォームに DataGridView
を作成して、CSV ファイルから入力されるデータ テーブルを表示します。 Form1.cs
ファイルを開き、フォーム ロード関数にコードを記述します。
最初のステップは、GenericParserAdapter
のオブジェクトを作成することです。 データテーブルにデータを表示する必要があるため、Adapter
クラスを使用しています。
Adapter
クラスは、データ テーブル内のデータ全体を直接コピーする方法を提供します。
オブジェクトが作成されたら、SetDataSource
関数を使用して読み取る CSV ファイルのパスを指定します。 データ ソースが提供されると、列区切り記号、最初の行ヘッダー、バッファー サイズ、最大行数、テキスト修飾子など、データ ファイルのさまざまな属性が設定されます。
初期化後、GetDataTable
関数を使用して DataTable のデータを取得します。 この関数は、CSV ファイルから行ヘッダーを含むすべてのデータをデータ テーブルに自動的に取り込みます。
これを C# コードにカプセル化しましょう。
DataTable dataTable = new DataTable();
using GenericParserAdapter dataParser = new GenericParserAdapter();
dataParser.SetDataSource("SampleCSVFile.csv");
dataParser.ColumnDelimiter = ',';
dataParser.FirstRowHasHeader = true;
dataParser.SkipStartingDataRows = 0;
dataParser.MaxBufferSize = 4096;
dataParser.MaxRows = 1000000;
dataParser.TextQualifier = '\"';
dataTable = dataParser.GetDataTable();
データ テーブルにデータが入力されると、それをフォームの DataGridView
にバインドして、すべてのデータが表形式で表示されるようにします。
dataGridView1.DataSource = dataTable;
実行すると、次の出力が得られます。
Sebastien Lorion の CSV Reader を使用して CSV ファイルを読み取り、それを C#
の DataTable に表示する
Sebastian Lorion による CSV リーダーは、Lumen Works CSV Reader として知られています。 これは、System.IO.StreamReader
に基づいて設計された前方専用の非キャッシュ リーダーです (消防ホース カーソルと呼ばれることがあるものと同じです)。
OLEDB および正規表現メソッドと比較すると、約 15 倍高速に実行されますが、使用するメモリはほとんどありません。
このライブラリをインストールするには、Nuget パッケージを参照し (このステップの前の例を参照)、LumenWorks CSV Reader
を検索します。
CSV ファイルを読み取るためのさまざまな機能を提供する複数のクラスがあります。 CsvReader
と CachedCsvReader
はその中にあります。
CsvReader は、一行ずつ読み込んで画面に表示する必要がある場合に使用します。 CachedCsvReader
は、CSV データをDataGrid
などの画面上のデータ ビューアーにバインドする必要がある場合に使用されます。
ファイルを開いて画面に表示するだけの簡単なものです。
前の例のようにサンプルの CSV ファイルがあり、その CSV ファイルを解析して Form アプリケーションの DataGridView
に表示する必要があるとします (前の例と同様)。
using (CachedCsvReader dataReader = new CachedCsvReader(new StreamReader("SampleCSVFile.csv"),
true)) {
// The headers in the CSV file will be the columns of the DataTable
dataGridView1.DataSource = dataReader;
}
DataGridView
にデータを表示する必要があるため、CachedCsvReader
クラスを使用しました。 そのオブジェクトの作成は、その基礎となる設計が StreamReader
に基づいているため、StreamReader
のオブジェクトを取り込みます。
ファイルを開くと、すべてのファイル データが dataReader
オブジェクトに保存されます。 そのオブジェクトをフォーム画面の DataGridView
にバインドします。
DataGridView
は、列の数と列の名前に応じて自動的に入力されます。 自分で列を作成する必要はありません。
両方のコード セグメントに同じファイルを使用したため、出力は前のものと同じになります。
テキスト フィールド パーサーを使用して CSV ファイルを読み取り、それを C#
の DataTable に表示する
TextFieldParser
クラスは、以前は Visual Basic のコンポーネントであった Microsoft 名前空間 VisualBasic.FileIO
から移植されました。
このパーサーは、.NET Core 3.0 以降のバージョンとのみ互換性があることに注意してください。 .NET Core バージョン 2.2 以前はサポートされていません。
TextFieldParser
は、構造化テキスト ファイルを解析するためのメソッドとプロパティを提供します。 また、区切り (CSV) と固定幅の 2 種類のファイルもサポートしています。
唯一の欠点は、前の 2つのパーサーほど高速でも効率的でもないことです。 さらに、この記事で説明した他のパーサーのように、データをいくつかのビューにバインドしたり、データを表形式で取得したりするなど、多くの機能を提供しません。
データを行ごとに明示的に読み取り、自分でテーブルにデータを入力する必要があります。 これにより、プロセスが長くなり、より多くのコーディング手順が必要になります。
テキスト フィールド パーサーを実装するには、Nuget パッケージをインストールする必要があります。 [NuGet パッケージ] ウィンドウを参照して、テキスト フィールド パーサーを検索します。
必要なライブラリ ファイルをインストールしたら、コード ファイルに移動し、CSV ファイルからデータを読み取る関数を作成します。 この関数では、最初に TextFieldParser
オブジェクトと DataTable
オブジェクトを作成します。
さらに進んで、区切りトークン記号をオブジェクトに指定し、その他の値を初期化します。
その後、ファイルの最初の行を読み取ってデータ テーブルの列を作成し、それらの列を追加します。 次に、残りのデータを読み取り、DataTable に行ごとに追加します。
それをコーディング関数にカプセル化しましょう。
private static DataTable ParseDataFromCSV(string path) {
DataTable myData = new DataTable();
try {
using (TextFieldParser reader = new TextFieldParser(path)) {
reader.SetDelimiters(new string[] { "," });
reader.HasFieldsEnclosedInQuotes = true;
string[] col_headers = reader.ReadFields();
foreach (string h in col_headres) {
DataColumn d1 = new DataColumn(h);
d1.AllowDBNull = true;
myData.Columns.Add(d1);
}
while (!reader.EndOfData) {
string[] row_data = reader.ReadFields();
myData.Rows.Add(row_data);
}
}
}
次のようにファイル パスを提供するドライバー関数からこの関数を呼び出します。
DataTable dataTable = new DataTable();
dataTable = ParseDataFromCSV("SampleCSVFile.csv");
dataGridView1.DataSource = dataTable;
このコード セグメントの出力も、前のものと同じになります。
C# ユーザーは、簡単で使いやすい TextFieldParser を使用して CSV ファイルを読み取ることができます。 区切り (CSV) ファイルや固定幅ファイルなどのファイルの解析を簡単にする手法と属性を提供します。
.NET Core 3.0+ には既定で既に含まれているため、サードパーティのソフトウェアを使用する必要はありません。