跳至页脚内容
使用 IRONXL

如何使用 IronXL 在 C# 中读取 CSV 文件

在C# .NET中读取CSV文件变得非常简单,使用IronXL——仅需一次方法调用,即可将逗号分隔的数据加载为结构化的工作簿,无需任何自定义解析代码。 本指南涵盖您所需的每一种技术:基本加载,自定义分隔符,DataTable转换,单元格级别访问,错误处理,以及导出为Excel格式。

在 .NET 中读取 CSV 文件最简单的方法是什么?

最简单的方法是使用WorkBook.LoadCSV,直接将CSV数据导入到工作簿结构中。 这一单一方法自动处理解析、分隔符检测和数据整理——无需创建StreamReader或手动处理每一行字符串。

通过 Visual Studio 中的 NuGet 包管理器控制台安装 IronXL。 打开您的 .NET 项目并运行:

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

Read CSV .NET: 使用IronXL的最简单C#方法:图像1 - 安装

using IronXL;

// Load CSV file into a workbook with one method call
WorkBook workbook = WorkBook.LoadCSV("sales_data.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: ",");
// Access the default worksheet containing CSV data
WorkSheet sheet = workbook.DefaultWorkSheet;
// Display all rows and CSV columns
foreach (var row in sheet.Rows)
{
    foreach (var cell in row)
    {
        Console.Write(cell.Value + "\t");
    }
    Console.WriteLine();
}
using IronXL;

// Load CSV file into a workbook with one method call
WorkBook workbook = WorkBook.LoadCSV("sales_data.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: ",");
// Access the default worksheet containing CSV data
WorkSheet sheet = workbook.DefaultWorkSheet;
// Display all rows and CSV columns
foreach (var row in sheet.Rows)
{
    foreach (var cell in row)
    {
        Console.Write(cell.Value + "\t");
    }
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

输入

Read CSV .NET: 使用IronXL的最简单C#方法:图像2 - 样例CSV输入

输出

Read CSV .NET: 使用IronXL的最简单C#方法:图像3 - 控制台输出

LoadCSV方法接受三个参数:文件路径,内部表示用的目标Excel格式,以及分隔数值的字符。 加载后,CSV内容可通过DefaultWorkSheet属性访问,该属性提供包含所有导入记录的主工作表。

嵌套循环结构遍历工作表中的每个CellValue属性将单元格内容作为对象返回,而制表符在控制台输出中创造可读的列分隔。 无论源文件包含10行还是数千条记录的大型CSV文件,此模式都可以同样工作。

IronXL在.NET Framework、.NET Core和.NET 5+上工作,不需要安装Microsoft Office——使其非常适合ASP.NET Core和.NET Core Web API项目。 该库可在NuGet上获得,并可干净地集成到任何项目类型中。 如果您希望了解一个库为您处理了哪些内容,下一节阐述了手动解析所涉及的内容。

手动 CSV 解析与使用库相比有何不同?

了解IronXL消除了哪些复杂性有助于明确它的价值。 手动 CSV 解析需要处理多种边缘情况,这些情况看似简单,但在任何项目中都会很快成为问题。

using System.IO;

// Manual approach -- requires extensive code for basic functionality
string path = "data.csv";
string[] lines = File.ReadAllLines(path);
foreach (string line in lines)
{
    // This breaks when CSV fields contain commas inside quotes
    string[] fields = line.Split(',');
    foreach (string field in fields)
    {
        Console.Write(field.Trim() + "\t");
    }
    Console.WriteLine();
}
using System.IO;

// Manual approach -- requires extensive code for basic functionality
string path = "data.csv";
string[] lines = File.ReadAllLines(path);
foreach (string line in lines)
{
    // This breaks when CSV fields contain commas inside quotes
    string[] fields = line.Split(',');
    foreach (string field in fields)
    {
        Console.Write(field.Trim() + "\t");
    }
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

输入

Read CSV .NET: 使用IronXL的最简单C#方法:图像4 - CSV输入

输出

Read CSV .NET: 使用IronXL的最简单C#方法:图像5 - 手动CSV解析输出

当CSV字段中包含带引号的字符串中的嵌入逗号时,手动方法会失败——这在地址字段或描述中是常见情况。 正确读取文件需要处理带引号的字段、转义的引号、多行值以及不同的编码。 自己滚动解析器意味着创建一个StreamReader,实现状态机逻辑,并自己管理整个读取过程。 这对于应该只有一行代码的事情来说是相当多的样板代码。

IronXL的替代方案自动处理所有边缘案例:

using IronXL;

// IronXL approach -- handles all edge cases automatically
WorkBook workbook = WorkBook.LoadCSV("data.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: ",");
var records = workbook.DefaultWorkSheet.Rows;
foreach (var row in records)
{
    foreach (var cell in row)
    {
        Console.Write(cell.Value + "\t");
    }
    Console.WriteLine();
}
using IronXL;

// IronXL approach -- handles all edge cases automatically
WorkBook workbook = WorkBook.LoadCSV("data.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: ",");
var records = workbook.DefaultWorkSheet.Rows;
foreach (var row in records)
{
    foreach (var cell in row)
    {
        Console.Write(cell.Value + "\t");
    }
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

WorkBook类在内部管理解析复杂性,让您专注于数据处理而非提取数据。 您可以在IronXL功能概览中阅读更多关于IronXL完整功能的信息。

如何处理不同的CSV分隔符?

CSV文件并不总是使用逗号作为分隔符。 由于小数位中使用逗号,欧洲系统导出经常使用分号。 制表符分隔值(TSV)和管道分隔文件经常出现在各种应用程序和遗留系统的数据导出中。

using IronXL;

// Reading a semicolon-delimited file (common in European exports)
WorkBook euroData = WorkBook.LoadCSV("german_report.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: ";");
// Reading a tab-separated file
WorkBook tsvData = WorkBook.LoadCSV("exported_data.tsv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: "\t");
// Reading a pipe-delimited file
WorkBook pipeData = WorkBook.LoadCSV("legacy_system.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: "|");
// Access data identically regardless of original delimiter
WorkSheet sheet = euroData.DefaultWorkSheet;
int rowsCount = sheet.RowCount;
Console.WriteLine($"Loaded {rowsCount} rows with {sheet.ColumnCount} CSV columns");
using IronXL;

// Reading a semicolon-delimited file (common in European exports)
WorkBook euroData = WorkBook.LoadCSV("german_report.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: ";");
// Reading a tab-separated file
WorkBook tsvData = WorkBook.LoadCSV("exported_data.tsv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: "\t");
// Reading a pipe-delimited file
WorkBook pipeData = WorkBook.LoadCSV("legacy_system.csv", fileFormat: ExcelFileFormat.XLSX, listDelimiter: "|");
// Access data identically regardless of original delimiter
WorkSheet sheet = euroData.DefaultWorkSheet;
int rowsCount = sheet.RowCount;
Console.WriteLine($"Loaded {rowsCount} rows with {sheet.ColumnCount} CSV columns");
$vbLabelText   $csharpLabel

LoadCSV中可以接受任何单个字符或转义序列作为字段分隔符。 制表符使用\t转义序列。 加载后,无论原始格式如何,数据结构都将保持一致,从而可以轻松处理来自多个来源、分隔符各不相同的 CSV 文件。 大多数CSV文件的默认值是逗号,但这种灵活性可以处理项目遇到的任何变体。

输入

Read CSV .NET: 使用IronXL的最简单C#方法:图像6 - 分号分隔的CSV文件输入

输出

Read CSV .NET: 使用IronXL的最简单C#方法:图像7 - 分号分隔输出

ColumnCount属性提供快速验证文件加载是否正确——在处理不熟悉的数据来源或在ASP.NET Core应用程序中验证用户上传时尤其有用。

编码注意事项

在读取包含非ASCII字符的文件时,例如法语或德语数据中的重音字母,IronXL自动从文件的字节顺序标记(BOM)读取编码。 对于没有BOM的文件,您可能需要在源头上验证编码。 微软关于文件编码的文档为.NET中的编码类型提供了全面的参考。

将 CSV 转换为 DataTable 的最佳方法是什么?

将CSV数据转换为DataTable可以与数据库操作、UI应用中的数据绑定和LINQ查询集成。 ToDataTable方法通过一次调用执行此转换。

using IronXL;
using System.Data;

// Load CSV and convert to DataTable
WorkBook workbook = WorkBook.LoadCSV("customers.csv", ExcelFileFormat.XLSX, ",");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert worksheet to DataTable -- true parameter uses CSV header as column names
DataTable dataTable = sheet.ToDataTable(true);
// DataTable is now ready for database operations, binding, or LINQ queries
Console.WriteLine($"DataTable created with {dataTable.Columns.Count} columns:");
foreach (DataColumn column in dataTable.Columns)
{
    // Property names from CSV header become column names
    Console.WriteLine($"  - {column.ColumnName}");
}
Console.WriteLine($"\nTotal records: {dataTable.Rows.Count}");
// Access data using standard DataTable syntax
foreach (DataRow row in dataTable.Rows)
{
    // Access by column index or name attribute
    string name = row["Name"].ToString();
    string email = row["Email"].ToString();
    Console.WriteLine($"Customer: {name}, Email: {email}");
}
using IronXL;
using System.Data;

// Load CSV and convert to DataTable
WorkBook workbook = WorkBook.LoadCSV("customers.csv", ExcelFileFormat.XLSX, ",");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert worksheet to DataTable -- true parameter uses CSV header as column names
DataTable dataTable = sheet.ToDataTable(true);
// DataTable is now ready for database operations, binding, or LINQ queries
Console.WriteLine($"DataTable created with {dataTable.Columns.Count} columns:");
foreach (DataColumn column in dataTable.Columns)
{
    // Property names from CSV header become column names
    Console.WriteLine($"  - {column.ColumnName}");
}
Console.WriteLine($"\nTotal records: {dataTable.Rows.Count}");
// Access data using standard DataTable syntax
foreach (DataRow row in dataTable.Rows)
{
    // Access by column index or name attribute
    string name = row["Name"].ToString();
    string email = row["Email"].ToString();
    Console.WriteLine($"Customer: {name}, Email: {email}");
}
$vbLabelText   $csharpLabel

false)。 当设置为row["Name"]这样的列名称进行直观的数据访问。

使用DataTable进行数据库和UI集成

对于需要使用SqlBulkCopy进行数据库批量插入、在Windows Forms应用中填充DataGridView控件或使用LINQ表达式进行复杂数据转换的场景,此转换非常有价值。 DataTable格式在您的.NET Core Web API项目中与Entity Framework和其他ORM工具自然集成。 您可以在IronXL DataTable指南中阅读更多有关DataTable导出模式的信息。

对于在.NET中处理表格数据的其他模式,微软的ADO.NET概述是权威参考。

如何将CSV文件转换为Excel格式?

IronXl.Excel 的突出功能之一是将 CSV 数据转换为适当的 Excel 格式。 这使得在原本平面的CSV数据中添加公式、格式、图表和多张工作表成为可能——这是仅凭CSV输出无法实现的。

using IronXL;

// Load CSV data from file path
string path = "quarterly_sales.csv";
WorkBook workbook = WorkBook.LoadCSV(path, ExcelFileFormat.XLSX, ",");
// Save as Excel XLSX format -- creates a new Excel file
workbook.SaveAs("quarterly_sales.xlsx");
// Alternative: Save as legacy XLS format for older Excel versions
workbook.SaveAs("quarterly_sales.xls");
Console.WriteLine("CSV successfully converted to Excel format");
using IronXL;

// Load CSV data from file path
string path = "quarterly_sales.csv";
WorkBook workbook = WorkBook.LoadCSV(path, ExcelFileFormat.XLSX, ",");
// Save as Excel XLSX format -- creates a new Excel file
workbook.SaveAs("quarterly_sales.xlsx");
// Alternative: Save as legacy XLS format for older Excel versions
workbook.SaveAs("quarterly_sales.xls");
Console.WriteLine("CSV successfully converted to Excel format");
$vbLabelText   $csharpLabel

SaveAs方法根据文件扩展名自动确定输出格式。 XLSX创建与Excel 2007及更高版本兼容的现代Office Open XML文件,而XLS则生成用于较旧应用程序的传统二进制交换文件格式文档。

输入

Read CSV .NET: 使用IronXL的最简单C#方法:图像8 - CSV数据

输出

Read CSV .NET: 使用IronXL的最简单C#方法:图像9 - Excel输出

Read CSV .NET: 使用IronXL的最简单C#方法:图像10 - CSV至Excel输出

此工作流程在需要在分发给用户之前对数据库或API的CSV导出进行增强时特别有用。 转换后,Excel文件可以接收其他格式化、公式或与其他工作表合并——所有这些都是通过IronXL的编辑功能编程实现的。 这一过程是完全可脚本化的,使其适合用于自动报告管道或定时任务。

如何在CSV数据中访问特定单元格值?

除了遍历所有记录外,IronXl.Excel 还可使用熟悉的 Excel 风格寻址直接访问单元格。 这样才能在不同的数据类型中进行有针对性的数据提取和类型安全的值检索。

using IronXL;

WorkBook workbook = WorkBook.LoadCSV("inventory.csv", ExcelFileFormat.XLSX, ",");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Access specific cells using Excel-style addresses by index
string productName = sheet["A2"].StringValue;
int quantity = sheet["B2"].IntValue;
decimal price = sheet["C2"].DecimalValue;
Console.WriteLine($"Product: {productName}");
Console.WriteLine($"Quantity: {quantity}");
Console.WriteLine($"Price: ${price:F2}");
// Access a range of cells -- return records from column A
var productRange = sheet["A2:A10"];
Console.WriteLine("\nAll products:");
foreach (var cell in productRange)
{
    Console.WriteLine($"  - {cell.StringValue}");
}
using IronXL;

WorkBook workbook = WorkBook.LoadCSV("inventory.csv", ExcelFileFormat.XLSX, ",");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Access specific cells using Excel-style addresses by index
string productName = sheet["A2"].StringValue;
int quantity = sheet["B2"].IntValue;
decimal price = sheet["C2"].DecimalValue;
Console.WriteLine($"Product: {productName}");
Console.WriteLine($"Quantity: {quantity}");
Console.WriteLine($"Price: ${price:F2}");
// Access a range of cells -- return records from column A
var productRange = sheet["A2:A10"];
Console.WriteLine("\nAll products:");
foreach (var cell in productRange)
{
    Console.WriteLine($"  - {cell.StringValue}");
}
$vbLabelText   $csharpLabel

单元格寻址遵循 Excel 惯例,其中字母代表 CSV 列(A、B、C),数字代表行索引位置(1、2、3)。 Cell类提供DateTimeValue等类型特定的访问器。 这些访问器自动处理解析和转换,消除了与将所有内容存储为字符串值相比的手动类型转换。

使用A2:A10这样的符号选择范围返回一个支持迭代、聚合函数和批量操作的Range对象。 在从大型 CSV 文件中提取特定列或矩形数据区域时,这一点很有价值。 例如,您可以从特定列构建一个值列表,或将过滤后的数据写入另一个文件。有关更多模式,请参阅

如何处理读取CSV文件时的错误?

生产应用程序需要围绕文件操作编写防御性代码。 CSV读取失败可能有多种原因:文件不存在、访问被拒绝、数据格式错误或内存不足以支持非常大的文件。 将IronXL调用包装在try/catch块中并在加载前验证路径可在各种环境中提供可靠的行为。

using IronXL;
using System.IO;

string filePath = "customers.csv";
if (!File.Exists(filePath))
{
    Console.WriteLine($"File not found: {filePath}");
    return;
}
try
{
    WorkBook workbook = WorkBook.LoadCSV(filePath, ExcelFileFormat.XLSX, ",");
    WorkSheet sheet = workbook.DefaultWorkSheet;
    DataTable dataTable = sheet.ToDataTable(true);
    Console.WriteLine($"Loaded {dataTable.Rows.Count} records successfully.");
}
catch (IronXl.Exceptions.IronXLException ex)
{
    Console.WriteLine($"IronXL parsing error: {ex.Message}");
}
catch (IOException ex)
{
    Console.WriteLine($"File access error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"Unexpected error: {ex.Message}");
}
using IronXL;
using System.IO;

string filePath = "customers.csv";
if (!File.Exists(filePath))
{
    Console.WriteLine($"File not found: {filePath}");
    return;
}
try
{
    WorkBook workbook = WorkBook.LoadCSV(filePath, ExcelFileFormat.XLSX, ",");
    WorkSheet sheet = workbook.DefaultWorkSheet;
    DataTable dataTable = sheet.ToDataTable(true);
    Console.WriteLine($"Loaded {dataTable.Rows.Count} records successfully.");
}
catch (IronXl.Exceptions.IronXLException ex)
{
    Console.WriteLine($"IronXL parsing error: {ex.Message}");
}
catch (IOException ex)
{
    Console.WriteLine($"File access error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"Unexpected error: {ex.Message}");
}
$vbLabelText   $csharpLabel

CSV数据的验证模式

除了捕获异常之外,加载后验证行和列的数量有助于检测到被截断的文件或意外的架构更改。 检查sheet.RowCount是否符合预期的最小值,或验证第一行中是否存在特定的列标题,可以在问题向下传播之前及早捕获数据问题。 微软的异常处理指南介绍了.NET中结构化错误处理的最佳实践。

对于处理用户上传CSV文件的应用程序,始终在加载前验证文件大小,清理文件名,并在上传端点限制允许的内容类型。 这些预防措施可防止因超大文件导致资源枯竭,并保护免受路径遍历攻击。

IronXL包含其自己的异常类型IronXl.Exceptions.IronXLException用于与库相关的错误,这使得它可以轻松地区分解析失败与一般输入/输出问题。 您可以在IronXL API参考中找到更多详细信息。

如何在没有内存问题的情况下读取大型CSV文件?

对于包含数十万行的文件,同时将整个数据集加载到内存中可能是不现实的。 IronXL将整个文件读取到WorkBook对象中,这将所有数据保存在内存中。 对于大规模的ETL(提取、转换、加载)场景,一种实用策略是在加载之前通过拆分源文件来批处理CSV,或通过StreamReader流传输行并将块写入单独的工作簿。

IronXL关于读取Excel文件的文档涵盖了大工作负载的性能注意事项。 对于CSV格式而言,CSV格式的逐行结构意味着简单的File.ReadAllLines与手动分批处理提供了对当数据集过大而无法一次性加载到内存时的可预测内存占用。

将IronXL与其他CSV库比较

IronXL不是.NET中唯一的CSV库。 CsvHelper是一个广泛使用的开源替代品,专注于流式传输、记录映射和基于属性的配置。 关键区别在于范围:CsvHelper专注于CSV,而IronXL处理整个电子表格生态系统——通过一个统一的API读取、写入和转换XLSX、XLS、CSV及其他格式。 如果您的应用程序已经使用IronXL进行Excel操作,那么使用同一个库处理CSV可以避免额外的依赖项。 如果CSV是您处理的唯一格式,并且您需要流支持,那么流CSV库可能更适合您。

IronXL vs. CsvHelper:在.NET中的CSV读取的关键差异
特征 IronXL CsvHelper
CSV 阅读
Excel(XLSX/XLS)支持
流式传输大文件 仅限于内存 是(流传输)
自定义分隔符 是(listDelimiter) 是(配置)
DataTable 转换 内置(ToDataTable) 手动映射
许可 商业的 开源(MS-PL)

接下来您的步骤是什么?

如果使用正确的方法,在 .NET 中读取 CSV 文件只需极少的工作量。 IronXL的LoadCSV方法自动处理解析复杂性,支持各种分隔符,提供对结构化数据的即时访问,并通过单一方法调用转换为Excel或DataTable。 无论您是在构建ASP.NET Core应用程序、.NET Core Web API还是控制台项目,该库从头到尾简化了CSV处理。

探索更多IronXL的功能来扩展您在这里所学的内容:

开始免费试用以体验IronXL如何简化在您的.NET项目中读取CSV文件。 对于生产部署,许可选项包括永久使用权限和一年支持。

常见问题解答

用 C# 阅读 CSV 文件的最简单方法是什么?

在 C# 中读取 CSV 文件最简单的方法是使用 IronXL,它提供了一种直接高效的方法来处理 CSV 数据。

IronXL是否能高效处理大型CSV文件?

是的, IronXL 的设计初衷就是为了处理大型 CSV 文件,因此它能够处理庞大的数据集而不会出现性能问题。

IronXL 兼容 .NET 应用程序吗?

IronXL for .NET 与 .NET 应用程序完全兼容,开发人员可以轻松地将 CSV 阅读功能集成到他们的 C# 项目中。

IronXL 是否支持读取具有不同分隔符的 CSV 文件?

IronXL 支持读取带有各种分隔符的 CSV 文件,可灵活处理不同格式的文件。

IronXL 能否解析带标题的 CSV 文件?

是的,IronXL 可以解析带标题的 CSV 文件,让您可以轻松地按列名访问数据。

IronXL 如何简化 CSV 数据操作?

IronXL 通过提供直接在 C# 中读取、编辑和写入 CSV 数据的直观方法,简化了 CSV 数据操作。

IronXL 是否支持异步读取 CSV 文件?

IronXL 支持异步操作,使您能够在不阻塞主应用程序线程的情况下读取 CSV 文件。

IronXL 能否将 CSV 数据转换为 Excel 格式?

IronXL可以将 CSV 数据转换为 Excel 格式,让您能够利用 Excel 的功能进行数据分析和演示。

IronXL 在读取 CSV 文件时有任何依赖关系吗?

IronXL 是一个独立的库,读取 CSV 文件不需要任何外部依赖性,从而简化了项目中的设置过程。

IronXL 能否用于将数据从 CSV 导出到其他格式?

是的,IronXL 可以将数据从 CSV 导出到包括 Excel 在内的各种格式,为数据处理和报告提供了多功能性。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

Iron Support Team

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