フッターコンテンツにスキップ
IRONXLの使用

C# で CSV をインポートする | ASP.NET Coreチュートリアル | IronXL

ASP.NET Coreを使用して C# で CSV ファイルをインポートするということは、ファイル ストリームを読み取り、区切られた行を解析し、各レコードを型指定されたオブジェクトにマッピングすることを意味します。これらはすべて、データを使用して何か有用な操作を行う前に行う必要があります。 IronXL は、CSV、XLSX、TSV ファイルに同様に機能する単一の API を通じてすべてのステップを処理するため、文字列を分割するエッジ ケースではなく、アプリケーション ロジックに時間を費やすことができます。

無料トライアルを開始して、これらのコード例を自分の環境で実行してテストしてください。

.NETプロジェクトにIronXLをインストールするにはどうすればよいでしょうか?

解析コードを書く前に、 IronXL をプロジェクトに追加します。 Visual Studio のパッケージ マネージャー コンソールまたはプロジェクト ディレクトリのターミナルを開き、次のいずれかのコマンドを実行します。

Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

このパッケージは、.NET 10、 .NET 6+、. .NET Framework 4.6.2+、および.NET Standard 2.0 を対象としているため、あらゆる最新のプロジェクト タイプに適合します。 サーバーに Microsoft Office をインストールする必要はありません。 パッケージが復元されたら、ライブラリを呼び出すファイルの先頭に using IronXL; を追加します。

グローバル ツールのインストールや CI/CD パイプラインの構成などの詳細なセットアップ オプションについては、 IronXLインストール ガイドをご覧ください。

ASP.NET Coreで CSV ファイルをインポートするにはどうすればよいですか?

ASP.NET Coreで CSV ファイルをインポートするには、サーバーからファイル ストリームを読み取り、各行を解析し、値をモデル クラスにマッピングする必要があります。 一部の開発者は手動の実装やサードパーティのパッケージを使用していますが、 IronXL は追加の構成なしで CSV ファイルと Excel 形式を一緒に処理する単一の方法を提供します。

次のコードは、IronXL の WorkBook.LoadCSV メソッドを使用して CSV ファイルをロードする方法を示しています。

using IronXL;

// Load the CSV file directly using the full file path
var csv = WorkBook.LoadCSV("products.csv");
WorkSheet worksheet = csv.DefaultWorkSheet;

// Access CSV data by iterating through rows
foreach (var row in worksheet.Rows)
{
    string productName = row.Columns[1].StringValue;
    decimal price = row.Columns[2].DecimalValue;
    Console.WriteLine($"Product: {productName}, Price: {price}");
}
using IronXL;

// Load the CSV file directly using the full file path
var csv = WorkBook.LoadCSV("products.csv");
WorkSheet worksheet = csv.DefaultWorkSheet;

// Access CSV data by iterating through rows
foreach (var row in worksheet.Rows)
{
    string productName = row.Columns[1].StringValue;
    decimal price = row.Columns[2].DecimalValue;
    Console.WriteLine($"Product: {productName}, Price: {price}");
}
$vbLabelText   $csharpLabel

WorkBook.LoadCSV メソッドの理解

WorkBook.LoadCSV メソッドは CSV ファイルを読み取り、各行が行になり、区切られた各値がセルになるワークシートを作成します。 IronXL は区切り文字 (カンマ、セミコロン、またはタブ) を自動的に検出し、値内にカンマが含まれる引用符で囲まれたフィールドを処理します。 標準の CSV ファイルでは、区切り文字を手動で設定する必要はありません。

DateTimeValue などのセル値アクセサーは型変換を処理するため、int.TryParse または decimal.Parse による手動解析を回避できます。 セルが空の場合、または認識されない値が含まれている場合、これらのアクセサーは例外をスローするのではなく、型の既定値を返します。これにより、一括インポート操作中に処理されないエラーが発生するのを防ぎます。

このアプローチにより、エスケープされた引用符、Windows スタイルの行末、複数行のセルの値などのエッジケースで特に必要な、カスタム実装で必要な、エラーが発生しやすい手動の文字列解析が不要になります。 サポートされている形式と区切り文字オ​​プションの詳細については、 IronXL CSV ドキュメントを参照してください。

ASP インポート CSV: 完全な C# 開発者ガイド: 画像 1 - 単純な CSV ファイルをインポートし、コンソールで出力を読み取る

CSV データのモデル クラスを作成するにはどうすればよいですか?

