跳至頁尾內容
使用 IRONXL

C# 將 CSV 檔案讀取到 DataTable:完整開發者指南

使用 IronXL 在 C# 中將 CSV 文件轉換為DataTable非常簡單:使用WorkBook.LoadCSV()讀取任何 CSV 文件,然後呼叫ToDataTable(true)建立一個具有正確列標題的結構化DataTable ,即可進行資料庫匯入或資料操作。

對於 .NET 開發人員來說,處理 CSV 檔案是一項常見的任務,無論是匯入銷售報告、處理庫存或同步客戶記錄。 將 CSV 檔案轉換為DataTable可以方便地進行操作、分析或插入資料庫表。 IronXL 庫為在 C# 應用程式中處理 Excel 和 CSV 操作提供了一個強大的解決方案。

在 C# 中讀取 CSV 檔案可能很棘手——大檔案、不同的分隔符號或嵌入的逗號通常需要複雜的解析或 Excel。 IronXL 簡化了這個過程:只需幾行程式碼,即可從任何文件路徑讀取 CSV 文件,將其轉換為具有正確列標題的DataTable ,並準備進行批量資料庫操作——所有這些都無需 Excel。 當在不使用 Interop 的情況下使用 C# 處理 Excel時,這種方法特別有用。

本指南將教您如何:

  • 使用IronXL 的 CSV 讀取功能,將 CSV 檔案載入到 C# 中的DataTable
  • 處理不同的分隔符,例如逗號、製表符或分號
  • 使用匯出功能,有效率地將DataTable直接匯入 SQL Server
  • 可靠地管理大型資料集,而不會出現記憶體問題

到最後,您將擁有一個完整的、實用的工作流程,可以使用 IronXL 在 .NET 應用程式中將 CSV 資料轉換為可操作的信息,無論您是部署到 Azure還是在Linux 環境中運行。

為什麼CSV到DataTable轉換至關重要?

CSV 轉DataTable轉換允許開發人員將逗號分隔值(CSV 資料)轉換為結構化物件(如DataTable ),以便進行進一步處理。 無論您是處理庫存資料、客戶記錄還是交易日誌,能夠有效率地將 CSV 轉換為新的DataTable至關重要。 使用第一行作為列標題,可以確保資料表列與資料庫表架構保持一致,使其非常適合Excel 到 SQL 的操作

傳統方法在處理大型檔案、不同分隔符號或記憶體管理方面常常遇到困難。 IronXL 消除了這些挑戰,並能無縫處理不同的分隔符號、帶有引號的字段和嵌入式逗號。 IronXL 的 CSV 讀取功能消除了這些常見的痛點,同時也提供了資料驗證檔案大小最佳化等附加功能。

何時應該使用DataTable而不是其他資料結構?

當您需要在記憶體中執行類似資料庫的操作時, DataTables表現出色。 它們非常適合涉及 SQL Server 匯入、資料綁定到 UI 控製或需要對結構化資料執行 LINQ 查詢的場景。 與簡單的陣列或清單不同, DataTables提供架構驗證、表之間的關係以及與 ADO.NET 的無縫整合。 對於更複雜的場景,您還可以根據需要進行 DataSet 和 DataTable 之間的轉換

傳統 CSV 解析常見問題有哪些?

手動 CSV 解析經常會在以下特殊情況下失敗:帶引號的欄位包含逗號、儲存格值中包含換行符號或分隔符號使用不一致。 處理大型檔案時,如果一次性將所有內容載入到記憶體中,記憶體消耗就會成為問題。 字元編碼問題可能會損壞國際數據,而類型推斷經常將數字字串錯誤地解釋為數字。 正是由於這些挑戰, IronXL 強大的解析引擎才變得對生產應用至關重要。

IronXL 如何解決記憶體管理問題?

IronXL 實現了串流讀取和緩衝讀取技術,可以有效地處理大型 CSV 檔案。 它不會將整個文件載入到記憶體中,而是分塊處理數據,即使處理 GB 大小的文件,也能保持較小的記憶體佔用。 該程式庫還提供了效能優化,與傳統方法相比,可將記憶體使用量減少高達 95%。 這使其適用於資源有限的伺服器環境

