使用IRONXL

如何從 CSV 檔案讀取資料並將其存儲在資料庫 C#

發佈 2024年1月27日
分享:

在當今的數位世界中,高效地處理數據是一項重要的任務。軟體開發中的常見需求之一是從 CSV 文件中讀取數據並將其存儲到數據庫中。本教程涵蓋了使用 C# 從 CSV 文件中讀取數據並將其存儲到 SQL Server 數據庫中的步驟,特別是利用 IronXL library本指南專為初學者設計,將以簡單、有趣的方式進行講解。

理解基礎知識

*什麼是 CSV 文件?

CSV (逗號分隔值) 文件是一個純文字文件,包含以逗號分隔的數據。由於其簡單性和與各種應用程式(如 Excel)的相容性,這是一種流行的數據傳輸格式。

SQL Server 和資料庫的角色

SQL Server 是由微軟開發的資料庫管理系統。它用來以結構化的方式存儲和管理資料。在我們的案例中,我們會將 CSV 資料存儲在 SQL Server 表格中。

介紹 IronXL

IronXL 是一個專為 .NET 應用程式設計的 Excel 庫,旨在使開發人員無需 Microsoft Office Interop 即可讀取、生成和編輯 Excel 文件。該庫因其與各種 .NET 版本和平台的兼容性而突出,包括 .NET Core、.NET Standard 和 .NET Framework,以及對不同操作系統的支持,如 Windows、Linux 和 macOS。這是一個強大的數據導入庫,特別適合處理 CSV 文件。

如何從 CSV 文件中讀取和儲存數據到 C#

  1. 在 Visual Studio 中創建一個 C# 控制檯程序。

  2. 使用 NuGet 套件管理器安裝 CSV 函式庫。

  3. 使用函式庫在程序中載入 CSV 文件。

  4. 與資料庫建立連線。

  5. 使用函式庫從 CSV 文件中讀取內容。

  6. 使用 SqlBulkCopy 方法將該內容複製到資料庫中。

這是一段範例代碼:

using System;
using System.Data;
using System.Data.SqlClient;
using CsvHelper;

namespace CsvReader
{
    class Program
    {
        static void Main(string [] args)
        {
            string csvPath = @"path\to\your\csv\file.csv";

            using (var reader = new StreamReader(csvPath))
            using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
            {
                var records = csv.GetRecords<YourModel>();

                using (var sqlBulkCopy = new SqlBulkCopy("your_connection_string"))
                {
                    sqlBulkCopy.DestinationTableName = "YourTableName";
                    sqlBulkCopy.WriteToServer(records.AsDataReader());
                }

                Console.WriteLine("Data imported successfully!");
            }
        }
    }
}
using System;
using System.Data;
using System.Data.SqlClient;
using CsvHelper;

namespace CsvReader
{
    class Program
    {
        static void Main(string [] args)
        {
            string csvPath = @"path\to\your\csv\file.csv";

            using (var reader = new StreamReader(csvPath))
            using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
            {
                var records = csv.GetRecords<YourModel>();

                using (var sqlBulkCopy = new SqlBulkCopy("your_connection_string"))
                {
                    sqlBulkCopy.DestinationTableName = "YourTableName";
                    sqlBulkCopy.WriteToServer(records.AsDataReader());
                }

                Console.WriteLine("Data imported successfully!");
            }
        }
    }
}
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports CsvHelper

Namespace CsvReader
	Friend Class Program
		Shared Sub Main(ByVal args() As String)
			Dim csvPath As String = "path\to\your\csv\file.csv"

			Using reader = New StreamReader(csvPath)
			Using csv = New CsvReader(reader, CultureInfo.InvariantCulture)
				Dim records = csv.GetRecords(Of YourModel)()

				Using sqlBulkCopy As New SqlBulkCopy("your_connection_string")
					sqlBulkCopy.DestinationTableName = "YourTableName"
					sqlBulkCopy.WriteToServer(records.AsDataReader())
				End Using

				Console.WriteLine("Data imported successfully!")
			End Using
			End Using
		End Sub
	End Class
End Namespace
VB   C#

請確保將「path\to\your\csv\file.csv」替換為您的 CSV 文件的實際路徑,將「YourModel」替換為表示您 CSV 數據的模型,將「your_connection_string」替換為您的資料庫連接字符串,並將「YourTableName」替換為您的資料庫表名稱。

設定環境

先決條件

  1. Visual Studio:確保已安裝 Visual Studio。
  2. SQL Server:您應該安裝並可以訪問 SQL Server。
  3. IronXL 安裝:通過運行以下 NuGet 命令安裝 IronXL:
Install-Package IronXL.Excel

dotnet add package IronXL

