跳至页脚内容
使用 IRONXL

如何使用 C# 读取包含逗号数据的 CSV 文件

CSV 文件看似简单,但一旦数据中包含逗号,问题就来了——"Smith, John"会变成两个独立的字段,地址也会被逗号分割,精心组织的数据瞬间变得混乱不堪。虽然基本的处理方法在实际的 CSV 数据中往往失效,但 IronXL 提供了一个可靠的解决方案,可以自动处理这些复杂情况。

立即开始使用 IronXL。
green arrow pointer

为什么逗号会导致 CSV 文件解析失败?

CSV(逗号分隔值)文件使用逗号作为列值之间的分隔符,当数据本身包含逗号时,会产生固有的冲突。 RFC 4180 标准通过要求将包含逗号的字段用双引号括起来来解决这个问题。 如果处理不当,像"纽约大街 123 号 400 室"这样的简单地址会被分成三个单独的字段,而不是保持为一个字段。

传统的 CSV 解析方法之所以失效,是因为它们无法识别引号内的单元格或字符串值中逗号的上下文。 对字符串行应用基本的分割方法不会解析引号,这会导致表格数据损坏和数据结构无效。 这一问题影响着无数业务场景:客户地址、产品描述、财务数据以及 Excel 导入文件中,通常都包含带有逗号的数据。 即使是微软的官方文档也承认,解析包含特殊字符的 CSV 文件非常复杂。

当您处理真实世界的数据集时,这个问题就显得尤为明显。 试想一个包含"Hammer, 16oz, Steel-Head"这类产品名称的 CSV 文件,或包含"Johnson, Jr., Robert A."这类姓名的客户记录——此类模式会让简单的解析器立即失效。 财务数据是另一个常见的陷阱:使用千位分隔符格式化的货币金额(例如"1,234.56"),在简单的逗号分隔处理程序中会被视为两个独立的数值。

了解逗号为何会导致 CSV 解析失败,是选择能够正确处理 RFC 4180 引号标准的解决方案的第一步。 选用合适的库,即可省去手动变通方案、正则表达式或自定义状态机解析器的麻烦。

如何安装 CSV 库?

通过 NuGet 包管理器安装 IronXL 仅需几秒钟。 您可以使用包管理器控制台(Package Manager Console)或 .NET CLI:

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

安装完成后,该库可立即在您的 .NET 10 项目中使用。 IronXL 可独立运行,无需在主机上安装 Microsoft Office 或 Excel——对于无法获取 Office 许可证的服务器端和云部署而言,这是一项关键优势。

安装完成后,将 IronXL 命名空间添加到您的文件中,即可加载 CSV 数据。 该库支持 .NET Framework 4.6.2 及以上版本,以及所有 .NET Core、.NET 5、6、7、8 和 10 版本,因此既兼容传统应用程序架构,也兼容现代应用程序架构。

验证安装

添加包后,请在项目中运行快速导入测试以验证安装是否成功。 该 NuGet 包包含 Windows、Linux 和 macOS 所需的所有原生二进制文件,因此无需额外安装步骤。 对于基于 Docker 的部署,该软件包会在目标平台上自动解决原生依赖项。

该库如何读取包含嵌入式逗号的 CSV 文件?

IronXL 通过允许您在加载分隔符文件时指定文件编码和分隔符,来处理 CSV 数据中的特殊字符。IronXL库会根据 RFC 4180 标准自动检测并正确解析带引号的字符串值,从而无需编写自定义循环逻辑或手动解析代码。

读取 CSV 数据的核心方法是 WorkBook.LoadCSV(),它接受文件路径以及文件格式、分隔符和编码等可选参数。 以下是读取包含逗号的分隔符的 CSV 文件的最简单方法:

using IronXL;

// Load CSV with automatic comma handling
WorkBook workbook = WorkBook.LoadCSV("data.csv",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: ",");

// Access the parsed data
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Save as Excel if needed
workbook.SaveAs("output.xlsx");
using IronXL;

// Load CSV with automatic comma handling
WorkBook workbook = WorkBook.LoadCSV("data.csv",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: ",");

// Access the parsed data
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Save as Excel if needed
workbook.SaveAs("output.xlsx");
Imports IronXL

' Load CSV with automatic comma handling
Dim workbook As WorkBook = WorkBook.LoadCSV("data.csv", fileFormat:=ExcelFileFormat.XLSX, listDelimiter:=",")