如何安裝 IronXL?

使用 IronXL 只需簡單安裝 NuGet 套件即可。 在 Visual Studio 中開啟 NuGet 套件管理器控制台並執行:

Install-Package IronXL.Excel

安裝完成後,將 IronXL 命名空間新增至您的專案:

using IronXL;
using System.Data;
using IronXL;
using System.Data;
$vbLabelText   $csharpLabel

這樣一來,使用者無需依賴 Excel 即可使用所有強大的 CSV 處理功能。 有關 IronXL 豐富的 API 的更多詳細信息,請參閱API 參考文檔。 如果您使用的是Docker 容器,則可能需要額外的設定步驟。

IronXL的系統需求是什麼?

IronXL 支援 .NET Framework 4.6.2+ 和 .NET Core/5/6/7/8+,使其與現代應用程式和傳統應用程式相容。 它可在 Windows、 LinuxmacOS平台上運作。 該庫需要大約 50MB 的磁碟空間和少量 RAM 來進行基本操作。 對於Azure Functions或容器化環境,請確保您的部署包含必要的執行時間依賴項。

如何確認安裝是否成功?

建立一個簡單的測試程序,載入 CSV 檔案以驗證安裝情況。 如果遇到許可訊息,您需要應用許可證密鑰。 檢查項目檔案中的套件引用,確保 IronXL 顯示正確的版本。 執行基本的 CSV 讀取操作-如果操作完成且沒有錯誤,則表示安裝成功。 對於 Web 應用程序,您可能需要在 web.config 中設定許可證

為什麼選擇 NuGet 而不是手動安裝?

NuGet 會自動管理依賴項,確保所有必要的程式庫都已正確安裝。 它簡化了版本更新——只需一個命令即可更新 IronXL 及其所有依賴項。 NuGet 與 Visual Studio 的整合可在安裝後立即提供IntelliSense支援。 軟體包復原功能可確保團隊成員自動獲得相同的版本。 對於需要特定版本的企業環境,NuGet 也支援私有套件來源

