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

我见过类似的问题( 1,2 ),但没有一个讨论如何将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的SDF ,但它似乎不再可用了。

有谁知道我可以在哪里获得CSVDataAdapter ? 也许有人知道更简单的事情:如何将CSV文件批量插入到SQLite中……非常感谢您的帮助!

试试这个 – 从C#代码中导入/导出来自SQLite的CSV

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

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

  • SQL Workbench ,使用WbCopy命令
  • 一个ETL工具,如Pentaho Data Integration
  • DDLUtils

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

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

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

解决问题的最后部分:

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

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

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 ; create table 
(field1 datatype, field2 datatype ....); .separator "," .import

public void LoadCheckFiletoDatabase(string checkFilePath){DataTable tempTable = GetDataTableFromCsv(checkFilePath);

  foreach (DataRow DataR in this.memDataTable.Columns) { Dictionary Dic = new Dictionary(); 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; } }