代码之家  ›  专栏  ›  技术社区  ›  Kiril

如何将csv文件大容量插入sqlite c#

  •  4
  • Kiril  · 技术社区  · 14 年前

    我也见过类似的问题( 1 , 2 ,但没有人讨论如何将csv文件插入sqlite。我唯一能想到的就是用 CSVDataAdapter 填满 SQLiteDataSet ,然后使用 sqlitedataset 要更新数据库中的表,请执行以下操作:

    我找到的csv文件的唯一数据适配器实际上不可用:

    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/
    这个 CSV数据适配器 本来应该一起去的 OpenNetCF's SDF ,但它似乎不再可用。

    有人知道我在哪能买到 CSV数据适配器 ?也许有人知道更简单的事情:如何将csv文件批量插入sqlite…非常感谢您的帮助!

    5 回复  |  直到 6 年前
        1
  •  1
  •   Polynomial    6 年前

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

    您可以创建OLEDBConnection到CSV文件(只需google,这很容易),然后将行加载到数据集,然后通过sqliteconnection将该数据集放入sqlite。几行代码。

        2
  •  2
  •   Tomislav Nakic-Alfirevic    14 年前

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

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

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

        3
  •  1
  •   Marcos Meli    9 年前

    我对档案管理员有很好的个人经验( http://www.filehelpers.net/ )

        4
  •  1
  •   RadicalFish    8 年前

    回答问题的最后一部分:

    也许有人知道更简单的事情:如何进行批量插入 将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
    

    Load CCSV.SQL

    drop table if exists <table name>;
    create table <table name> (field1 datatype, field2 datatype ....);
    .separator ","
    .import <csv file name> <table name>
    
        5
  •  0
  •   Sean Miller    9 年前

    public void loadcheckfiletodatabase(字符串checkfilepath) { datatable tentable=getdatatablefromscsv(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;
            }            
        }