!{--010011000100100101000010010100100100000101010010010110010101111101001110010101010101010101010101010101010101010 0100010111110100100101001101010100010000010100110001001100010111110100001001001100010011110010101010

如何將CSV檔案轉換為DataTable

IronXL 的優點在於它的簡潔性。 以下是如何讀取 CSV 檔案並將其轉換為DataTable方法:

// Load CSV file into a WorkBook object
WorkBook workbook = WorkBook.LoadCSV("sales_data.csv", 
    fileFormat: ExcelFileFormat.XLSX);

// Access the default worksheet
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Convert to DataTable with headers
DataTable dataTable = worksheet.ToDataTable(true);

// Display the data
foreach (DataRow row in dataTable.Rows)
{
    foreach (var item in row.ItemArray)
    {
        Console.Write($"{item}\t");
    }
    Console.WriteLine();
}
// Load CSV file into a WorkBook object
WorkBook workbook = WorkBook.LoadCSV("sales_data.csv", 
    fileFormat: ExcelFileFormat.XLSX);

// Access the default worksheet
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Convert to DataTable with headers
DataTable dataTable = worksheet.ToDataTable(true);

// Display the data
foreach (DataRow row in dataTable.Rows)
{
    foreach (var item in row.ItemArray)
    {
        Console.Write($"{item}\t");
    }
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

LoadCSV 方法能夠智慧地解析您的 CSV 文件,自動處理常見情況,例如帶有引號的欄位和嵌入的逗號。 fileFormat 參數告訴 IronXL 如何在內部解釋 CSV 數據,確保將其視為 Excel 相容的結構。 載入完成後, ToDataTable (true) 方法會將工作表轉換為DataTable ,參數true表示第一行套用作列標題。 這樣就產生了一個結構清晰、列命名與 CSV 標題相符的DataTable 。 如需了解更多進階操作選項,請瀏覽完整的 Excel 轉資料表教學

轉換過程還能聰明地保留資料類型-數字保持數值形式,日期正確解析,文字欄位保持其格式。 與手動解析方法相比,這種自動類型推斷可以節省大量的開發時間。 對於需要自訂資料格式的場景,可以在轉換之前套用儲存格資料格式

ToDataTable參數控制什麼?

ToDataTable () 中的布林參數決定了表頭行的處理方式。 當設定為 true 時,第一行將成為DataTable中的列名,從而建立有意義的欄位引用,例如" CustomerName "而不是"Column1"。 如果為 false,則會指派通用列名,這對於沒有標題的 CSV 檔案非常有用。 這種靈活性支援在實際應用中遇到的各種 CSV 格式。 更高階的場景可能需要管理工作表來處理多個資料範圍。

如何處理沒有標題的CSV檔案?

對於沒有標題的 CSV 文件,請使用ToDataTable (false) 並在之後手動指派列名。 您可以遍歷 Columns 集合,並根據您的資料架構設定有意義的名稱。 或者,在載入 CSV 檔案之前,透過程式設計方式在 CSV 檔案前面新增一個標題行。 如果您需要為現有資料新增標題,IronXL 也支援從頭開始建立電子表格

大型 CSV 檔案會對效能產生哪些影響?

IronXL 使用串流處理技術高效地處理大型 CSV 檔案。 小於 100MB 的檔案通常只需幾秒鐘即可加載,而 GB 等級的檔案則可以受益於該程式庫的效能增強功能。 由於採用了智慧緩衝技術,記憶體使用量與檔案大小無關。 為了獲得處理大量資料集的最佳效能,請考慮使用範圍選擇技術分批處理。

如何將DataTable匯入 SQL Server?

一旦你有了DataTable ,使用SqlBulkCopy將其匯入 SQL Server 就會變得非常有效率:

using System.Data;
using Microsoft.Data.SqlClient;
using IronXL;

class Program
{
    static void Main(string[] args)
    {
        // Create connection string
        string connectionString = @"Data Source=localhost;Initial Catalog=SalesDB;
                           Integrated Security=True;TrustServerCertificate=True;";

        // Read CSV into DataTable
        WorkBook workbook = WorkBook.LoadCSV("inventory_report.csv");
        DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);

        // Bulk insert into SQL Server
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                // Set destination table name
                bulkCopy.DestinationTableName = "dbo.Inventory";

                // Map DataTable columns to SQL table columns
                bulkCopy.ColumnMappings.Add("ProductCode", "product_code");
                bulkCopy.ColumnMappings.Add("Quantity", "quantity");
                bulkCopy.ColumnMappings.Add("LastUpdated", "last_updated");

                // Set batch size for better performance
                bulkCopy.BatchSize = 1000;

                // Write data to SQL Server
                bulkCopy.WriteToServer(dataTable);
            }
        }

        Console.WriteLine($"Successfully imported {dataTable.Rows.Count} records");
    }
}
using System.Data;
using Microsoft.Data.SqlClient;
using IronXL;

class Program
{
    static void Main(string[] args)
    {
        // Create connection string
        string connectionString = @"Data Source=localhost;Initial Catalog=SalesDB;
                           Integrated Security=True;TrustServerCertificate=True;";

        // Read CSV into DataTable
        WorkBook workbook = WorkBook.LoadCSV("inventory_report.csv");
        DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);

        // Bulk insert into SQL Server
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                // Set destination table name
                bulkCopy.DestinationTableName = "dbo.Inventory";

                // Map DataTable columns to SQL table columns
                bulkCopy.ColumnMappings.Add("ProductCode", "product_code");
                bulkCopy.ColumnMappings.Add("Quantity", "quantity");
                bulkCopy.ColumnMappings.Add("LastUpdated", "last_updated");

                // Set batch size for better performance
                bulkCopy.BatchSize = 1000;

                // Write data to SQL Server
                bulkCopy.WriteToServer(dataTable);
            }
        }

        Console.WriteLine($"Successfully imported {dataTable.Rows.Count} records");
    }
}
$vbLabelText   $csharpLabel

SqlBulkCopy 類別為大規模資料導入提供了卓越的效能。 ColumnMappings集合可讓您將DataTable列對應到具有不同名稱的資料庫列,從而確保您的資料架構具有靈活性。 BatchSize屬性透過分塊處理記錄而不是一次載入所有內容來優化記憶體使用。 這種方法可以有效率地處理數百萬筆記錄,使其成為企業級資料操作的理想選擇。 了解更多關於IronXL 的資料集和資料表功能的資訊

