使用IRONXL

如何读取CSV文件中的数据并将其存储在数据库中 C#

发布 2024年一月27日
分享:

在当今的数字世界中,高效处理数据是一项重要任务。 软件开发中的一个常见要求是从 CSV 文件中读取数据并将其存储到数据库中。 本教程包括使用 C# 从 CSV 文件读取数据并将其存储到 SQL Server 数据库的步骤,特别是利用了IronXL 库. 本指南专为初学者设计,将以简单、引人入胜的方式进行解释。

了解基础知识

*什么是 CSV 文件?

CSV(逗号分隔值)文件是一个纯文本文件,包含用逗号分隔的数据。 由于其简单性和与 Excel 等各种应用程序的兼容性,它是一种常用的数据传输格式。

SQL Server 和数据库的作用

SQL Server 是微软公司的数据库管理系统。 它用于以结构化的方式存储和管理数据。 在我们的案例中,我们将在 SQL Server 表中存储 CSV 数据。

IronXL 简介

铁XLMicrosoft Excel 库是为 .NET 应用程序量身定制的 Excel 库,专门用于使开发人员无需使用 Microsoft Office Interop 即可读取、生成和编辑 Excel 文件。该库的突出特点是兼容各种 .NET 版本和平台,包括 .NET Core、.NET Standard 和 .NET Framework,并支持 Windows、Linux 和 macOS 等不同操作系统。 这是一个功能强大的数据导入库,尤其适用于处理 CSV 文件。

如何在 C# 中读取和存储 CSV 文件中的数据;

  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 服务器:您应已安装并可访问 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. 安装用于读取 CSV 文件的 CsvHelper NuGet 软件包。 您可以通过在 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 数据库。

第 1 步:阅读 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 和密码。 连接字符串示例如下服务器=myServerAddress;数据库=myDataBase;用户名=myUsername;密码=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 表格中。 该操作专为高性能批量数据传输而设计,适合高效处理大量数据。

第 4 步:整合

经过读取 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)并检查数据库下的表格。 您将在表格中看到以下数据。

如何使用 C# 从 CSV 文件读取数据并将其存储到数据库中:图 1 - 输出数据库

结论

本教程已指导您完成了使用 C# 从 CSV 文件读取数据并将其存储到 SQL Server 数据库的过程。 按照这些步骤并利用 IronXL 库,您就可以在 C# 应用程序中高效地管理 CSV 数据。

IronXL 提供了一个免费试用让用户在购买前体验其功能。 这个功能齐全的试用版允许潜在用户在没有任何水印的生产环境中测试和评估产品。 试用期结束后,如果您决定继续在项目中使用 IronXL,则产品许可从 $749 起。

< 前一页
如何在C#中将DataGridView导出到Excel
下一步 >
如何在C#中将Excel文件转换为XML

准备开始了吗? 版本: 2024.11 刚刚发布

免费NuGet下载 总下载量: 1,111,773 查看许可证 >