CSV データを厳密に型指定されたオブジェクトにマッピングするには、ファイル構造をミラーリングするモデル クラスが必要です。 生の文字列データを整数、小数、DateTime 値などの特定の型に変換します。 製品在庫データの場合は、各 CSV 列に一致するプロパティを持つクラスを作成します。

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public int Quantity { get; set; }
}
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public int Quantity { get; set; }
}
$vbLabelText   $csharpLabel

CSV 行を型付きコレクションに解析する

モデル クラスを定義すると、CSV レコードを型指定されたコレクションに解析できます。 次の例では、ループ インデックスを使用してヘッダー行をスキップし、後続の各行を Product オブジェクトにマップします。

using IronXL;

WorkBook workbook = WorkBook.LoadCSV("inventory.csv");
WorkSheet ws = workbook.DefaultWorkSheet;
var records = new List<Product>();

// Skip header row (index 0), iterate through data rows
for (int i = 1; i < ws.Rows.Count(); i++)
{
    var row = ws.Rows[i];
    var product = new Product
    {
        Id = row.Columns[0].IntValue,
        Name = row.Columns[1].StringValue,
        Price = row.Columns[2].DecimalValue,
        Quantity = row.Columns[3].IntValue
    };
    records.Add(product);
}

Console.WriteLine($"Loaded {records.Count} products.");
using IronXL;

WorkBook workbook = WorkBook.LoadCSV("inventory.csv");
WorkSheet ws = workbook.DefaultWorkSheet;
var records = new List<Product>();

// Skip header row (index 0), iterate through data rows
for (int i = 1; i < ws.Rows.Count(); i++)
{
    var row = ws.Rows[i];
    var product = new Product
    {
        Id = row.Columns[0].IntValue,
        Name = row.Columns[1].StringValue,
        Price = row.Columns[2].DecimalValue,
        Quantity = row.Columns[3].IntValue
    };
    records.Add(product);
}

Console.WriteLine($"Loaded {records.Count} products.");
$vbLabelText   $csharpLabel

records コレクションには、データベース操作、JSON シリアル化、またはその他のビジネス ロジックに使用できる型指定された Product オブジェクトが含まれるようになりました。 IronXL のセル値アクセサーは、オプション フィールドの null 処理を含め、型変換を自動的に処理します。

オプションおよびNull許容フィールドの処理

実際の CSV ファイルには、空のセルとオプションの列が含まれていることがよくあります。 IronXL の値アクセサは、セルが空白の場合、例外ではなくデフォルト値を返します。 null 許容型の場合は、条件チェックを使用できます。

// Reading an optional DateTime field
DateTime? lastUpdated = string.IsNullOrEmpty(row.Columns[4].StringValue)
    ? null
    : row.Columns[4].DateTimeValue;
// Reading an optional DateTime field
DateTime? lastUpdated = string.IsNullOrEmpty(row.Columns[4].StringValue)
    ? null
    : row.Columns[4].DateTimeValue;
$vbLabelText   $csharpLabel

このパターンは、すべてのセル アクセスを try-catch ブロックでラップすることなく、インポート コードを防御的なものにします。 複雑なデータ型と大きなファイルの処理に関するガイダンスについては、 IronXL WorkSheet のドキュメントをご覧ください。

Web API で CSV ファイルのアップロードをどのように処理しますか?

ブラウザからの CSV ファイルのアップロードを受け入れる API エンドポイントを構築するには、 ASP.NET Core の IFormFile と IronXL の解析機能を組み合わせる必要があります。 次のコードは、アップロードされたファイルを解析し、JSON 応答を返す完全なコントローラー実装を示しています。