為了提高資料完整性,請考慮在批次複製操作中實施事務支援。 這樣可以確保在發生錯誤時可以回滾部分導入操作。 您也可以利用IronXL 的資料驗證功能在導入前對資料進行預先驗證。

為什麼BatchSize對效能很重要?

BatchSize控制每次網路往返傳送到 SQL Server 的行數。較小的批次(100-1000 行)可以減少記憶體使用並允許進度監控,但會增加網路開銷。 對於快速網絡,較大的批次(5000-10000 行)可以最大限度地提高吞吐量,但會消耗更多記憶體。 最佳尺寸取決於您的行寬、網路延遲和可用記憶體。 對於涉及多個 Excel 區域的複雜場景,大量處理就顯得更加重要了。

如何處理列映射不符的問題?

列映射不符會導致批量複製操作期間出現運行時異常。 務必確認來源DataTable表列名與映射定義完全匹配,包括區分大小寫。 在映射之前,請使用GetOrdinal方法驗證列是否存在。 對於動態模式,查詢目標表的結構並以程式設計方式建立映射。 IronXL 的工作表管理功能可以幫助在匯入之前規範列名稱。

大宗進口需要考慮哪些安全因素?

批次匯入需要更高的資料庫權限,通常是db_datawriter或 bulkadmin 角色。 盡可能使用整合式身份驗證,避免將憑證嵌入連接字串中。 透過在匯入過程中新增稽核列來實現行級安全性。 考慮在處理敏感工作簿之前對其進行加密。 務必驗證資料類型和範圍,以防止透過格式錯誤的 CSV 資料進行 SQL 注入。

如何監控導入進度?

對於長時間運行的導入操作,實作SqlRowsCopied事件來追蹤進度。 此事件在每個批次完成後觸發,允許您更新進度條或記錄完成百分比。 根據已處理的行數與總行數之比,計算剩餘時間的估計值。 對於關鍵匯入,將批次完成情況記錄到單獨的追蹤表中。 考慮使用IronXL 的效能監控功能來識別瓶頸。

在這裡,我們可以使用 SSMS 中的查詢*SELECT FROM dbo.Inventory ;**來檢查我們的 CSV 資料是否實際匯入 SQL Server 中。 首先,讓我們來看看範例 CSV 檔案中使用的資料:

記事本視窗顯示了一個範例 CSV 庫存報告,其中包含產品代碼、數量和日期,格式為逗號分隔。

現在,如果您查看查詢的輸出結果,可以看到它已成功將每一列、每一列標題和每一行複製到資料庫表中。

SQL 查詢結果顯示,已從 CSV 檔案匯入 3 個庫存記錄,產品代碼分別為 A100、B200 和 C300,並顯示了它們的數量和時間戳,這些記錄已匯入資料庫管理工具中。

如何處理不同的分隔符號?

並非所有 CSV 檔案都使用逗號。 IronXL 可以無縫處理各種分隔符,使其成為國際資料格式或舊系統的理想選擇:

using IronXL;
using System;
using System.Data;
using System.IO;

class Program
{
    static void Main()
    {
        // --- Tab-delimited file ---
        string tsvPath = @"export_data.tsv";
        WorkBook tsvWorkbook = WorkBook.LoadCSV(tsvPath, ExcelFileFormat.XLSX, "\t");

        // --- Semicolon-delimited file ---
        string semiPath = @"european_data.csv";
        string tempCsv = Path.Combine(Path.GetTempPath(), "european_data_comma.csv");

        // Replace semicolons with commas for proper parsing
        var lines = File.ReadAllLines(semiPath);
        for (int i = 0; i < lines.Length; i++)
        {
            lines[i] = lines[i].Replace(';', ',');
        }
        File.WriteAllLines(tempCsv, lines);

        WorkBook semiWorkbook = WorkBook.LoadCSV(tempCsv, ExcelFileFormat.XLSX);

        // Print both workbooks
        PrintWorkbook(tsvWorkbook, "Tab-delimited File");
        PrintWorkbook(semiWorkbook, "Semicolon-delimited File");
    }

