首页 > 解决方案 > 将 CSV 文件中的数据插入 sqlite 数据库

问题描述

我有一个具有以下结构的 CSV 文件作为一行的示例: 01.01.2020;12:00:00;50;100;150

我有一个带有以下列结构的表的 SQLite 数据库文件:(DateAndTime as TEXT, Field1 as INTEGER, Field2 as INTEGER, Field3 as INTEGER, AddField as INTEGER (THAT field depends from UserInput and is not from CSV)我没有选择在我的 Sqlite 数据库中将 DateAndTime 声明为 DATETIME。)

首先,我认为我不能使用批量插入来执行此操作,因为我必须转换正确对象中的一些值(一个日期时间对象中 CSV 的第一列和第二列,添加来自 UserInput 的最后一个参数)。CSV 的其他值都可以,它们是简单的整数。

此外,我需要检查我要插入的数据行是否已经插入。是时忽略这一行并继续下一行。

到目前为止我已经完成的步骤:

List<MyObject> MyObjectList = new List<MyObject>();
using (StreamReader file = new StreamReader(@filepath))
    {
        string ln;

        while ((ln = file.ReadLine()) != null)
            {
                if (!String.IsNullOrWhiteSpace(ln))
                    {
                        try
                        {
                            string[] ValuesStringArray = ln.Split(';');

                            string[] DateArray = ValuesStringArray[0].Split('.');
                            string[] TimeArray = ValuesStringArray[1].Split(':');

                            DateTime dateTime = new DateTime(Int16.Parse(DateArray[2]), 
                                                             Int16.Parse(DateArray[1]), 
                                                             Int16.Parse(DateArray[0]),
                                                             Int16.Parse(TimeArray[0]),
                                                             Int16.Parse(TimeArray[1]),
                                                             Int16.Parse(TimeArray[2]));
                            int field1 = Int32.Parse(ValuesStringArray[2]);
                            int field2 = Int32.Parse(ValuesStringArray[3]);
                            int field3 = Int32.Parse(ValuesStringArray[4]);
                            int addField = Int32.Parse(USERINPUT blabla);

                            MyObject myObject = new MyObject() {DateTime = dateTime, Field1 = field1, Field2 = field2, Field3 = field3, AddField = addField };

                            MyObjectList.Add(myObject);
                            ........

然后我遍历 MyObjectList 并使用以下语句将其插入数据库:

INSERT INTO MyTable (DateTime, Field1, Field2, Field3, AddField) SELECT @DateTime, @Field1, @Field2, @Field3, @AddField WHERE NOT EXISTS (SELECT 1 FROM MyTable WHERE DateTime = @DateTime AND Field1 = @Field1 AND [..so on]);

@statements 获取参数并且它在一个事务中,因此对于所有插入它都是一个事务。

我现在的问题是,当 csv 文件长 100,000 行时,此过程将花费很长时间。一次插入的时间呈指数增长。第一次插入需要 0-1 毫秒,这将稍微增加更多的插入。我对创建 MyObjectList 并填充它的代码的第一部分感到满意​​,这对我来说非常好而且很快。

我需要您的帮助以尽快获得插入事务。有没有更好的方法来查找重复项并在有重复项时忽略?任何提示或示例都会有所帮助。

标签: c#wpfsqlitecsvinsert

解决方案


推荐阅读