
C# で CSV をインポートする | ASP.NET Coreチュートリアル | IronXL
ASP.NET Coreで C# から CSV ファイルをインポートする場合、ファイル ストリームを読み込み、区切り文字で区切られた行を解析し、各レコードを型付きオブジェクトにマッピングする必要があります。これらはすべて、データを使って何らかの有用な処理を行う前に実行する必要がある処理です。 IronXLは、CSV、XLSX、TSVファイルすべてに同様に機能する単一のAPIを通じてすべてのステップを処理するため、文字列分割の特殊なケースに時間を費やすのではなく、アプリケーションロジックの開発に集中できます。
無料トライアルを開始して、これらのコード例を自分の環境で試してみましょう。
.NETプロジェクトにIronXLをインストールするにはどうすればよいですか?
解析コードを記述する前に、プロジェクトにIronXLを追加してください。 Visual Studio のパッケージ マネージャー コンソール、またはプロジェクト ディレクトリのターミナルを開き、次のいずれかのコマンドを実行します。
このパッケージは、.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ファイルをインポートするには、サーバーからファイルストリームを読み込み、各行を解析し、値をモデルクラスにマッピングする必要があります。 一部の開発者は手動のStreamReader実装やサードパーティのパッケージを利用しますが、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}");
}Imports IronXL
' Load the CSV file directly using the full file path
Dim csv = WorkBook.LoadCSV("products.csv")
Dim worksheet As WorkSheet = csv.DefaultWorkSheet
' Access CSV data by iterating through rows
For Each row In worksheet.Rows
Dim productName As String = row.Columns(1).StringValue
Dim price As Decimal = row.Columns(2).DecimalValue
Console.WriteLine($"Product: {productName}, Price: {price}")
NextWorkBook.LoadCSV メソッドの理解
WorkBook.LoadCSVメソッドはCSVファイルを読み取り、各行を行として、各区切り値をセルとしてワークシートを作成します。 IronXLは区切り文字(カンマ、セミコロン、タブ)を自動的に検出し、値の中にカンマが含まれる引用符付きフィールドを処理します。 標準的なCSVファイルの場合、区切り文字を手動で設定する必要はありません。
decimal.Parseによる解析を避けることができます。 セルが空の場合、または認識されない値が含まれている場合、これらのアクセサーは例外をスローするのではなく、型のデフォルト値を返します。これにより、一括インポート操作中に未処理のエラーが発生するのを防ぎます。
このアプローチにより、カスタム実装で必要となるエラーが発生しやすい手動の文字列解析が不要になります。特に、エスケープされた引用符、Windowsスタイルの改行コード、複数行のセル値といった特殊なケースにおいて有効です。 サポートされているフォーマットと区切り文字オプションの詳細については、 IronXL CSV のドキュメントを参照してください。

