Как массово вставить CSV-файл в SQLite C # - PullRequest
4 голосов
/ 22 апреля 2010

Я видел похожие вопросы ( 1 , 2 ), но ни один из них не обсуждал, как вставить файлы CSV в SQLite. Единственное, о чем я мог подумать, это использовать CSVDataAdapter и заполнить SQLiteDataSet, а затем SQLiteDataSet для обновления таблиц в базе данных:

Единственный обнаруженный мной DataAdapter для 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/
CSVDataAdapter должен был поставляться с SDF OpenNetCF , но, похоже, он больше не доступен.

Кто-нибудь знает, где я могу получить CSVDataAdapter? Возможно, кто-то знает гораздо более простую вещь: как делать массовые вставки CSV-файлов в SQLite ... Ваша помощь будет принята с благодарностью!

Ответы [ 5 ]

2 голосов
/ 22 апреля 2010

Вы можете использовать любой из нескольких инструментов для переноса данных из CSV-файла в базу данных, в том числе:

Примечание: первое и третье решение требуют доступа к файлу .csv через интерфейс jdbc.

Все это позволит вам в некоторой степени настроить процесс миграции (например, размер пакета), и все они предполагают, что вы хотите выполнить миграцию вручную, а не запускать код C # (что немного усложнит).

1 голос
/ 01 марта 2016

Обращаясь к последней части вашего вопроса:

Возможно, кто-то знает гораздо более простую вещь: как делать массовые вставки файлов CSV в SQLite ...

Учитывая , вам нужно импортировать несколько тысяч (или миллиард капр) записей в sqlite из файла CSV,
Когда нет прямой поддержки импорта данных CSV с помощью команд выбора или вставки,
И итеративное чтение и вставка строк за строкой не выполняется
Тогда практическая альтернатива - использовать «sqlite? .Exe» и команду импорта через оболочку выполнить из вашего кода 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>
1 голос
/ 22 апреля 2010

У меня хороший личный опыт работы с FileHelpers (http://www.filehelpers.net/).

1 голос
/ 22 апреля 2010

попробуйте это - Импорт / Экспорт CSV из SQLite из кода C #

вы можете создать файл OleDbConnection to CSV (просто Google, это очень просто), затем загрузить строки в DataSet, а затем поместить этот набор данных в Sqlite с помощью SqliteConnection. Несколько строк кода.

0 голосов
/ 27 февраля 2015

public void LoadCheckFiletoDatabase (строка 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;
        }            
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...