【问题标题】:How to bulk insert a CSV file into SQLite C#如何将 CSV 文件批量插入 SQLite C#
【发布时间】:2010-04-22 08:01:19
【问题描述】:

我见过类似的问题(12),但没有一个讨论如何将 CSV 文件插入 SQLite。我唯一能想到的就是使用CSVDataAdapter 并填写SQLiteDataSet,然后使用SQLiteDataSet 更新数据库中的表:

我发现的唯一适用于 CSV 文件的 DataAdapter 实际上不可用:

CSVDataAdapter CSVda = new CSVDataAdapter(@"c:\MyFile.csv");

CSVda.HasHeaderRow = true;

DataSet ds = new DataSet(); // <-- Use an SQLiteDataSet instead

CSVda.Fill(ds);

要写入 CSV 文件:

CSVDataAdapter CSVda = new CSVDataAdapter(@"c:\MyFile.csv");

bool InclHeader = true;

CSVda.Update(MyDataSet,"MyTable",InclHeader);

找到上面的代码@http://devintelligence.com/2005/02/dataadapter-for-csv-files/
CSVDataAdapter 应该与 OpenNetCF's SDF 一起提供,但它似乎不再可用。

有人知道我在哪里可以得到CSVDataAdapter 吗?也许有人知道更简单的事情:如何将 CSV 文件批量插入 SQLite...您的帮助将不胜感激!

【问题讨论】:

    标签: c# database sqlite csv bulkinsert


    【解决方案1】:

    解决你问题的最后一部分:

    也许有人知道更简单的事情:如何进行批量插入 CSV 文件到 SQLite...

    鉴于您需要从 CSV 文件将几千条(或一百万条 cpl)记录导入 sqlite,
    不直接支持通过 select 或 insert 命令导入 csv 数据时,
    并且逐行读取和插入的迭代行不高效那么一个实用的替代方法是使用“sqlite?.exe”和通过 shell 从你的 c# 代码执行的导入命令。

    加载csvtosqlite.cs

    Process proc = new Process {
        StartInfo = new ProcessStartInfo {
            FileName = @"loadcsvtosqlite.bat",
            Arguments = @"",
            UseShellExecute = true,
            RedirectStandardOutput = false,
            CreateNoWindow = true
        }
    };
    proc.Start();
    proc.WaitForExit();
    

    加载csvtosqlite.bat

    sqlite3.exe "db name" < loadcsv.sql
    

    加载csv.sql

    drop table if exists <table name>;
    create table <table name> (field1 datatype, field2 datatype ....);
    .separator ","
    .import <csv file name> <table name>
    

    【讨论】:

      【解决方案2】:

      试试这个 -Import/Export CSV from SQLite from C# code

      您可以创建 OleDbConnection 到 CSV 文件(只需谷歌它,这很容易)然后将行加载到 DataSet,然后通过 SqliteConnection 将该数据集放入 Sqlite。几行代码。

      【讨论】:

      • 我喜欢 OleDb 的想法……这很聪明! :)
      • 有什么办法不将整个 CSV 数据加载到内存中?
      【解决方案3】:

      您可以使用多种工具将数据从 .csv 文件迁移到数据库,包括:

      注意:第一种和第三种解决方案要求您通过 jdbc 接口访问 .csv 文件。

      所有这些都将允许您在一定程度上调整迁移过程(例如批量大小),并且所有这些都假定您想要手动进行迁移,而不是通过运行 C# 代码(这会使事情变得有点复杂)。

      【讨论】:

      • 使用 SQL Workbench 时 WbCopy 是错误命令 WbImport 用于批量加载文本文件 无需通过 JDBC 读取 CSV 文件
      【解决方案4】:

      我对 FileHelpers (http://www.filehelpers.net/) 有很好的个人经验。

      【讨论】:

        【解决方案5】:
        public void LoadCheckFiletoDatabase(string checkFilePath)
                {
                    DataTable tempTable = GetDataTableFromCsv(checkFilePath);
        
                    foreach (DataRow DataR in this.memDataTable.Columns)
                    {
                        Dictionary<string, object> Dic = new Dictionary<string, object>();
                        foreach (DataColumn DataCol in this.memDataTable.Columns)
                        {
                            string field = DataCol.ColumnName.ToString();
                            object value = (string)DataR[DataCol].ToString();
                            Dic.Add(field, value);                   
                        }
                        using (SQLiteConnection sQLiteConnection = new SQLiteConnection("data source=" + databasepath))
                        {
        
                             using (SQLiteCommand sQLiteCommand = new SQLiteCommand(sQLiteConnection))
                             {
                                System.Data.SQLite.SQLiteHelper sQLiteHelper = new SQLiteHelper(sQLiteCommand);
                                sQLiteHelper.BeginTransaction();
                                sQLiteHelper.Insert(tempTable.TableName, Dic);
                             }
                        }    
                    }
                public static DataTable GetDataTableFromCsv(string path)
                {
                    string pathOnly = Path.GetDirectoryName(path);
                    string fileName = Path.GetFileName(path);
        
                    string sql = @"SELECT * FROM [" + fileName + "]";
        
                    using(OleDbConnection connection = new OleDbConnection(
                              @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
                              ";Extended Properties=\"Text;HDR=" + "Yes" + "\""))
                    using(OleDbCommand command = new OleDbCommand(sql, connection))
                    using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                    {
                        DataTable dataTable = new DataTable();
                        dataTable.Locale = CultureInfo.CurrentCulture;
                        adapter.Fill(dataTable);
                        dataTable.TableName = fileName.TrimEnd(new char[] {'.','c','s','v'});
                        return dataTable;
                    }            
                }
        

        【讨论】:

        • 不鼓励仅使用代码的答案。请添加说明。此外,可以通过在行前添加 4 个空格来格式化代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-15
        • 2012-03-31
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多