如何将CSV文件批量插入SQLite C#

时间:2010-04-22 08:01:20

标签: c# database sqlite csv bulkinsert

我见过类似的问题(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中......非常感谢您的帮助!

5 个答案:

答案 0 :(得分:2)

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

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

所有这些都允许您在某种程度上调整迁移过程(例如批量大小),并且所有这些都假设您希望手动进行迁移,而不是运行C#代码(这会使事情复杂化)。

答案 1 :(得分:1)

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

  

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

解决问题的最后部分:

  

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

鉴于,您需要从CSV文件中将几千(或一百万个)的记录导入sqlite,
没有通过select或insert命令直接支持csv数据导入时,迭代逐行读取&amp;插入不具备性能然后一个实际的替代方案是使用“sqlite?.exe”&amp;通过shell执行的import命令从你的c#代码执行。

<强> loadcsvtosqlite.cs

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

<强> loadcsvtosqlite.bat

sqlite3.exe "db name" < loadcsv.sql

<强> loadcsv.sql

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

答案 4 :(得分:0)

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;
        }            
    }