跳過到頁腳內容
使用 IRONXL

如何使用 C# 讀取包含逗號資料的 CSV 文件

CSV 檔案看似簡單,但一旦資料中包含逗號,問題就來了——"Smith, John"會變成兩個獨立的字段,地址也會被逗號分割,精心組織的資料瞬間變得混亂不堪。雖然基本的處理方法在實際的 CSV 資料中往往會失效,但 IronXL 提供了一個可靠的解決方案,可以自動處理這些複雜情況。

!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101 01000101111101010011010101000100000101010010010101000100010101000100010111110101011101001000110 1010101000100100001011111010100000101001001001111010001000101010101010000110101010100101010101011 10101010001010010010010010010000010100110001011111010000100100110001001111101000011010010111111010000110100101110--

為什麼逗號會導致 CSV 檔案解析失敗?

CSV(逗號分隔值)檔案使用逗號作為欄位值之間的分隔符,當資料本身包含逗號時,便會產生固有的衝突。 RFC 4180 標準透過要求將包含逗號的欄位用雙引號括起來來解決這個問題。 如果處理不當,像"紐約大街 123 號 400 室"這樣的簡單地址會被分成三個單獨的字段,而不是保持為一個字段。

傳統的 CSV 解析方法之所以失敗,是因為它們無法識別引號包圍的儲存格或字串值中逗號的上下文。 若對字串行應用基本的分割方法,系統將無法解析引號,導致表格資料損毀及資料結構失效。 此問題影響無數商業情境:客戶地址、產品描述、財務數據以及 Excel 匯入檔案中,通常都包含帶有逗號的資料。 即使是微軟的官方文件也承認,解析包含特殊字元的 CSV 檔案非常複雜。

當您處理實際的資料集時,這個問題便顯得格外明顯。 試想一個包含"Hammer, 16oz, Steel-Head"這類產品名稱,或"Johnson, Jr., Robert A."這類客戶記錄的 CSV 檔案——此類模式會立即讓簡單的解析器無法運作。 財務數據是另一個常見的陷阱:使用千位分隔符格式化的貨幣金額(例如"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 解析任務,無需為大量資料負載額外配置 RAM。

對於公式計算儲存格樣式,IronXL 在將 CSV 資料轉換為 .xlsx 格式時,保持與 Excel 的完全相容性。 當下游使用者期望獲得格式化的 Excel 輸出,而非原始表格資料時,這一點尤為重要。

部署靈活性

由於 IronXL 不依賴 Microsoft Office,您可以將其部署至任何執行 .NET 的環境,包括 Linux 容器、Azure Functions、AWS Lambda 以及本地端的 Windows Server。 針對生產環境,IronXL 提供企業級應用程式所需的可靠性與支援架構,並由 Professional License 及持續更新作為後盾。

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

選擇合適的 CSV 函式庫取決於您的具體需求。 當您需要以下功能的任何組合時,IronXL 都是最佳選擇:

  • 讀取 CSV 檔案,並將其轉換為 Excel 格式以供報表製作或分發
  • 處理包含非 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 文件,憑藉其優化的解析功能,可以快速準確地處理這些文件。

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

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我