はじめに
今回は、シンプルに使えるCSVライブラリ「Csv」の使い方を紹介します。
初心者の方や、CsvHelperみたいな高機能はいらない。ちょっとパースしたいだけ。という方に是非おすすめです。
- CsvHelperみたいな高機能はいらない
- 機能を覚えるのがめんどくさい
- ちょっとパースしたいだけ
Csvについて
2020年10月末に公開された新しいライブラリです。
公式にも「Really Simple~」と記載があるように、使い方はとてもシンプルです。配列に読み込んだ後、要素を数字・カラム名で指定することで、読み込んだデータを使用できます。
「行のスキップ」や「トリム」などの便利オプションも備えているので、サクっと使えます。
環境
この記事の内容は、以下の環境で作成しています。
- C# コンソールプログラム
- .NET 4.7.2
- Csv 2.0.62 ※ NuGetでインストール
CSVファイルの内容と保存場所
実行ファイルと同じフォルダに、以下の内容のCSVファイルがあることを前提としています。
下記のコードを確認する場合は以下の「sample.csv」を実行ファイルと同じ場所においてください。
データ1,データ2,データ3
1,2,3
10,20,30
実行結果
上記のコードを実行すると、以下の場面が表示されます。
CSVファイルは以下のように出力されます。
データA,データB,データC
11,21,31
全体のソースコード
全体のソースコードは以下の通りです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; // Fileを使うのに必要です
using Csv; // ライブラリCsv を使うのに必要です
namespace ConsoleAppLibCsvTest
{
class Program
{
static void Main(string[] args)
{
//
// ----- CSVファイルの読み込み -----
//
// ファイルの全内容を文字列に読込みます
string csv = File.ReadAllText("sample.csv");
// ファイルの1行分を2次元配列として取得します
foreach ( ICsvLine line in CsvReader.ReadFromText(csv))
{
// ヘッダーは除去されているので、初回からデータが返されます。
// Indexの番号指定でアクセス
string firstCell = line[0];
// カラム名でアクセス
string accessByName = line[@"データ2"];
// ICsvLineのプチ機能です
// 列数取得
int columCnt = line.ColumnCount;
// スプリット前のデータ(生値)取得
string raw = line.Raw;
// ヘッダー情報取得
string header1 = line.Headers[0];
// 取得データの表示です。
Console.WriteLine("一行の最初のデータ: " + firstCell);
Console.WriteLine("データ2の列の内容 : " + accessByName);
Console.WriteLine("列数: " + columCnt);
Console.WriteLine("生値: " + raw);
Console.WriteLine("一列目のヘッダー: " + header1);
Console.WriteLine();
}
//
// ---------- CSVデータの出力 ----------
//
// 書き込むヘッダー行を作成します
string[] header = new string[] { "データA", "データB", "データC" };
// 書き込むデータを作成します
string[][] newLine = new string[][]
{
new [] { "11", "21", "31" }
};
// データからCSV形式の文字列を生成します
string outcsv = CsvWriter.WriteToText(header, newLine);
// 文字列をファイルに出力します
File.WriteAllText("outfile.csv", outcsv);
Console.WriteLine("何かキーを押すと終了");
Console.ReadKey();
}
}
}
コードのポイント
CSVの読み込み
CSVファイル全体を、一つの文字列(string)として読み取ります。
// ファイルの全内容を文字列に読込みます
string csv = File.ReadAllText("sample.csv");
Csv(ライブラリ)で読み込み
前述の文字列を、CsvReader.ReadFromText()に渡すと、行の内容・一行内の列数・ヘッダー情報をもった「ICsvLine」という型のデータが返されます。
※ 2021/07/01 stringの2次元配列からICsvLineに修正しました。
foreach ( ICsvLine line in CsvReader.ReadFromText(csv))
2次元配列へのアクセス
ICsvLineが保持しているCSVの内容には、インデックスに番号もしくは、ヘッダーのカラム名を指定することでアクセスできます。(CSVの内容は全てstringで保持されています)
// Indexの番号指定でアクセス
string firstCell = line[0];
// カラム名でアクセス
string accessByName = line[@"データ2"];
ICsvLineには以下のプチ機能もあります。
- 一行内の列の数を取得 ( line.ColumnCount )
- スプリットする前の値を取得 (line.Raw)
- ヘッダー名称の取得 (line.Headers[] )
// ICsvLineのプチ機能です
// 列数取得
int columCnt = line.ColumnCount;
// スプリット前のデータ(生値)取得
string raw = line.Raw;
// ヘッダー情報取得
string header1 = line.Headers[0];
CSV出力
CSV出力でポイントとなるコードは以下の部分です。
stringの多次元配列のデータ内容を、CsvWriter.WriteToText()に渡すことで、CSV形式の文字列が生成されます。
上記文字列を、WriteAllText()などでファイルに書き込めば、CSVのファイル出力が完了します。
// データからCSV形式の文字列を生成します
string outcsv = CsvWriter.WriteToText(header, newLine);
まとめ
今回は、シンプルに使えるCSVライブラリ「Csv」の使い方を紹介しました。
Csvには改行への対応など「かゆいところに手が届く」オプションも多数搭載しています。
興味のある方は以下の記事も合わせてご覧ください。
お知らせ
今月号のSoftware Designは「もっとTypeScriptの力を引き出そう」
JavaScriptの拡張言語でしょ?と思っているかたへ、Union型などTypeScriptの持つ秘めたる力を解説する特集となっています。
個人的には第2特集の「Ubuntuの現代的な使い方」がの方が気になりました。より詳しい内容は以下のリンクからご覧ください。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。