' Access the parsed data
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet

' Save as Excel if needed
workbook.SaveAs("output.xlsx")
$vbLabelText   $csharpLabel

LoadCSV 方法能够智能地处理引号和 CSV 字符串,确保每一列的值都保持不变,无论其中是否包含逗号。 有关处理 CSV 文件的更多详细信息,请参阅官方 IronXL CSV 解析教程

理解输出内容

加载后,CSV 数据被映射到 WorkSheet 对象中,其中每一行和每一列都直接对应于原始 CSV 结构。 包含逗号的引号字段将显示为单个单元格值——与源文件中的显示完全一致。

下图左侧显示原始 CSV 文件,右侧显示生成的 Excel 文件:

使用 IronXL 读取带有逗号的 CSV 数据:图 1 - 原始 CSV 文件(左)与输出的 Excel 文件(右)

解析后访问单元数据

将 CSV 加载到 WorkBook 后,您可以通过 WorkSheet 对象使用行和列索引来访问单元格数据。 每个单元格都公开了类型化的访问器,例如 StringValueDecimalValueIntValue,因此对于常见的数据类型,您无需手动进行类型转换。

如何逐步解析以逗号分隔的 CSV 文件?

以下完整示例演示了当数据字段本身包含逗号时,IronXL 如何处理逗号分隔值。 此示例在内存中创建一个示例 CSV 文件,将其写入磁盘,使用 IronXL 进行解析,并显示每个字段的值:

using IronXL;
using System;
using System.IO;

// Create sample CSV content with embedded commas
string csvContent = @"Name,Address,Description,Price
""Johnson, Mark"",""123 Main St, Apt 4B"",""High-quality, durable product"",""1,234.56""
""Smith Ltd."",""789 Corporate Blvd, Suite 200"",""Professional, reliable service"",""2,999.00""
""Williams & Co."",""456 Park Ave, Floor 12"",""Lightweight, portable design"",""899.99""";

// Write sample data to a CSV file
File.WriteAllText("sample.csv", csvContent);

// Load CSV with IronXL -- commas inside quoted fields are handled automatically
WorkBook workbook = WorkBook.LoadCSV("sample.csv",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: ",");

WorkSheet ws = workbook.DefaultWorkSheet;

// Read and display each parsed row
foreach (var row in ws.Rows)
{
    if (row.RowNumber == 0) continue; // Skip header row

    string name        = row.Columns[0].StringValue;
    string address     = row.Columns[1].StringValue;
    string description = row.Columns[2].StringValue;
    decimal price      = row.Columns[3].DecimalValue;

    Console.WriteLine($"Customer:    {name}");
    Console.WriteLine($"Address:     {address}");
    Console.WriteLine($"Description: {description}");
    Console.WriteLine($"Price:       ${price:N2}");
    Console.WriteLine();
}

// Export to Excel format for distribution
workbook.SaveAs("parsed_data.xlsx");
Console.WriteLine("Data exported to parsed_data.xlsx");
using IronXL;
using System;
using System.IO;

// Create sample CSV content with embedded commas
string csvContent = @"Name,Address,Description,Price
""Johnson, Mark"",""123 Main St, Apt 4B"",""High-quality, durable product"",""1,234.56""
""Smith Ltd."",""789 Corporate Blvd, Suite 200"",""Professional, reliable service"",""2,999.00""
""Williams & Co."",""456 Park Ave, Floor 12"",""Lightweight, portable design"",""899.99""";

// Write sample data to a CSV file
File.WriteAllText("sample.csv", csvContent);

// Load CSV with IronXL -- commas inside quoted fields are handled automatically
WorkBook workbook = WorkBook.LoadCSV("sample.csv",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: ",");

WorkSheet ws = workbook.DefaultWorkSheet;

// Read and display each parsed row
foreach (var row in ws.Rows)
{
    if (row.RowNumber == 0) continue; // Skip header row

    string name        = row.Columns[0].StringValue;
    string address     = row.Columns[1].StringValue;
    string description = row.Columns[2].StringValue;
    decimal price      = row.Columns[3].DecimalValue;

    Console.WriteLine($"Customer:    {name}");
    Console.WriteLine($"Address:     {address}");
    Console.WriteLine($"Description: {description}");
    Console.WriteLine($"Price:       ${price:N2}");
    Console.WriteLine();
}