using IronXL;
using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[ApiController]
public class CsvController : ControllerBase
{
    [HttpPost("upload")]
    public async Task<IActionResult> UploadCsv(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("Please upload a valid CSV file.");

        try
        {
            using var stream = new MemoryStream();
            await file.CopyToAsync(stream);
            stream.Position = 0;

            WorkBook workbook = WorkBook.Load(stream, "csv");
            WorkSheet ws = workbook.DefaultWorkSheet;
            var records = new List<Product>();

            // Skip header row, iterate through data rows
            for (int i = 1; i < ws.Rows.Count(); i++)
            {
                var row = ws.Rows[i];
                records.Add(new Product
                {
                    Id = row.Columns[0].IntValue,
                    Name = row.Columns[1].StringValue,
                    Price = row.Columns[2].DecimalValue,
                    Quantity = row.Columns[3].IntValue
                });
            }

            return Ok(new
            {
                message = "Import successful",
                count = records.Count,
                data = records
            });
        }
        catch (Exception ex)
        {
            return BadRequest($"Error processing file: {ex.Message}");
        }
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[ApiController]
public class CsvController : ControllerBase
{
    [HttpPost("upload")]
    public async Task<IActionResult> UploadCsv(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("Please upload a valid CSV file.");

        try
        {
            using var stream = new MemoryStream();
            await file.CopyToAsync(stream);
            stream.Position = 0;

            WorkBook workbook = WorkBook.Load(stream, "csv");
            WorkSheet ws = workbook.DefaultWorkSheet;
            var records = new List<Product>();

            // Skip header row, iterate through data rows
            for (int i = 1; i < ws.Rows.Count(); i++)
            {
                var row = ws.Rows[i];
                records.Add(new Product
                {
                    Id = row.Columns[0].IntValue,
                    Name = row.Columns[1].StringValue,
                    Price = row.Columns[2].DecimalValue,
                    Quantity = row.Columns[3].IntValue
                });
            }

            return Ok(new
            {
                message = "Import successful",
                count = records.Count,
                data = records
            });
        }
        catch (Exception ex)
        {
            return BadRequest($"Error processing file: {ex.Message}");
        }
    }
}
$vbLabelText   $csharpLabel

エンドポイントとマルチパートフォームの構成

[HttpPost("upload")] アクションがファイルのアップロードを受け入れるには、プロジェクトでマルチパート フォーム データをサポートする必要があります。 最小限の API セットアップの Program.cs では、builder.Services.AddControllers()app.MapControllers() が呼び出されていることを確認してください。 エンドポイントは/api/csv/uploadでアクセス可能になります。

ブラウザ フォームからテストする場合は、フォームの enctype 属性を multipart/form-data に設定し、ファイル入力要素を使用します。 PostmanなどのAPIクライアントの場合、リクエスト本文で"form-data"を選択し、fileというキーを追加して、CSVファイルを添付します。コントローラーは、レコード数と解析されたデータ配列を含むJSONオブジェクトを返します。このオブジェクトは、クライアント側 for JavaScriptですぐに使用できます。

ASP インポート CSV: 完全な C# 開発者ガイド: 画像 2 - インポートされた CSV ファイルから読み取られたデータによる正常な出力

解析前にファイルタイプを検証する

ストリームをIronXLに渡す前に、ファイル拡張子を検証して、CSV 以外のアップロードを拒否します。

var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (extension != ".csv" && extension != ".txt")
    return BadRequest("Only CSV files are accepted.");
var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (extension != ".csv" && extension != ".txt")
    return BadRequest("Only CSV files are accepted.");
$vbLabelText   $csharpLabel

このチェックにより、不正なバイナリ データがパーサーに到達するのを防ぎ、API コンシューマーに明確なエラー メッセージを提供します。 より厳格に適用するために、file.ContentType を使用してこの検証を拡張し、MIME タイプをチェックすることができます。

CSV データをデータベースに保存するにはどうすればよいですか?

CSV ファイルを型付きオブジェクトに解析した後、通常はレコードをデータベースに保存します。 次の例では、一括挿入に Entity Framework Core の AddRangeAsync を使用して、サービス レイヤー パターンを拡張します。

using IronXL;

public class CsvImportService
{
    private readonly AppDbContext _context;

    public CsvImportService(AppDbContext context)
    {
        _context = context;
    }

    public async Task<int> ImportProductsAsync(Stream csvStream)
    {
        WorkBook workbook = WorkBook.LoadCSV(csvStream);
        WorkSheet ws = workbook.DefaultWorkSheet;
        var products = new List<Product>();

        foreach (var row in ws.Rows.Skip(1))
        {
            products.Add(new Product
            {
                Id = row.Columns[0].IntValue,
                Name = row.Columns[1].StringValue,
                Price = row.Columns[2].DecimalValue,
                Quantity = row.Columns[3].IntValue
            });
        }

        await _context.Products.AddRangeAsync(products);
        return await _context.SaveChangesAsync();
    }
}
using IronXL;

public class CsvImportService
{
    private readonly AppDbContext _context;

    public CsvImportService(AppDbContext context)
    {
        _context = context;
    }

    public async Task<int> ImportProductsAsync(Stream csvStream)
    {
        WorkBook workbook = WorkBook.LoadCSV(csvStream);
        WorkSheet ws = workbook.DefaultWorkSheet;
        var products = new List<Product>();

        foreach (var row in ws.Rows.Skip(1))
        {
            products.Add(new Product
            {
                Id = row.Columns[0].IntValue,
                Name = row.Columns[1].StringValue,
                Price = row.Columns[2].DecimalValue,
                Quantity = row.Columns[3].IntValue
            });
        }

        await _context.Products.AddRangeAsync(products);
        return await _context.SaveChangesAsync();
    }
}
$vbLabelText   $csharpLabel

依存性注入へのサービスの組み込み

コントローラーがコンストラクター注入を通じて要求できるように、CsvImportServiceProgram.cs に登録します。

builder.Services.AddScoped<CsvImportService>();
builder.Services.AddScoped<CsvImportService>();
$vbLabelText   $csharpLabel

次に、コントローラーのコンストラクターを更新し、サービスを受け入れ、リストをインラインで構築するのではなく、ImportProductsAsync を呼び出すようにします。この分離により、コントローラーのアクションが軽量化され、データアクセスロジックがテスト可能なサービスクラスに移行されます。 Entity Framework Core は、AddRangeAsync 呼び出しをバッチごとに 1 つの INSERT ステートメントにバッチ処理します。これにより、数千の行を含む CSV ファイルでパフォーマンスが向上します。

非常に大規模なインポート (数万行) の場合は、 EF Core の Bulk Extensionsまたは生の SQL BULK INSERT ステートメントを使用して、データベースへのラウンドトリップを減らすことを検討してください。

IronXLを使用してデータを CSV にエクスポートするにはどうすればよいですか?

IronXL はCSV ファイルの読み取りだけでなく、書き込みも行えます。 SaveAsCsv メソッドは、任意のワークシートを CSV ファイルにエクスポートします。これは、レポートを生成したり、下流のシステムにデータを送信したりするのに役立ちます。

using IronXL;

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLS);
WorkSheet ws = workbook.DefaultWorkSheet;

// Write headers
ws["A1"].Value = "Id";
ws["B1"].Value = "Name";
ws["C1"].Value = "Price";

// Write data rows
ws["A2"].Value = 1;
ws["B2"].Value = "Widget A";
ws["C2"].Value = 9.99;

ws["A3"].Value = 2;
ws["B3"].Value = "Widget B";
ws["C3"].Value = 14.49;

// Save as CSV
workbook.SaveAsCsv("export.csv");
Console.WriteLine("CSV export complete.");
using IronXL;

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLS);
WorkSheet ws = workbook.DefaultWorkSheet;