請確保在您希望安裝 IronXL 的項目目錄中運行這些命令。

建立 SQL Server 資料表

在匯入數據之前,請在您的 SQL Server 資料庫中建立一個目標資料表。這個資料表將儲存 CSV 數據。

CREATE TABLE YourTableName (
    Column1 DataType,
    Column2 DataType,
    ...
);

YourTableNameColumn1Column2DataType 替換為您的具體詳細信息。

匯入 CSV 資料的分步指南

  1. 首先,確保您有一個包含您要匯入的數據的 CSV 文件。

  2. 在 Visual Studio 中創建一個新的 C# 控制台應用程序項目。

  3. 安裝 CsvHelper NuGet 套件以便讀取 CSV 文件。您可以通過在 Visual Studio 中打開 NuGet 套件管理器控制台並運行以下命令來完成此操作:
    :installCmd Install-Package CsvHelper
  1. 在您的 C# 代碼文件頂部添加必要的 using 語句:
    using System;
    using System.IO;
    using CsvHelper;
    using System;
    using System.IO;
    using CsvHelper;
Imports System
	Imports System.IO
	Imports CsvHelper
VB   C#
  1. 在您的程式碼中,指定您的CSV文件的路徑。例如:
    string csvFilePath = @"C:\path\to\your\csv\file.csv";
    string csvFilePath = @"C:\path\to\your\csv\file.csv";
Dim csvFilePath As String = "C:\path\to\your\csv\file.csv"
VB   C#

請確保將 C:\path\to\your\csv\file.csv 替換為您的 CSV 文件的實際路徑。

  1. 創建一個新的 StreamReader 類實例來讀取 CSV 文件:
    using (var reader = new StreamReader(csvFilePath))
    {
        // code goes here
    }
    using (var reader = new StreamReader(csvFilePath))
    {
        // code goes here
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. 創建 CsvReader 類的新實例,傳入 StreamReader 對象:
    using (var reader = new StreamReader(csvFilePath))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        // code goes here
    }
    using (var reader = new StreamReader(csvFilePath))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        // code goes here
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. 您可以選擇性地使用任何必要的設定來配置 CsvReader 物件。例如:
    csv.Configuration.HasHeaderRecord = true;
    csv.Configuration.HasHeaderRecord = true;
