Импорт данных из файла .csv в таблицу Sqlite в Qt

#sql #sqlite #qt #csv #import

#sql #sqlite #qt #csv #импорт

Вопрос:

Я могу заставить свое приложение загружать 3 .csv-файла с защищенного FTP с помощью примера загрузки Qt Network, создать локальную базу данных Sqlite вместе с 3 таблицами, которые в конечном итоге будут содержать информацию, содержащуюся в файлах csv.

Следующее взято из публикации в блоге об импорте csv-файлов в Qt, и инструкции вставки вывода кажутся правильными, но данные, похоже, не попадают в таблицу.

     void speciesinformation::populateTable()
{
    QFile f("species_list_dos_utf8.csv");

    if(f.open (QIODevice::ReadOnly| QIODevice::Text)){
        QSqlQuery que;
        QTextStream ts (amp;f);

        //Travel through the csv file
        while(!ts.atEnd()){
            QString req = "INSERT INTO species_list VALUES (";
            // split every line
            QStringList line = ts.readLine().split('n');

            /*for every values on a line,
                   append it to the INSERT request*/
            for(int i=0; i<line .length ();  i){
                req.append(line.at(i));
                req.append(",");
            }
            req.chop(1); // remove the trailing comma
            req.append(");"); // close the "VALUES([...]" with a ");"
            que.exec(req);
            qDebug() << req;
        }
    }
}
 

и вывод гласит:

«ВСТАВИТЬ В ЗНАЧЕНИЯ species_list (Многолетний черноплодник, Сложноцветные, Астра, Сончус, 361, Растения, арвенсис, Травы);» «ВСТАВИТЬ В ЗНАЧЕНИЯ species_list (Колючая олива, элеутерококк, Олеастр, Элеагнус, 363, Растения, остролистные, Кустарники); » … и т. д

Когда я открываю DBBrowser (Sqlite), чтобы просмотреть базу данных, в таблице species_list ничего не появляется. У меня есть создание базы данных и создание таблицы в отдельных функциях в моем .cpp.

У меня есть другая тестовая функция (ниже), но я получаю сообщение об ошибке QSqlQuery::value: не помещено в допустимую запись.

 void speciesinformation::populateSpeciesTable()
{
    //open file
    QFile fspecies("species_list_dos_utf8.csv");
    if (!fspecies.open(QIODevice::ReadOnly)) {
        qDebug() << fspecies.errorString();
    }

    QStringList wordList;
    while (!fspecies.atEnd()) {
        QByteArray fields = fspecies.readAll();
        wordList.append(fields.split(',').first());
    }
    qDebug() << wordList;

    QSqlQuery popSpecies;
    popSpecies.prepare("INSERT INTO species_list(cname, family, fdetail, genus, id, kingdom, species, habit) values(:one, :two, :three, :four, :five, :six, :seven, :eight)");
    popSpecies.bindValue(":one",popSpecies.value(0).toChar());
    popSpecies.bindValue(":two",popSpecies.value(1).toChar());
    popSpecies.bindValue(":three",popSpecies.value(2).toChar());
    popSpecies.bindValue(":four",popSpecies.value(3).toChar());
    popSpecies.bindValue(":five",popSpecies.value(4).toChar());
    popSpecies.bindValue(":six",popSpecies.value(5).toChar());
    popSpecies.bindValue(":seven",popSpecies.value(6).toChar());
    popSpecies.bindValue(":eight",popSpecies.value(7).toChar());


    if(!popSpecies.exec())
    {
        qDebug()<< popSpecies.lastError().text();
    }
}
 

Я прочитал документацию Qt и другие форумы, но, похоже, я не могу скопировать данные из файлов csv в таблицы Sqlite. Любые примеры или помощь будут высоко оценены.

Комментарии:

1. Какую ошибку вы получаете от запроса в первой части кода? .. когда вы это делаете INSERT INTO species_list VALUES( ..) .. вы уверены, что вставляете значения для всех столбцов? ошибка во второй части кода заключается в том, что вы привязываетесь к запросу из результата запроса ?! popSpecies.value(0) не должен отображаться в привязке запроса.. может быть, вы хотите что-то вроде popSpecies.bindValue(":one",wordList.at(0).toChar());

2. Привет, Мохаммад, спасибо за ваш ответ. В первой части я не получаю никаких сообщений об ошибках в выходных данных приложения — в нем просто перечислены все операторы insert для каждой строки.

3. Мохаммад, я просто хочу сказать, что ваш комментарий о разделе bindValue мне очень помог! В итоге я сосредоточился на том разделе, на который пытался его изменить, popSpecies.bindValue(":one",wordList.at(0).toChar()); но получал сообщение об ошибке, поэтому я изменил его на этот popSpecies.bindValue(":one",wordList.value(0).toUtf8()); , и он действительно помещает «cname» в мою таблицу базы данных! Похоже, что что-то может быть не так со списком слов, потому что, похоже, он считывает только слово «cname» из файла (которое является первым словом, которое появляется в файле).

4. Для первой части вам нужно явно проверить ошибку после выполнения запроса .. lastError() должен сказать, что пошло не так!

5. Понял — спасибо! Я опубликую комментарий здесь, если столкнусь с проблемой с ошибкой. Я, конечно, ценю ваше время.