// Write headers
ws["A1"].Value = "Id";
ws["B1"].Value = "Name";
ws["C1"].Value = "Price";

// Write data rows
ws["A2"].Value = 1;
ws["B2"].Value = "Widget A";
ws["C2"].Value = 9.99;

ws["A3"].Value = 2;
ws["B3"].Value = "Widget B";
ws["C3"].Value = 14.49;

// Save as CSV
workbook.SaveAsCsv("export.csv");
Console.WriteLine("CSV export complete.");
$vbLabelText   $csharpLabel

エクスポートされたファイルでは、デフォルトでコンマ区切り文字が使用されます。 ヨーロッパのロケールで一般的なセミコロンで区切られたファイルの場合は、明示的な区切り文字引数を使用して SaveAsCsv("export.csv", ";") を呼び出します。 また、MemoryStream に保存し、File(stream, "text/csv", "export.csv") を使用して API エンドポイントからファイルのダウンロードとして結果を返すこともできます。

エクスポート オプションの詳細なリファレンスについては、 IronXL の保存とエクスポートのドキュメントをご覧ください。

手動による CSV 解析よりもIronXL が優れている理由は何ですか?

手動による CSV 解析は、引用符で囲まれたコンマを含む値、セルに埋め込まれた改行、エスケープされた引用符、UTF-8 ファイルの先頭のバイト オーダー マークなどのエッジ ケースが発生するまでは、簡単に見えます。 これらすべてをカスタム StreamReader ループで正しく処理するには、相当のテストと継続的なメンテナンスが必要です。

IronXL はこれらすべてのケースを社内で対処します。 2 つのアプローチを比較すると、明らかな利点がわかります。

C# での CSV 解析におけるIronXLと手動 StreamReader の比較
能力 IronXL 手動ストリームリーダー
自動区切り文字検出 はい いいえ - 手動で設定する必要があります
引用符付きフィールドの処理 組み込み カスタムロジックが必要
型変換(int、decimal、DateTime) 組み込みアクセサ Parse/TryParse呼び出しが必要
複数行のセル値 自動的に処理 正しく実装するのが難しい
BOM処理 自動翻訳 StreamReaderの設定が必要です
Excel形式のサポート(XLSX、XLS) 同じAPI 別途ライブラリが必要
CSVへのエクスポート SaveAsCsvメソッド 別途書き込みロジックが必要