csv.Configuration.HasHeaderRecord = True
VB   C#
  1. 使用 GetRecords<T>()將CsvReader物件的方法用於將 CSV 數據讀取到物件集合中。替換`與表示 CSV 文件中每個記錄的對象類型。例如:
    var records = csv.GetRecords<YourModel>();
    var records = csv.GetRecords<YourModel>();
Dim records = csv.GetRecords(Of YourModel)()
VB   C#

確保將 YourModel 替換為您的模型類別的實際名稱。

  1. 遍歷記錄並執行任何必需的處理或驗證:
    foreach (var record in records)
    {
        // code goes here
    }
    foreach (var record in records)
    {
        // code goes here
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#
  1. (選擇性)使用 ADO.NET 或像 Entity Framework 這樣的 ORM 工具,建立與 SQL Server 資料庫的連接。

  2. 使用您選擇的數據庫訪問機制將每條記錄插入到數據庫中。例如,若您使用 ADO.NET,可以利用 SqlBulkCopy 類來高效地批量插入數據。

  3. 在導入過程中處理任何可能發生的異常,並提供適當的錯誤信息或日誌。

  4. 通過運行應用程式進行測試,驗證 CSV 數據是否成功導入到數據庫中。

就是這樣。! 您現在已成功使用 C# 將 CSV 數據導入到您的 SQL Server 資料庫。

第一步:讀取 CSV 檔案

在開始從 CSV 文件導入數據的任務時,第一個關鍵步驟是準確讀取其中的數據。CSV 文件中的每一行通常代表一個數據記錄,而每個記錄由一個或多個用逗號分隔的字段組成。

然後我們使用 IronXL 庫來處理 CSV 文件。要使用 IronXL 讀取 CSV 文件,你可以使用其 WorkBookWorkSheet 類。WorkBook 類表示整個電子表格,可以是 Excel 文件或者就像我們的情況,是一個 CSV 文件。當你將 CSV 文件路徑加載到 WorkBook 對象中時,IronXL 將 CSV 文件視為一個電子表格/數據表。

using IronXL;
public class CSVReader
{
    public DataTable ReadCSV(string filePath)
    {
        WorkBook workbook = WorkBook.Load(filePath);
        WorkSheet sheet = workbook.DefaultWorkSheet;
        // Convert to DataTable for easier processing
        DataTable dataTable = sheet.ToDataTable(true); // Set to 'true' if your CSV has a header row
        return dataTable;
    }
}
using IronXL;
public class CSVReader
{
    public DataTable ReadCSV(string filePath)
    {
        WorkBook workbook = WorkBook.Load(filePath);
        WorkSheet sheet = workbook.DefaultWorkSheet;
        // Convert to DataTable for easier processing
        DataTable dataTable = sheet.ToDataTable(true); // Set to 'true' if your CSV has a header row
        return dataTable;
    }
}
Imports IronXL
Public Class CSVReader
	Public Function ReadCSV(ByVal filePath As String) As DataTable
		Dim workbook As WorkBook = WorkBook.Load(filePath)
		Dim sheet As WorkSheet = workbook.DefaultWorkSheet
		' Convert to DataTable for easier processing
		Dim dataTable As DataTable = sheet.ToDataTable(True) ' Set to 'true' if your CSV has a header row
		Return dataTable
	End Function
End Class
VB   C#

步驟 2:建立資料庫連接

建立與您的 SQL Server 資料庫的連接是儲存 CSV 數據過程中的基本步驟。這一步驟涉及設定應用程式與資料庫伺服器之間的通信鏈路。成功的連接至關重要,因為沒有它,就無法將數據傳送到資料庫中。

此步驟著重於使用 C# 中的連接字串來創建和打開連接。連接字串是關鍵組成部分,因為它包含建立連接所需的信息。它就像是一把打開資料庫之門的鑰匙。

public class DatabaseConnector
{
    private string connectionString = "your_connection_string_here";

    public SqlConnection ConnectToDatabase()
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}
public class DatabaseConnector
{
    private string connectionString = "your_connection_string_here";

    public SqlConnection ConnectToDatabase()
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}
Public Class DatabaseConnector
	Private connectionString As String = "your_connection_string_here"

	Public Function ConnectToDatabase() As SqlConnection
		Dim connection As New SqlConnection(connectionString)
		connection.Open()
		Return connection
	End Function
End Class
VB   C#

connectionString 變數包含所有連接到 SQL Server 所需的詳細資訊。它通常包括伺服器名稱、資料庫名稱、用戶 ID 和密碼。一個範例的連接字串看起來像這樣:Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;。務必將這些佔位符替換為您的實際伺服器詳細資訊。

步驟3:將資料儲存到資料庫中

在與SQL Server資料庫建立連線後,下一個重要步驟是將CSV資料儲存到資料庫中。這個步驟涉及將已經讀取並處理過的資料轉移到SQL Server表中。這是資料處理過程中的關鍵部分,因為它涉及實際從本地文件到資料庫伺服器的資料遷移。

在此步驟中,我們將重點放在如何將現在儲存在DataTable中的CSV資料轉移到SQL Server資料庫中。我們結合使用C#和SQL Server的功能來高效地完成這項任務。

public class DataImporter
{
    public void ImportData(DataTable dataTable)
    {
        using (SqlConnection connection = new DatabaseConnector().ConnectToDatabase())
        {
            // Check if the table exists and create it if it does not.
            string tableName = "CSVData"; // Use a valid SQL table name format
            string checkTable = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN ";
            string createTable = "CREATE TABLE " + tableName + " (";
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                createTable += $"[{dataTable.Columns [i].ColumnName}] NVARCHAR(MAX)";
                if (i < dataTable.Columns.Count - 1)
                    createTable += ", ";
            }
            createTable += ") END";
            SqlCommand createTableCommand = new SqlCommand(checkTable + createTable, connection);
            createTableCommand.ExecuteNonQuery();

            // Now we use SqlBulkCopy to import the data
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName = tableName;
                try
                {
                    bulkCopy.WriteToServer(dataTable);
                    Console.WriteLine("Data imported successfully!");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
}
public class DataImporter
{
    public void ImportData(DataTable dataTable)
    {
        using (SqlConnection connection = new DatabaseConnector().ConnectToDatabase())
        {
            // Check if the table exists and create it if it does not.
            string tableName = "CSVData"; // Use a valid SQL table name format
            string checkTable = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN ";
            string createTable = "CREATE TABLE " + tableName + " (";
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                createTable += $"[{dataTable.Columns [i].ColumnName}] NVARCHAR(MAX)";
                if (i < dataTable.Columns.Count - 1)
                    createTable += ", ";
            }
            createTable += ") END";
            SqlCommand createTableCommand = new SqlCommand(checkTable + createTable, connection);
            createTableCommand.ExecuteNonQuery();

            // Now we use SqlBulkCopy to import the data
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName = tableName;
                try
                {
                    bulkCopy.WriteToServer(dataTable);
                    Console.WriteLine("Data imported successfully!");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
}
Public Class DataImporter
	Public Sub ImportData(ByVal dataTable As DataTable)
		Using connection As SqlConnection = (New DatabaseConnector()).ConnectToDatabase()
			' Check if the table exists and create it if it does not.
			Dim tableName As String = "CSVData" ' Use a valid SQL table name format
			Dim checkTable As String = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN "
			Dim createTable As String = "CREATE TABLE " & tableName & " ("
			For i As Integer = 0 To dataTable.Columns.Count - 1
				createTable &= $"[{dataTable.Columns (i).ColumnName}] NVARCHAR(MAX)"
				If i < dataTable.Columns.Count - 1 Then
					createTable &= ", "
				End If
			Next i
			createTable &= ") END"
			Dim createTableCommand As New SqlCommand(checkTable & createTable, connection)
			createTableCommand.ExecuteNonQuery()

			' Now we use SqlBulkCopy to import the data
			Using bulkCopy As New SqlBulkCopy(connection)
				bulkCopy.DestinationTableName = tableName
				Try
					bulkCopy.WriteToServer(dataTable)
					Console.WriteLine("Data imported successfully!")
				Catch ex As Exception
					Console.WriteLine(ex.Message)
				End Try
			End Using
		End Using
	End Sub
End Class
VB   C#

首先,使用 DatabaseConnector 類別開啟與 SQL Server 資料庫的連接,確保資料交易的通道。該方法檢查資料庫中是否存在名為 "CSVData" 的資料表。

如果未找到該資料表,則繼續建立它。資料表的結構基於傳遞給該方法的 DataTable 結構構建,並將所有欄位設置為 NVARCHAR。(最大)**以適應任何文本數據。這是一種通用的方法,可能需要進一步細化以更貼近特定數據類型。

之後,會制定並執行SQL命令以驗證表的存在或創建表。這確保了後續的大批量複製操作有一個準備好的目標表用於數據插入。在表準備好之後,使用SqlBulkCopy類從DataTable直接將數據傳輸到SQL Server表中。這種操作是為高性能的大量數據傳輸而設計的,使其適合高效處理大量數據。

第四步:整合一切

在仔細完成先前的步驟,如讀取 CSV 數據、建立數據庫連接和準備傳輸數據後,我們來到了最後也是至關重要的階段:將這些單獨的組件整合成一個統一的過程。

這個整合是在您的 C# 應用程式的 Main 方法中完成的,所有東西在這裡匯集在一起,這樣就能實際執行從 CSV 文件到 SQL Server 數據庫的數據導入。

class Program
{
    static void Main(string [] args)
    {
        string filePath = "path_to_your_csv_file.csv";
        CSVReader reader = new CSVReader();
        DataTable dataTable = reader.ReadCSV(filePath);
        DataImporter importer = new DataImporter();
        importer.ImportData(dataTable);
        Console.WriteLine("Data imported successfully!");
    }
}
class Program
{
    static void Main(string [] args)
    {
        string filePath = "path_to_your_csv_file.csv";
        CSVReader reader = new CSVReader();
        DataTable dataTable = reader.ReadCSV(filePath);
        DataImporter importer = new DataImporter();
        importer.ImportData(dataTable);
        Console.WriteLine("Data imported successfully!");
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim filePath As String = "path_to_your_csv_file.csv"
		Dim reader As New CSVReader()
		Dim dataTable As DataTable = reader.ReadCSV(filePath)
		Dim importer As New DataImporter()
		importer.ImportData(dataTable)
		Console.WriteLine("Data imported successfully!")
	End Sub
End Class
VB   C#

path_to_your_csv_file.csv 替換為您的 CSV 文件的路徑。

運行專案

一旦您運行專案,您將看到以下輸出。成功訊息表示所有操作都已成功執行,數據已複製到資料庫。

Data imported successfully!

現在,您可以開啟 SQL Server Management Studio (SSMS) 請檢查資料庫下的表格。您將在表格中看到以下數據。

如何從 CSV 檔案讀取資料並存入資料庫 C#: 圖 1 - 輸出資料庫

結論

本教程指導了您如何使用C#從CSV文件中讀取數據並將其存儲在SQL Server數據庫中。通過遵循這些步驟並使用IronXL庫,您可以在C#應用程序中高效地管理CSV數據。

IronXL 提供了一個 免費試用 供用戶在購買前體驗其功能。這個完全功能的試用版允許潛在用戶在實際環境中測試和評估產品,生產環境中不會出現任何水印。在試用期結束後,如果您決定繼續在您的專案中使用 IronXL,產品的授權起價為 $749。

< 上一頁
如何將 DataGridView 導出到 Excel 在 C# 中
下一個 >
如何在C#中將Excel文件轉換為XML

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 1,023,839 查看許可證 >