如何将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; } }