クロスフォーマットの一貫性

IronXL の実用的な利点の 1 つは、同じ WorkBook.Load とワークシート反復パターンが XLSX、XLS、ODS、および CSV ファイルで機能することです。 アプリケーションがユーザーから複数のスプレッドシート形式を受け入れる必要がある場合は、解析ロジックを変更せずに形式を切り替えることができます。 ファイル ストリームを WorkBook.Load に渡すと、 IronXL はファイル署名に基づいて自動的に形式を検出します。

このクロスフォーマット API を使用すると、CSV と Excel の個別の実装を維持するのではなく、1 つのコード パスを記述してテストできます。 サポートされている形式の完全なリストについては、 IronXLでサポートされているファイル形式のページを参照してください。

大きなファイルのパフォーマンスに関する考慮事項

100 MB 未満の CSV ファイルの場合、 IronXL はチューニングなしでも適切に動作します。 大きなファイルの場合は、次の戦略を検討してください。

  • メモリ割り当てを削減するために、ファイルを MemoryStream にコピーするのではなく、パスからロードします。
  • 最初の挿入の前にすべてのレコードを収集するのではなく、データベースに挿入するときに行をバッチで処理します。
  • ヘッダー行が Product オブジェクトとして実現されることを回避するには、LINQ で ws.Rows.Skip(1) を使用します。

IronXLパフォーマンス ガイドでは、並列処理やストリーミング モードなどの大量インポート シナリオ向けの追加の最適化について説明します。

次のステップは何ですか?

これで、 ASP.NET Coreでの CSV インポートの各段階 (ライブラリのインストール、ディスクまたはアップロードされたストリームからのファイルの読み込み、型指定されたモデル オブジェクトへの行のマッピング、Entity Framework Core を使用したデータベースへのレコードの永続化、必要に応じてデータを CSV にエクスポートする) で機能するパターンができました。

この基盤を構築するには、次のリソースを調べてください。

プロジェクトにIronXLを使用すると、CSV とともに XLSX アップロードのサポートを追加するために追加のコード変更は必要ありません。同じ WorkBook.Load 呼び出しで両方を処理できます。 この一貫性により、アプリケーションの要件の拡大に合わせて、インポート エンドポイントの機能セットを段階的に拡張できます。

よくある質問

ASP.NET Coreアプリケーションに CSV ファイルをインポートするにはどうすればよいですか?

IronXLを使用して、ファイルのアップロード、CSVデータの解析、モデルクラスオブジェクトへのマッピングを行うことで、 ASP.NET CoreアプリケーションにCSVファイルをインポートできます。IronXLは、これらのタスクを効率的に実行するためのAPIを提供しています。

C# での CSV インポートにIronXLを使用する利点は何ですか?

IronXLは、CSVファイルのインポートプロセスを簡素化するAPIを提供しています。データの解析、モデルへのマッピング、レコードのJSONへの変換が簡単に行えるため、データ駆動型アプリケーションに最適です。

IronXL はCSV データをモデル クラス オブジェクトに解析できますか?

はい、 IronXL はCSV データをモデル クラス オブジェクトに解析できるため、 .NETアプリケーション内で構造化データを効率的に操作できます。

IronXL は、CSV ファイルのインポート時にデータベース統合にどのように役立ちますか?

IronXL は、CSV データを解析し、データベースに簡単に挿入または更新できるモデル オブジェクトにマップできるようにすることで、データベース統合を支援します。

IronXLを使用して CSV レコードを JSON として返すことは可能ですか?

はい、 IronXLを使用すると、CSV レコードを JSON 形式に変換できます。これは、Web API の作成やフロントエンド アプリケーションとの統合に役立ちます。

IronXL はCSV 以外にどのようなファイル形式を処理できますか?

IronXL はCSV に加えて、XLSX、XLS などのさまざまな Excel ファイル形式を処理できるため、さまざまなスプレッドシートのニーズに柔軟に対応できます。

IronXL は大きな CSV ファイルのインポートをサポートしていますか?

IronXL は、大規模な CSV ファイルのインポートを効率的に処理するように設計されており、データ駆動型アプリケーションのパフォーマンスと信頼性を保証します。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me