繁体   English   中英

使用LINQ将txt数据导入到.net中的现有SQL Server表中

[英]Import txt data into existing SQL Server table in .net using LINQ

txt文件具有特定格式,它使用“;” 作为分隔符,并具有特定的列数。 我还有一个表,该表是我使用Entity Framework首先创建代码的,该表具有相同的列数。

到目前为止,我已经能够使用“原始” SQL查询(例如BULK INSERT将此类txt文件导入表中。 但是我正在尝试学习如何使用C#(或LINQ,如果需要)从Web应用程序执行此操作。

我从另一个问题遇到了这个解决方案,但似乎它创建了一个名为tbl的表,而我想做的就是将数据插入到现有表中。

public DataTable ConvertToDataTable (string filePath, int numberOfColumns)
{
    DataTable tbl = new DataTable();

    for(int col =0; col < numberOfColumns; col++)
        tbl.Columns.Add(new DataColumn("Column" + (col+1).ToString()));

    string[] lines = System.IO.File.ReadAllLines(filePath);

    foreach(string line in lines)
    {
        var cols = line.Split(':');

        DataRow dr = tbl.NewRow();

        for(int cIndex=0; cIndex < 3; cIndex++)
        {
           dr[cIndex] = cols[cIndex];
        }

        tbl.Rows.Add(dr);
    }

    return tbl;
}

首先,我的建议是不要自己读取CSV文件。 使用CSVHelper之类的NUGET CSV文件序列化

使用CSVHelper,您可以将行直接转换为目标类型:

using (TextReader txtReader = new StreamReader(sourceFileName)
{
    csvReader = new CsvReader(txtReader)
    IEnumerable<MyClass> result = csvReader.GetRecords<MyClass>()
    // TODO: put result into database
}

CsvReader的构造函数之一采用一个配置对象,您可以在其中定义定界符(“:”); 标题行; 评论行; 用空行等做什么

如果决定不使用CsvHelper ,则需要将行转换为MyClass对象:

IEnumerable<MyClass> ConvertTxtFile(string fileName)
{
    // TODO: checks to see if fileName is proper file
    IEnumerable<string> lines = System.IO.File.ReadAllLines(fileName);
    foreach(string line in lines)
    {
       yield return StringToMyClass(line);
    }
}
MyClass StringToMyClass(string line)
{
    // TODO: code to convert your line into a MyClass.
}

因为您不问如何将行转换为MyClass,所以我留给您。

一段时间后,您将获得一系列MyClass对象。 您的问题是如何使用Entity Framework和Linq将它们添加到数据库中

好吧,这将是最简单的部分(一旦您学习了如何使用实体框架)。

假设您的DbContext具有DbSet<MyClass> ,表示MyClass对象的表

IEnumerable<MyClass> readItems = ConvertTxtFile(fileName);
using (var dbContext = new MyDbContext())
{
    dbContext.MyClasses.AddRange(readItems.ToList());
    dbContext.SaveChanges();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM