跳過到頁腳內容
使用 IRONXL

如何使用 C# 讀取資料中含有逗號的 CSV 檔案

CSV文件看似簡單,直到您的數據包含逗號 —— 突然之間,"Smith, John"變成兩個獨立欄位,地址在每個逗號處拆分,精心結構化的數據變成混亂。 雖然基本的String.Split(',')方法在現實世界的CSV數據中失效,IronXL提供了一個可靠的解決方案,能自動處理這些複雜的情況。

現在開始使用 IronXL。
green arrow pointer

為什麼逗號會破壞CSV解析?

CSV(逗號分隔值)文件使用逗號作為欄位值之間的分隔符,當數據本身包含逗號時,這就造成了固有的衝突。 RFC 4180標準解決此問題,要求包含逗號的欄位必須用雙引號括起來。 如果處理不當,"123 Main St, Suite 400, New York"這樣的簡單地址會拆分成三個獨立欄位,而不是保持為一個。

傳統的CSV解析方法失敗,因為它們無法識別在引號內或字符串值內的逗號上下文。 應用於字符串行的基本拆分方法無法解釋引號,導致表格數據損壞和無效的數據結構。 這個問題影響了無數的業務場景:客戶地址、產品描述、財務數據和Excel導入文件都包含通常含有逗號的數據。 甚至Microsoft的文件也承認CSV解析中特殊字符的複雜性。

當您處理現實世界的數據集時,這個問題尤其明顯。 考慮一個包含產品名稱如"Hammer, 16oz, Steel-Head"或客戶記錄如"Johnson, Jr., Robert A."的CSV文件——這些模式會立即破壞簡單的解析器。 財務數據是另一個常見的陷阱:貨幣金額以千位分隔符格式化,如"1,234.56",對於一個簡單的逗號分割程式來說看起來就像是兩個獨立的值。

理解為什麼逗號會破壞CSV解析是選擇一個正確處理RFC 4180 引號標準的解決方案的第一步。 正確的程式庫能消除手動解決方法、正則表達式或自定義狀態機解析器的需要。

如何安裝CSV程式庫?

通過NuGet Package Manager安裝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數據中的特殊字符允許您在加載分隔文件時指定文件編碼和分隔符。該程式庫自動檢測並正確解析符合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");
$vbLabelText   $csharpLabel

LoadCSV方法智慧地處理引號和CSV字符串,確保即使嵌入逗號,每個欄位值都保持完整。 有關如何使用CSV文件的詳情,請參考IronXL CSV解析的官方教程

理解輸出

加載後,CSV數據將被映射到一個WorkSheet物件,每一行和欄與原始CSV結構直接對應。 包含逗號的引號欄位顯示為單個單元格值——與源文件中一模一樣。

下圖顯示了左側的原始CSV文件和右側的輸出Excel文件:

C#處理數據中帶逗號的CSV文件與IronXL:圖片1 - 原始CSV文件(左)與輸出Excel文件(右)

解析後存取單元格數據

一旦CSV被加載到WorkSheet物件,通過行和列索引來訪問單元格數據。 每個單元格都提供類型化的存取器, 如IntValue,因此您不需要對常見數據類型進行手動類型轉換。

如何逐步解析包含逗號的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");
$vbLabelText   $csharpLabel

此示例展示了幾個關鍵功能:

  • 自動引號處理:"Johnson, Mark"這樣的字段即使包含在CSV數據內的逗號中也能保持完整性。
  • 嵌套逗號:IronXL在解析同一行中包含多個逗號的字段時不會發生數據洩漏。
  • 類型轉換:類型化存取器如DecimalValue簡化了對單個值的訪問,無需手動解析。
  • Excel匯出:您可以在同一工作流中直接將CSV轉換為Excel格式,以獲得增強的功能性與共享性。

下圖顯示了左側的範例CSV文件和右側的解析輸出Excel文件:

C#處理數據中帶逗號的CSV文件與IronXL:圖片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
}
$vbLabelText   $csharpLabel

IronXL支持各種分隔符——包括管道、製表符、分號和任何單字符——可以處理多種字符編碼,並有效地處理任何大小的文件。 為處理複雜的數據情況,探索數據操作功能企業功能,如受密碼保護的文件處理和公式計算。

使用不同分隔符格式

許多系統使用非逗號的分隔符導出數據。 歐洲地區的應用程序通常使用分號,因為那些地區的小數點分隔符本身就是逗號。 管道分隔文件在舊系統和數據倉庫導出中很常見。 IronXL通過listDelimiter參數處理所有這些,這樣您只需改變一個字符就能在格式之間切換,而不是重寫解析邏輯。

處理編碼與國際字符

字符編碼問題會導致難以檢測到的微妙數據損壞。 當CSV文件包含非ASCII字符——重音字母、CJK字符或貨幣符號時,指定正確的編碼可防止輸出混亂。 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 (OSS)
IronXL

無論您是在處理帶有貨幣格式的財務報告、包含國際字符的客戶數據,還是包含特殊字符的系統日誌,IronXL在整個解析過程中都保持數據的完整性。 根據Stack Overflow上的討論,處理CSV字段內的逗號是最常見的解析挑戰之一——而IronXL正面解決這個問題。

性能特徵

IronXL在不將整個文件加載到記憶體中的情況下流處理大型CSV文件,這使其適合處理包含數百萬行的文件。 該程式庫的內存高效設計意味著您可以在標準服務器實例上運行CSV解析任務,而無需為較大數據負載提供額外的RAM。

對於公式計算單元格樣式,IronXL在將CSV數據轉換為.xlsx格式時保持完整的Excel兼容性。 當下游消費者期望格式化的Excel輸出而不是裸表數據時,這一點尤為重要。

部署靈活性

因為IronXL沒有依賴Microsoft Office,您可以將其部署到任何運行.NET的環境——包括Linux容器、Azure Functions、AWS Lambda以及內部部署的Windows Server。 對於生產環境,IronXL提供了企業應用所需的可靠性和支援結構,有專業授權和持續更新支持

您應該何時選擇功能齊全的試算表程式庫?

選擇正確的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. 通過.xlsx

從免費試用開始,可在您的環境中測試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 文件,憑藉其優化的解析功能,可以快速準確地處理這些文件。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

Iron Support Team

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