使用LINQ将CSV标头映射到SQL列

时间:2019-05-02 14:17:32

标签: c# sql linq csv

我正在解析CSV文件并创建一个对象列表,我需要将这些对象导入SQL DB。 csv文件具有不同的标题名称,我可以将它们映射到特定表的每一列。

由于名称不匹配,LINQ失败。

我确实尝试了所有可能的教程和方法,但是无法将csv标头映射到数据库的特定列。

using (TextReader reader = File.OpenText(file))
{
    List<CSVObject> ListCSVObject = new List<CSVObject>();
    CsvReader csv = new CsvReader(reader);
    csv.Configuration.Delimiter = ",";
    csv.Configuration.MissingFieldFound = null;

    while (csv.Read())
    {
        CSVObject objectRow = csv.GetRecord<CSVObject>();
        double time = Convert.ToDouble(objectRow.Timestamp);
        DateTime dateTimeUTC = ConvertFromUnixTimestamp(time);
        objectRow.DateTimeUTC = dateTimeUTC;
        ListCSVObject.Add(objectRow);
    }

    LINQToSQLDataContext db = new LINQToSQLDataContext(connectString);
    foreach(CSVObject obj in ListCSVObject)
    {
        db.dbtoinsert.InsertOnSubmit(obj);
    }

    db.SubmitChanges();
}

2 个答案:

答案 0 :(得分:1)

我的建议:不要构建自己的CSV文件阅读器;改用Nuget包CsvHelper

CsvHelper可以获取任何结构化的CSV文件,可以使用任何类型的分隔符,并且可以带或不带标题行。

如果您的CSV包含标题行,则可以告诉CSV帮助器,应将标记为“家庭名称”的列放在您的课​​程的属性“姓氏”中。

即使您的CSV文件中没有标题行,您也可以说第7列应映射为“ LastName”,第9列应映射为“ BirthDay”

访问the documentation page以获得简单示例

答案 1 :(得分:0)

您可以在将对象插入数据库之前进行对象初始化。

类似这样的东西。

db.dbtoinsert.InsertOnSubmit(new YourTable { Col1 = obj.CSVCol1, ... });