CSVデータ用のモデルクラスを作成するにはどうすればよいですか?
CSVデータを厳密に型指定されたオブジェクトにマッピングするには、ファイル構造を反映したモデルクラスが必要です。 生の文字列データを、整数、小数、日時値などの特定の型に変換します。 製品在庫データについては、各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 Property Id As Integer
Public Property Name As String = String.Empty
Public Property Price As Decimal
Public Property Quantity As Integer
End ClassCSV行を型付きコレクションに解析する
モデルクラスを定義することで、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.");Imports IronXL
Dim workbook As WorkBook = WorkBook.LoadCSV("inventory.csv")
Dim ws As WorkSheet = workbook.DefaultWorkSheet
Dim records As New List(Of Product)()
' Skip header row (index 0), iterate through data rows
For i As Integer = 1 To ws.Rows.Count() - 1
Dim row = ws.Rows(i)
Dim product As New Product With {
.Id = row.Columns(0).IntValue,
.Name = row.Columns(1).StringValue,
.Price = row.Columns(2).DecimalValue,
.Quantity = row.Columns(3).IntValue
}
records.Add(product)
Next
Console.WriteLine($"Loaded {records.Count} products.")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
Dim lastUpdated As DateTime? = If(String.IsNullOrEmpty(row.Columns(4).StringValue), Nothing, row.Columns(4).DateTimeValue)このパターンでは、すべてのセルアクセスを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}");
}
}
}Imports IronXL
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Imports System.Threading.Tasks
<Route("api/[controller]")>
<ApiController>
Public Class CsvController
Inherits ControllerBase
<HttpPost("upload")>
Public Async Function UploadCsv(file As IFormFile) As Task(Of IActionResult)
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("Please upload a valid CSV file.")
End If
Try
Using stream As New MemoryStream()
Await file.CopyToAsync(stream)
stream.Position = 0
Dim workbook As WorkBook = WorkBook.Load(stream, "csv")
Dim ws As WorkSheet = workbook.DefaultWorkSheet
Dim records As New List(Of Product)()
' Skip header row, iterate through data rows
For i As Integer = 1 To ws.Rows.Count() - 1
Dim row = ws.Rows(i)
records.Add(New Product With {
.Id = row.Columns(0).IntValue,
.Name = row.Columns(1).StringValue,
.Price = row.Columns(2).DecimalValue,
.Quantity = row.Columns(3).IntValue
})
Next
Return Ok(New With {
.message = "Import successful",
.count = records.Count,
.data = records
})
End Using
Catch ex As Exception
Return BadRequest($"Error processing file: {ex.Message}")
End Try
End Function
End Classエンドポイントとマルチパートフォームの設定
[HttpPost("upload")]アクションでファイルアップロードを受け入れるには、プロジェクトがマルチパートフォームデータをサポートする必要があります。 ミニマルAPI設定のためにapp.MapControllers()を呼び出したことを確認してください。 エンドポイントは/api/csv/uploadでアクセス可能になります。
ブラウザフォームからテストする際、フォームのmultipart/form-dataに設定し、ファイル入力要素を使用してください。 APIクライアント(例:Postman)の場合、リクエストボディで"form-data"を選択し、fileというキーを追加してCSVファイルを添付します。コントローラは、レコード数と解析されたデータ配列を含むJSONオブジェクトを返します。クライアント側 for JavaScriptはすぐにこれを利用できます。

解析前にファイルタイプを検証する
IronXLにストリームを渡す前に、ファイル拡張子を検証して、CSV以外のファイルのアップロードを拒否します。
var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (extension != ".csv" && extension != ".txt")
return BadRequest("Only CSV files are accepted.");Dim extension As String = Path.GetExtension(file.FileName).ToLowerInvariant()
If extension <> ".csv" AndAlso extension <> ".txt" Then
Return BadRequest("Only CSV files are accepted.")
End Ifこのチェックにより、不正な形式のバイナリデータがパーサーに到達するのを防ぎ、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();
}
}Imports IronXL
Public Class CsvImportService
Private ReadOnly _context As AppDbContext
Public Sub New(context As AppDbContext)
_context = context
End Sub
Public Async Function ImportProductsAsync(csvStream As Stream) As Task(Of Integer)
Dim workbook As WorkBook = WorkBook.LoadCSV(csvStream)
Dim ws As WorkSheet = workbook.DefaultWorkSheet
Dim products As New List(Of Product)()
For Each row In ws.Rows.Skip(1)
products.Add(New Product With {
.Id = row.Columns(0).IntValue,
.Name = row.Columns(1).StringValue,
.Price = row.Columns(2).DecimalValue,
.Quantity = row.Columns(3).IntValue
})
Next
Await _context.Products.AddRangeAsync(products)
Return Await _context.SaveChangesAsync()
End Function
End Classサービスを依存性注入に組み込む
コントローラがコンストラクタインジェクションを介してそれを要求できるように、Program.csに登録します。
builder.Services.AddScoped<CsvImportService>();netその後、コントローラのコンストラクタを更新し、サービスを受け入れてImportProductsAsyncを呼び出します。これにより、インラインでリストを構築する代わりに、コントローラアクションがシンプルになり、データアクセスロジックをテスト可能なサービスクラスに移行します。 Entity Framework CoreはCSVファイルに数千行が含まれている場合に、INSERTステートメントにバッチ処理します。
大規模なインポート(数万行)では、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.");Imports IronXL
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLS)
Dim ws As WorkSheet = 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.")エクスポートされたファイルは、デフォルトでカンマ区切り文字を使用します。 ヨーロッパのロケールによく見られるセミコロン区切りのファイルの場合は、明示的な区切り文字引数と共にSaveAsCsv("export.csv", ";")を呼び出します。 また、File(stream, "text/csv", "export.csv")を使用してAPIエンドポイントからファイルダウンロードとして結果を返すこともできます。
エクスポートオプションの完全なリファレンスについては、IronXL保存とエクスポートドキュメントをご覧ください。
IronXLが手動によるCSV解析よりも優れた選択肢である理由とは?
手動でのCSV解析は一見簡単そうに見えますが、引用符で囲まれたカンマ、セル内に埋め込まれた改行、エスケープされた引用符、UTF-8ファイルの先頭にあるバイトオーダーマークなど、特殊なケースに遭遇すると難しくなります。 カスタムStreamReaderループでこれらを正しく処理するには、かなりのテストと継続的なメンテナンスが必要です。
IronXLはこれらのケースすべてに社内で対応しています。 2つのアプローチを比較すると、明確な利点が明らかになる。
| 能力 | IronXL | マニュアルStreamReader |
|---|---|---|
| 区切り文字の自動検出 | はい | いいえ、手動で設定する必要があります |
| 見積もり現場処理 | 組み込み | カスタムロジックが必要です |
| 型変換(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のサポート対象ファイル形式ページを参照してください。
大容量ファイルに関するパフォーマンス上の考慮事項
100MB以下のCSVファイルであれば、 IronXLはチューニングなしでも十分に機能します。 より大きなファイルの場合は、以下の戦略を検討してください。
- メモリ割り当てを削減するためにファイルを
MemoryStreamにコピーするのではなく、パスから読み込みます。 - データベースに挿入する際に、最初の挿入前にすべてのレコードを収集するのではなく、行をバッチ処理する。
- LINQと
Productオブジェクトとして実体化しないようにします。
IronXL パフォーマンスガイドでは、大量のインポートシナリオにおける並列処理やストリーミングモードなどの追加の最適化について説明しています。
次のステップは何ですか?
これで、 ASP.NET Coreでの CSV インポートのすべての段階(ライブラリのインストール、ディスクまたはアップロードされたストリームからのファイルの読み込み、行を型付きモデルオブジェクトにマッピング、Entity Framework Core を使用してレコードをデータベースに永続化、必要に応じてデータを CSV にエクスポートする)に対応する動作パターンが揃いました。
この基礎の上にさらに知識を深めるために、以下のリソースをご活用ください。
- IronXL NuGetパッケージ-- パッケージの詳細とバージョン履歴はNuGetで確認できます
- IronXLチュートリアルの概要-- フィルタリング、数式評価、グラフ生成を網羅したガイド付きチュートリアル
- IronXL APIリファレンス-- クラスとメソッドの完全なドキュメント
- IronXL GitHubサンプル-- GitHubからダウンロード可能なサンプル プロジェクト
- IronXLのライセンスオプション- 開発、ステージング、本番環境向けのライセンスティア
- Microsoft CSV解析に関するドキュメント-- IronXLが基づいている.NET IOモデルの背景
- ASP.NET Coreファイルアップロードに関するドキュメント-- IFormFile およびマルチパートアップロード構成に関する公式ガイダンス
- IronXLによるExcelファイルの読み込みとインポートに関するチュートリアル-- XLSXファイルとCSVファイルの読み込みについて解説
- IronXL 作成と書き込みチュートリアル -- データの書き込みと複数形式での保存について取り扱います
- IronXLのデータソートとフィルタリング- インポート後のデータの操作
プロジェクトにIronXLを組み込めば、CSVの他にXLSXアップロードのサポートを追加するためにコード変更は不要です。同じWorkBook.Load呼び出しがどちらも処理します。 その一貫性により、アプリケーションの要件が拡大するにつれて、インポートエンドポイントの機能セットを段階的に拡張することができます。

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



