CSV-C# PR

【C# CSVライブラリ】CsvHelperより簡単に使える「Csv」の使い方 オプション編

記事内に商品プロモーションを含む場合があります

はじめに

今回は、シンプルに使える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内のデータ名称を説明する画像

全体のコード

全体のコードは以下の通りです。
基本的にオプションの設定・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 にすると以下のように表示されます。

RowsToSkipのオプションを1にした時の実行結果

② SkipRow

行の読み取りをスキップする文字・条件を指定します。
下記設定では、「空白行」・「#」・「*」で始まる行がスキップされます。

SkipRow = (row, idx) => string.IsNullOrEmpty(row) || row[0] == '#' || row[0] == '*',

CSV

読み取りのパスの確認のため、冒頭に「空白行」「#」「*」で始まるコメント行を記載しています。

#コメントと空行のテスト

*,アスタリスクの指定

データ1,データ2,データ3
1,2.3
10,20,30

実行結果

冒頭のコメント行がパスされて、読み込みが行われます。
なお、「#」「*」などの指定文字に後に、カンマ(区切り文字)があっても無くてもその行はパスされます。

SkipRowのオプションで、空白、#、*をスキップさせたときの実行結果


③ Separator

指定した文字で、CSV内のデータを区切ります。

CSV

区切り文字の確認のため、「|」でフィールドを区切っています。

データ1,データ2,データ3
12|3|,
1,020|30,

実行結果

カンマではなく、「|」でデータが区切られています。

Separatorで |  を区切り文字としたときの実行結果

④ TrimData

全てのフィールドの前後のスペースを取り除きます。
半角スペース、全角スペース、スペースの個数に関わらず全てのスペースが取り除かれます。

CSVデータ

Trimの確認のため、以下のようにスペースを記載しています。

  • 「1」の後ろにスペースを2つ
  • 「10」の前にスペースを2つ
データ1,データ2,データ3
1  ,2,3
  10,20,30

実行結果

全てのスペースが削除されて表示されます。

TrimDataのオプションで前後のスペースを取り除いた時の実行結果

⑤ 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”]と小文字で指定した場合でもデータが取得できます。

Comparerのオプションで大文字・小文字を区別しないようにしたときの実行結果

⑥ HeaderMode

ヘッダーを読み取りデータに含めるかどうかを切り替えます。
オプションの指定方法は以下です。

HeaderMode.HeaderPresentヘッダをデータに含めない
HeaderMode.HeaderAbsentヘッダをデータに含める

CSV

データ1,データ2,データ3
1,2,3
10,20,30

実行結果

HeaderAbsent (データに含める)にした状態の実行結果です。
項目名「データ1」がデータに含まれています。

HeaderModeでHeaderAdsentにした時の実行結果

⑦ 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"] + "---");

            }

実行結果

前述のように存在しない項目名にアクセスしても、空の文字列が返されて、例外が発生しません。

ReturnEmptyForMissingColumnのオプションをTrueにして、例外が発生しなくなった時の実行結果


⑨ 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"

実行結果

読み取りデータにも改行が追加されます。

AllowNewLineInEnclosedFieldValueのオプションをTrueにして、読み取りデータ改行された状態の実行結果


⑪ 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

実行結果

「””」「\”」のどちらでダブルクォートをエスケープした場合でも、
「”」として認識されています。

AllowBackSlashToEscapeQuoteのオプションを有効化してダブルクォートをエスケープシーケンスで入力した際の実行結果

⑫ AllowSingleQuoteToEncloseFieldValues

フィールドがダブルクォートで囲まれている際に、シングルクォートでの括りを許可する/しないの設定のようです。

※このオプションのみ、詳細な挙動を確認できませんでした。m(__)m

⑬ NewLine

CSVのデータ中に改行が含まれていた場合に、読み取ったデータに挿入する改行文字を指定します。
※ Environment.NewLine はWindowsでは 「\r\n 」になります。

「⑩ AllowNewLineInEnclosedFieldValue」(データ中の改行適用)を有効にしている場合に使われます。

まとめ

今回は、シンプルに使えるCSVライブラリ「Csv」で使える各種オプションについて解説しました。参考になればうれしいです。

お知らせ

今月号の『Software Design』はドメイン駆動設計(DDD)。実例を交えたDDDの手法の解説が特集されています。

編集:Software Design 編集部
¥1,562 (2024/03/13 12:59時点 | Amazon調べ)

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

POSTED COMMENT

  1. より:

    CsvOptionsについて大変素晴らしく纏められています。
    このサイトがなければ自分で備忘録を作るところでした。

    • えす より:

      はさん

      コメントありがとうございます、えすです。

      お役に立ててうれしいです。
      コメントいただけると励みになります。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です