    static void PrintWorkbook(WorkBook workbook, string name)
    {
        Console.WriteLine($"\n--- {name} ---\n");
        DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true);

        // Print column headers
        foreach (DataColumn col in dt.Columns)
        {
            Console.Write($"{col.ColumnName}\t");
        }
        Console.WriteLine();

        // Print rows
        foreach (DataRow row in dt.Rows)
        {
            foreach (var item in row.ItemArray)
            {
                Console.Write($"{item}\t");
            }
            Console.WriteLine();
        }
    }
}
using IronXL;
using System;
using System.Data;
using System.IO;

class Program
{
    static void Main()
    {
        // --- Tab-delimited file ---
        string tsvPath = @"export_data.tsv";
        WorkBook tsvWorkbook = WorkBook.LoadCSV(tsvPath, ExcelFileFormat.XLSX, "\t");

        // --- Semicolon-delimited file ---
        string semiPath = @"european_data.csv";
        string tempCsv = Path.Combine(Path.GetTempPath(), "european_data_comma.csv");

        // Replace semicolons with commas for proper parsing
        var lines = File.ReadAllLines(semiPath);
        for (int i = 0; i < lines.Length; i++)
        {
            lines[i] = lines[i].Replace(';', ',');
        }
        File.WriteAllLines(tempCsv, lines);

        WorkBook semiWorkbook = WorkBook.LoadCSV(tempCsv, ExcelFileFormat.XLSX);

        // Print both workbooks
        PrintWorkbook(tsvWorkbook, "Tab-delimited File");
        PrintWorkbook(semiWorkbook, "Semicolon-delimited File");
    }

    static void PrintWorkbook(WorkBook workbook, string name)
    {
        Console.WriteLine($"\n--- {name} ---\n");
        DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true);

        // Print column headers
        foreach (DataColumn col in dt.Columns)
        {
            Console.Write($"{col.ColumnName}\t");
        }
        Console.WriteLine();

        // Print rows
        foreach (DataRow row in dt.Rows)
        {
            foreach (var item in row.ItemArray)
            {
                Console.Write($"{item}\t");
            }
            Console.WriteLine();
        }
    }
}
$vbLabelText   $csharpLabel

此程式碼示範如何將具有不同分隔符號的 CSV 檔案載入到 IronXL WorkBook物件中。 製表符分隔的檔案使用"\t"作為分隔符號讀取,而分號分隔的檔案在載入前會轉換為標準 CSV 格式。 每個工作簿的預設工作表都會透過ToDataTable (true) 轉換為DataTable ,其中使用第一行作為列標題。 對於更複雜的分隔符號場景,您還可以探索在電子表格檔案類型之間進行轉換

PrintWorkbook方法隨後遍歷DataTable ,並在控制台中顯示數據,包括標題和所有行。 這種靈活性解決了 開發人員討論的許多常見的 CSV 解析難題。 在處理歐洲資料格式時,IronXL 的分隔符號處理功能尤其重要,因為它能夠適應資料格式標準方面的區域差異。

IronXL 原生支援哪些分隔符號?

IronXL 原生支援常用分隔符,包括逗號、製表符、垂直線(|),以及透過 LoadCSV 重載實現的自訂單字元分隔符號。 為了獲得最佳效能,請使用內建分隔符號參數,而不是預處理檔案。 多字元分隔符號需要預處理,如上面的分號範例所示。 如果您需要在 CSV 和 XLSX 之間進行轉換,則該程式庫也可以處理Excel 的原生格式

如何自動檢測分隔符號?

自動分隔符號偵測需要分析 CSV 檔案的前幾行。統計每行常見分隔符號(逗號、製表符、分號、垂直線)出現的次數。出現頻率最高的字元很可能就是您要偵測的分隔符號。 IronXL 不提供自動偵測功能,但您可以在呼叫 LoadCSV 之前實現此邏輯。對於分隔符號不一致的文件,請考慮先驗證資料品質

那麼多字元分隔符號呢?