// Export to Excel format for distribution
workbook.SaveAs("parsed_data.xlsx");
Console.WriteLine("Data exported to parsed_data.xlsx");
Imports IronXL
Imports System
Imports System.IO

' Create sample CSV content with embedded commas
Dim csvContent As String = "Name,Address,Description,Price" & vbCrLf &
    """Johnson, Mark"",""123 Main St, Apt 4B"",""High-quality, durable product"",""1,234.56""" & vbCrLf &
    """Smith Ltd."",""789 Corporate Blvd, Suite 200"",""Professional, reliable service"",""2,999.00""" & vbCrLf &
    """Williams & Co."",""456 Park Ave, Floor 12"",""Lightweight, portable design"",""899.99"""

' Write sample data to a CSV file
File.WriteAllText("sample.csv", csvContent)

' Load CSV with IronXL -- commas inside quoted fields are handled automatically
Dim workbook As WorkBook = WorkBook.LoadCSV("sample.csv",
    fileFormat:=ExcelFileFormat.XLSX,
    listDelimiter:=",")

Dim ws As WorkSheet = workbook.DefaultWorkSheet

' Read and display each parsed row
For Each row In ws.Rows
    If row.RowNumber = 0 Then Continue For ' Skip header row

    Dim name As String = row.Columns(0).StringValue
    Dim address As String = row.Columns(1).StringValue
    Dim description As String = row.Columns(2).StringValue
    Dim price As Decimal = row.Columns(3).DecimalValue

    Console.WriteLine($"Customer:    {name}")
    Console.WriteLine($"Address:     {address}")
    Console.WriteLine($"Description: {description}")
    Console.WriteLine($"Price:       ${price:N2}")
    Console.WriteLine()
Next

' Export to Excel format for distribution
workbook.SaveAs("parsed_data.xlsx")
Console.WriteLine("Data exported to parsed_data.xlsx")
$vbLabelText   $csharpLabel

此示例展示了以下关键功能:

-自动处理引用:即使 CSV 数据中包含逗号,像 "Johnson, Mark" 这样的字段也能保持其完整性。

  • 嵌套逗号:IronXL 能正确解析同一行内多个包含逗号的字段,且不会出现列间数据泄漏。 -类型转换:类型化访问器(例如 StringValueDecimalValue)简化了对单个值的访问,无需手动解析。
  • Excel 导出:您可以在同一工作流中直接将 CSV 转换为 Excel 格式,以增强功能和共享能力。

下图左侧展示了示例 CSV 文件,右侧则是经过解析的 Excel 输出结果:

使用 IronXL 读取带有逗号的 CSV 数据:图 2 - 示例 CSV 文件(左)与解析后的 Excel 输出(右)对比

有哪些高级 CSV 功能可用?

除了基本的逗号处理外,IronXL 还提供全套的 CSV 处理功能。 当您需要不同的分隔符、字符编码或生产级别的错误处理时,该库提供了灵活的选项:

using IronXL;
using System;
using System.Text;

// Custom delimiter support -- semicolon-delimited files common in European locales
WorkBook semicolonData = WorkBook.LoadCSV("data.txt",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: ";");

// Handle UTF-8 encoding for international CSV files
WorkBook internationalData = WorkBook.LoadCSV("international.csv",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: ",",
    encoding: Encoding.UTF8);

// Tab-delimited files (TSV format)
WorkBook tsvData = WorkBook.LoadCSV("export.tsv",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: "\t");

// Production-ready error handling for CSV with commas in data
try
{
    WorkBook data = WorkBook.LoadCSV("file.csv",
        fileFormat: ExcelFileFormat.XLSX,
        listDelimiter: ",");

    WorkSheet sheet = data.DefaultWorkSheet;

    Console.WriteLine($"Loaded {sheet.Rows.Count()} rows successfully.");
}
catch (Exception ex)
{
    Console.WriteLine($"CSV parsing error: {ex.Message}");
    // Log and implement appropriate recovery logic
}
using IronXL;
using System;
using System.Text;

// Custom delimiter support -- semicolon-delimited files common in European locales
WorkBook semicolonData = WorkBook.LoadCSV("data.txt",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: ";");

// Handle UTF-8 encoding for international CSV files
WorkBook internationalData = WorkBook.LoadCSV("international.csv",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: ",",
    encoding: Encoding.UTF8);

// Tab-delimited files (TSV format)
WorkBook tsvData = WorkBook.LoadCSV("export.tsv",
    fileFormat: ExcelFileFormat.XLSX,
    listDelimiter: "\t");

// Production-ready error handling for CSV with commas in data
try
{
    WorkBook data = WorkBook.LoadCSV("file.csv",
        fileFormat: ExcelFileFormat.XLSX,
        listDelimiter: ",");

    WorkSheet sheet = data.DefaultWorkSheet;

    Console.WriteLine($"Loaded {sheet.Rows.Count()} rows successfully.");
}
catch (Exception ex)
{
    Console.WriteLine($"CSV parsing error: {ex.Message}");
    // Log and implement appropriate recovery logic
}
Imports IronXL
Imports System
Imports System.Text

' Custom delimiter support -- semicolon-delimited files common in European locales
Dim semicolonData As WorkBook = WorkBook.LoadCSV("data.txt",
    fileFormat:=ExcelFileFormat.XLSX,
    listDelimiter:=";")

' Handle UTF-8 encoding for international CSV files
Dim internationalData As WorkBook = WorkBook.LoadCSV("international.csv",
    fileFormat:=ExcelFileFormat.XLSX,
    listDelimiter:=",",
    encoding:=Encoding.UTF8)

' Tab-delimited files (TSV format)
Dim tsvData As WorkBook = WorkBook.LoadCSV("export.tsv",
    fileFormat:=ExcelFileFormat.XLSX,
    listDelimiter:=vbTab)

' Production-ready error handling for CSV with commas in data
Try
    Dim data As WorkBook = WorkBook.LoadCSV("file.csv",
        fileFormat:=ExcelFileFormat.XLSX,
        listDelimiter:=",")

    Dim sheet As WorkSheet = data.DefaultWorkSheet

    Console.WriteLine($"Loaded {sheet.Rows.Count()} rows successfully.")
Catch ex As Exception
    Console.WriteLine($"CSV parsing error: {ex.Message}")
    ' Log and implement appropriate recovery logic
End Try
$vbLabelText   $csharpLabel

IronXL 支持多种分隔符——竖线、制表符、分号以及任意单个字符——能够处理多种字符编码,并能高效处理任意大小的文件。 若需处理复杂的数据场景,请探索数据操作功能以及Enterprise级功能,例如受密码保护的文件处理和公式计算。

处理不同的分隔符格式

许多系统在导出数据时使用逗号以外的分隔符。 欧洲地区的应用程序通常使用分号,因为该地区的小数分隔符本身就是逗号。 以竖线分隔的文件在传统系统和数据仓库导出中很常见。 IronXL 通过 listDelimiter 参数处理所有这些,因此您只需更改一个字符即可在格式之间切换,而无需重写解析逻辑。

编码与国际字符的处理

字符编码问题会导致难以察觉的细微数据损坏。 当 CSV 文件包含非 ASCII 字符(如带重音的字母、中日韩字符或货币符号)时,指定正确的编码可避免输出乱码。 IronXL 接受任何 System.Text.Encoding 实例,包括 UTF-8、UTF-16、Latin-1 和平台特定的编码。

为何专用库的表现优于手动解析 CSV?

IronXL 可独立运行,无需依赖 Microsoft Office,因此非常适合服务器部署和云应用程序。 与需要 Office Interop 的解决方案不同,IronXL 可在 Windows、Linux 和 macOS 上运行,支持 .NET Framework 4.6.2 及以上版本以及 .NET Core 5/6/7/8/10 及以上版本。

该库通过智能处理一些会导致简单解析器崩溃的极端情况,消除了常见的 CSV 解析陷阱。 下表对比了常见的方法:

C# 中的 CSV 解析方法——对比
方法 处理引号内的逗号 编码支持 Excel 导出 已准备就绪
String.Split(',')
TextFieldParser(VB) 数量有限 部分的
CsvHelper (开源软件)
IronXL

无论您处理的是带有货币格式的财务报表、包含国际字符的客户数据,还是含有特殊字符的系统日志,IronXL 都能在整个解析过程中保持数据的完整性。 根据 Stack Overflow 上的讨论,处理 CSV 字段中的逗号是解析过程中最常遇到的难题之一——而 IronXL 直接解决了这一问题。

