CSV-C# PR

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

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

はじめに

今回は、シンプルに使える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ファイルをパースするコードの実行結果

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』はドメイン駆動設計(DDD)。実例を交えたDDDの手法の解説が特集されています。

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

質問・要望 大歓迎です

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

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

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

COMMENT

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