はじめに
今回は、シンプルに使えるCSVライブラリ「Csv」で使えるTrimなど各種オプションについて解説します。以下の方におすすめです。
- CSV読取で、Trimなど少し高度なことがしたい
- 公式に載っているオプションの使い方が知りたい。
Csvについて
2020年10月末に公開された新しいライブラリです。
公式にも「Really Simple~」と記載があるように、使い方はとてもシンプルです。配列に読み込んだ後、要素を数字・カラム名で指定することで、読み込んだデータを使用できます。
基本的な使い方は、以下の記事を参照してください。
オプションの設定方法
「CsvOptions」型の変数で各オプションを設定して、Read/Writeの関数に渡すことで有効化します。
var options = new CsvOptions // Defaults
{
RowsToSkip = 0,
SkipRow = (row, idx) => string.IsNullOrEmpty(row) || row[0] == '#',
Separator = '\0',
TrimData = false,
Comparer = null,
HeaderMode = HeaderMode.HeaderPresent,
ValidateColumnCount = false,
ReturnEmptyForMissingColumn = false,
Aliases = null,
AllowNewLineInEnclosedFieldValues = false,
AllowBackSlashToEscapeQuote = false,
AllowSingleQuoteToEncloseFieldValues = false,
NewLine = Environment.NewLine
};
// ファイルの1行分を2次元配列として取得します(オプション付)
foreach (var line in CsvReader.ReadFromText(csv, options))
{
// 行の最初のデータを表示
Console.WriteLine(line[0]);
}
CSVファイル
今回の記事では、実行ファイルと同じディレクトリに「sample.csv」というファイルがあることを前提に進めます。
sample.csvの内容は解説するオプションに合わせて変更していきます。
(変更内容は各オプションの説明の部分に記載しています)
用語について
CSV内のデータの名称部分を「ヘッダー」、
値が記載された部分を「フィールド」、フィールドが記載された行を「フィールド行」として解説しています。
全体のコード
全体のコードは以下の通りです。
基本的にオプションの設定・CSVファイル内容のみを変更します。
その他のコードは変更しないものとして解説しています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; // Fileを使用するのに必要です
using Csv; // Csvを使用するのに必要です
namespace ConsoleAppLibCsvOption
{
class Program
{
static void Main(string[] args)
{
// オプションの指定です
var options = new CsvOptions
{
RowsToSkip = 0,
SkipRow = (row, idx) => string.IsNullOrEmpty(row) || row[0] == '#',
Separator = '\0',
TrimData = false,
Comparer = null,
HeaderMode = HeaderMode.HeaderAbsent,
ValidateColumnCount = false,
ReturnEmptyForMissingColumn = false,
Aliases = null,
AllowNewLineInEnclosedFieldValues = false,
AllowBackSlashToEscapeQuote = false,
AllowSingleQuoteToEncloseFieldValues = false
NewLine = Environment.NewLine,
};
// ファイルの全内容を文字列に読込みます
string csv = File.ReadAllText("sample.csv");
// ファイルの1行分を2次元配列として取得します
foreach (var line in CsvReader.ReadFromText(csv, options))
{
// 行の最初のデータを表示
Console.WriteLine("---" + line[0] + "---");
}
Console.WriteLine("何かキーを押すと終了");
Console.ReadKey();
}
}
}
オプション一覧
設定できるオプションは以下の通りです。
オプション名 | 概要 |
① RowsToSkip | スキップする行数 |
② SkipRow | スキップ指定する文字設定 |
③ Separator | 区切り文字の設定 |
④ TrimData | 空白の削除 |
⑤ Comparer | 項目名でアクセスする際の設定 |
⑥ HeaderMode | ヘッダの読取 |
⑦ ValidateColumnCount | フィールド数のチェック |
⑧ ReturnEmptyForMissingColumn | 無効カラムアクセス時の挙動 |
⑨ Aliases | カラム名のエイリアス設定 |
⑩ AllowNewLineInEnclosedFieldValue | 改行への挙動 |
⑪ AllowBackSlashToEscapeQuote | 「”」のエスケープ文字設定 |
⑫ AllowSingleQuoteToEncloseFieldValues | 「’」でフィールドを囲む設定 |
⑬ NewLine | 改行文字指定 |
※ 使い方を調査中
① RowsToSkip
読み取り時にスキップするフィールド行の数を指定します。
ヘッダー行は行数に含まれません。
「0」を指定するとフィールド行の1行目から、「1」を指定するとフィールド行の2行目から読み取りが開始されます。
CSVデータ
データ1,データ2,データ3
1,2,3
10,20,30
実行結果
RowsToSkip=1 にすると以下のように表示されます。
② SkipRow
行の読み取りをスキップする文字・条件を指定します。
下記設定では、「空白行」・「#」・「*」で始まる行がスキップされます。
SkipRow = (row, idx) => string.IsNullOrEmpty(row) || row[0] == '#' || row[0] == '*',
CSV
読み取りのパスの確認のため、冒頭に「空白行」「#」「*」で始まるコメント行を記載しています。
#コメントと空行のテスト
*,アスタリスクの指定
データ1,データ2,データ3
1,2.3
10,20,30
実行結果
冒頭のコメント行がパスされて、読み込みが行われます。
なお、「#」「*」などの指定文字に後に、カンマ(区切り文字)があっても無くてもその行はパスされます。
③ Separator
指定した文字で、CSV内のデータを区切ります。
CSV
区切り文字の確認のため、「|」でフィールドを区切っています。
データ1,データ2,データ3
12|3|,
1,020|30,
実行結果
カンマではなく、「|」でデータが区切られています。
④ TrimData
全てのフィールドの前後のスペースを取り除きます。
半角スペース、全角スペース、スペースの個数に関わらず全てのスペースが取り除かれます。
CSVデータ
Trimの確認のため、以下のようにスペースを記載しています。
- 「1」の後ろにスペースを2つ
- 「10」の前にスペースを2つ
データ1,データ2,データ3
1 ,2,3
10,20,30
実行結果
全てのスペースが削除されて表示されます。
⑤ Comparer
項目名でデータにアクセスする際に、大文字・小文字を区別しない等の指定が出来ます。
CSV
大文字で項目名を記載しています。
AAA,BBB,CCC
1,2,3
10,20,30
オプション指定と表示コード
Comparerに以下を指定し、大文字・小文字を区別しない設定にしています。
Comparer = StringComparer.OrdinalIgnoreCase,
また、表示するコードに、小文字でデータ配列にアクセスするコードを一行追加しています。
// ファイルの1行分を2次元配列として取得します
foreach (var line in CsvReader.ReadFromText(csv, options))
{
// 行の最初のデータを表示
Console.WriteLine("---" + line[0] + "---");
Console.WriteLine("---" + line["aaa"] + "---");
}
実行結果
CSVの項目名は「AAA」と大文字ですが、line[“aaa”]と小文字で指定した場合でもデータが取得できます。
⑥ HeaderMode
ヘッダーを読み取りデータに含めるかどうかを切り替えます。
オプションの指定方法は以下です。
HeaderMode.HeaderPresent | ヘッダをデータに含めない |
HeaderMode.HeaderAbsent | ヘッダをデータに含める |
CSV
データ1,データ2,データ3
1,2,3
10,20,30
実行結果
HeaderAbsent (データに含める)にした状態の実行結果です。
項目名「データ1」がデータに含まれています。
⑦ ValidateColumnCount
有効にすると、カラム(項目)の数とフィールドの数が違うときに例外「System.InvalidOperationException」を送出します。
CSV
ヘッダーのカラム(項目)は3つありますが、一行目のフィールドが1つしかない状態です。
データ1,データ2,データ3
1,
10,20,30
実行結果
実行時に「System.InvalidOperationException」の例外が発生します。
⑧ ReturnEmptyForMissingColumn
ヘッダーに存在しない、無効なカラム(項目)名で配列にアクセスした際の挙動を切り替えます。
False | アクセス時に例外を送出 |
True | 空の文字列を返す |
CSV
データ1,データ2,データ3
1,2,3
10,20,30
オプション指定と表示コード
オプションを以下のように「True」に設定します。
ReturnEmptyForMissingColumn = true,
また、表示するコードに、以下のように存在しない項目「データX」にアクセスするコードを追加します。
// ファイルの1行分を2次元配列として取得します
foreach (var line in CsvReader.ReadFromText(csv, options))
{
// 行の最初のデータを表示
Console.WriteLine("---" + line[0] + "---");
Console.WriteLine("---" + line[@"データX"] + "---");
}
実行結果
前述のように存在しない項目名にアクセスしても、空の文字列が返されて、例外が発生しません。
⑨ Aliases
配列データにアクセスする項目名に、任意の別名(エイリアス)を設定することが出来ます。
オプションへの設定方法は以下の通りです。
※ 既に存在している名前を指定すると、アクセス時に例外が送出されます。
Aliases = new[] { new[] { "データ1", "エイリアス" } },
CSV
データ1,データ2,データ3
1,2.3
10,20,30
実行結果
要素名にエイリアスを指定した、以下のコードの実行結果です。
別名によるデータへのアクセスが行えるようになります。
// ファイルの1行分を2次元配列として取得します
foreach (var line in CsvReader.ReadFromText(csv, options))
{
// 行の最初のデータを表示
Console.WriteLine("---" + line[0] + "---");
Console.WriteLine("---" + line["エイリアス"] + "---");
}
⑩ AllowNewLineInEnclosedFieldValue
有効化すると、フィールドが改行されていた場合に、読み取りデータにも改行を追加することができます。
改行文字は、下で解説している「NewLine」で設定したものが追加されます。
使用できるのは、フィールドがダブルクォート(“”)で囲まれている時のみです。
CSVデータ
“”で囲まれた「”10″」が途中で改行されています。
データ1,データ2,データ3
1,2,3
"1
0","20","30"
実行結果
読み取りデータにも改行が追加されます。
⑪ AllowBackSlashToEscapeQuote
有効化すると、ダブルクォートのエスケープ文字に「\”」を使うことが出来ます。
「””a””」のような、ダブルクォート2つ使うエスケープ文字は有効化/無効化どちらでも使うことが出来ます。
適用されるのはフィールドがダブルクォートで囲まれている場合のみです。
CSVデータ
ダブルクォート2つでのエスケープ(4行目)と、
「\”」でのエスケープ(5行目)を記載しています。
データ1,データ2,
1,2,3
10,20,30
"x""y""z", eee, fff
"x\"y\"z", eee, fff
実行結果
「””」「\”」のどちらでダブルクォートをエスケープした場合でも、
「”」として認識されています。
⑫ AllowSingleQuoteToEncloseFieldValues
フィールドがダブルクォートで囲まれている際に、シングルクォートでの括りを許可する/しないの設定のようです。
※このオプションのみ、詳細な挙動を確認できませんでした。m(__)m
⑬ NewLine
CSVのデータ中に改行が含まれていた場合に、読み取ったデータに挿入する改行文字を指定します。
※ Environment.NewLine はWindowsでは 「\r\n 」になります。
「⑩ AllowNewLineInEnclosedFieldValue」(データ中の改行適用)を有効にしている場合に使われます。
まとめ
今回は、シンプルに使えるCSVライブラリ「Csv」で使える各種オプションについて解説しました。参考になればうれしいです。
お知らせ
今月号のSoftware Designは「もっとTypeScriptの力を引き出そう」
JavaScriptの拡張言語でしょ?と思っているかたへ、Union型などTypeScriptの持つ秘めたる力を解説する特集となっています。
個人的には第2特集の「Ubuntuの現代的な使い方」がの方が気になりました。より詳しい内容は以下のリンクからご覧ください。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。
CsvOptionsについて大変素晴らしく纏められています。
このサイトがなければ自分で備忘録を作るところでした。
はさん
コメントありがとうございます、えすです。
お役に立ててうれしいです。
コメントいただけると励みになります。