多字元分隔符,例如"||" 或 "::" 需要預處理,因為 LoadCSV 只接受單字元分隔符號。 將多字元序列替換為資料中不存在的唯一單一字元(例如 \x01)。 替換完成後,使用您選擇的分隔符號載入檔案。 這種方法既能保持資料完整性,又能滿足 IronXL 的分隔符號限制。 對於複雜的變換,可以考慮在匯入後使用IronXL 的儲存格操作功能

從我們的控制台輸出中可以看到,儘管兩個檔案最初使用不同的分隔符,但它們都已正確格式化為資料表。

Microsoft Visual Studio 偵錯控制台顯示兩種不同檔案格式的輸出-一個是製表符分隔的水果資料檔案(ID、名稱、數量),另一個是分號分隔的城市人口資料檔案。

下一步是什麼?

IronXL 將複雜的 CSV 資料庫匯入任務轉換為簡單可靠的流程。 只需幾行程式碼,您就可以:

  • 使用LoadCSV 功能從任何檔案路徑讀取 CSV 文件 將 CSV 資料轉換為格式正確的DataTable
  • 透過智慧解析保留列標題和資料表列 使用批次操作有效率地將數百萬行資料匯入資料庫表

該程式庫會自動處理 CSV 解析、記憶體管理和資料類型轉換等複雜細節,讓您可以專注於業務邏輯,而不是檔案處理細節。 無論您是建立ASP.NET 應用程式、使用Blazor還是開發.NET MAUI 應用程序,IronXL 都能在所有平台上提供一致、可靠的 CSV 處理。

準備好簡化您的資料匯入工作流程了嗎? 立即開始免費試用,找到最適合您團隊需求的產品。 憑藉全面的文檔、豐富的程式碼範例企業級支持,您很快就能像專業人士一樣處理 CSV 文件。

常見問題解答

在 C# 中,將 CSV 檔案讀入 DataTable 的最佳方法是什麼?

使用 IronXL,您可以有效地將 CSV 檔案讀取到 C# 中的 DataTable 中,我們的開發者指南中提供了簡單的程式碼範例。

為什麼我應該使用 IronXL 進行 CSV 到 DataTable 的轉換?

IronXL 提供了一個簡單的 API,用於解析 CSV 檔案並將其轉換為 DataTables,使您能夠輕鬆地在 C# 中操作和分析資料。

IronXL在將CSV檔案轉換為DataTables時能否處理大型CSV檔案?

是的,IronXL 的設計宗旨就是高效處理大型 CSV 檔案並將其轉換為 DataTable,而不會出現效能問題。

IronXL是否支援將CSV轉換為DataTable後進行資料操作?

當然,一旦你使用 IronXL 將 CSV 檔案轉換為 DataTable,你就可以根據需要輕鬆地操作和分析資料。

如何使用 IronXL 將 CSV 資料匯入資料庫?

使用 IronXL 將 CSV 檔案轉換為 DataTable 後,您可以使用 C# 中的標準資料庫連線將資料插入資料庫。

IronXL 是否適用於企業應用程式中處理 CSV 檔案?

是的,IronXL 專為處理企業應用程式中的 CSV 處理任務而設計,提供強大的效能和可靠性。

在 C# 中將 CSV 檔案轉換為 DataTable 有哪些優勢?

將 CSV 檔案轉換為 DataTables 可以更輕鬆地進行資料操作、分析和與資料庫集成,從而增強應用程式的資料處理能力。

IronXL 除了 CSV 格式外,還能用於其他電子表格檔案類型嗎?

是的,IronXL 支援包括 Excel 格式在內的各種電子表格檔案類型,從而在 C# 中實現多功能的資料處理能力。

喬迪·巴迪亞
軟體工程師
喬迪精通Python、C#和C++,除了在Iron Software運用這些技能外,他還從事遊戲程式設計。他參與產品測試、產品開發和研究等工作,為產品的持續改進做出了巨大貢獻。豐富的經驗讓他始終保持挑戰性和工作熱情,他表示這是他最喜歡在Iron Software工作的原因之一。喬迪在佛羅裡達州邁阿密長大,畢業於佛羅裡達大學,主修電腦科學和統計學。