性能特征

IronXL 可在不将整个文件一次性加载到内存的情况下流式处理大型 CSV 文件,因此非常适合处理数百万行数据的大型文件。 该库采用内存高效的设计,这意味着您可以在标准服务器实例上运行 CSV 解析任务,而无需为处理大量数据额外配置内存。

对于公式计算单元格样式,IronXL 在将 CSV 数据转换为 .xlsx 格式时,保持与 Excel 的完全兼容性。 当下游用户期望获得格式化的 Excel 输出而非原始表格数据时,这一点尤为重要。

部署灵活性

由于 IronXL 不依赖 Microsoft Office,您可以将其部署到任何运行 .NET 的环境中——包括 Linux 容器、Azure Functions、AWS Lambda 以及本地 Windows Server。 在生产环境中,IronXL 凭借 Professional License 和持续的更新支持,为企业应用程序提供了所需的可靠性和支持体系。

何时应选择功能齐全的电子表格库?

选择合适的 CSV 库取决于您的具体需求。 当您需要以下功能的任意组合时,IronXL 是最佳选择:

  • 读取需要转换为 Excel 格式以供报告或分发的 CSV 文件
  • 处理包含非 ASCII 字符或多字节编码的国际 CSV 文件
  • 构建可在 Windows、Linux 和 macOS 上运行的应用程序,且无需平台特定代码
  • 避免在服务器或云环境中依赖 Microsoft Office Interop
  • 访问电子表格的其他功能,例如单元格格式设置命名区域公式

对于仅需解析 CSV 文件而无需其他功能的轻量级场景,专为 CSV 设计的专用库可能已足够。 然而,当 CSV 解析是包含 Excel 输出在内的更广泛数据处理流程中的一步时,IronXL 消除了对多个依赖项的需求。

该库的 API 参考文档详细记录了所有可用方法和参数,使开发者能够轻松发现超越基础 CSV 加载的功能。 教程部分提供了常见工作流的分步指南,包括 CSV 解析、单元格操作以及文件格式转换。

如何开始免费试用?

在 C# 中读取包含逗号的 CSV 文件并不复杂。 IronXL 将这一挑战转化为简洁、可靠的代码。 通过自动处理双引号、逗号和带引号的单元格,它让您能够专注于应用程序逻辑,而非 CSV 解析的边界情况。

入门步骤非常简单:

  1. 使用 dotnet add package IronXL 安装 NuGet 包
  2. 使用您的文件路径和分隔符调用 WorkBook.LoadCSV()
  3. 使用类型化访问器遍历行和列
  4. (可选)导出到 .xlsxworkbook.SaveAs()

在决定购买许可证之前,请先通过免费试用在您的环境中测试 IronXL。 试用版将为您提供为期 30 天的全部功能访问权限。 当您准备进行生产环境部署时,请购买与您的部署规模相匹配的许可证——我们提供面向个人开发者、小型团队及企业级使用的多种选项。

常见问题解答

在 C# 中读取 CSV 文件时,如何处理数据中的逗号?

IronXL 提供了一个强大的解决方案,用于读取包含逗号的 CSV 文件。它可以自动处理带引号的字段和特殊字符,确保您的数据不会因逗号而被分割。

为什么 String.Split(',') 在处理包含逗号的 CSV 文件时会失败?

`String.Split(',')` 方法会将每个逗号都视为分隔符,这在数据字段本身包含逗号时会造成问题。IronXL 通过智能解析 CSV 文件、识别带引号的字段并维护数据完整性来解决这个问题。

在 C# 中使用 IronXL 进行 CSV 解析有什么优势?

IronXL 通过自动处理嵌入逗号和带引号的字段等复杂情况,简化了解析 CSV 文件的过程,从而节省了开发人员的时间并减少了数据处理中可能出现的错误。

IronXL 能否处理 CSV 文件中的其他特殊字符?

是的,IronXL 旨在管理特殊字符和带引号的字段,确保即使是最复杂的 CSV 文件也能准确解析。

IronXL 是否适用于大型 CSV 文件?

IronXL 能够高效处理大型 CSV 文件,凭借其优化的解析功能,可以快速准确地处理这些文件。

Curtis Chau
技术作家

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

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

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我