将多个文本文件中的数据写到SqlLite中

来源:互联网 发布:撩妹 知乎 编辑:程序博客网 时间:2024/05/19 18:14

文件中数据的格式

2010_C0001        ㎏

2010_C0002        ㎏

2010_C0003        ㎏

2010_C0004        ㎏

2010_C0005        ㎏

2010_C0006        ㎏

2010_C0007        ㎏

2010_C0008        ㎏

2010_C0009        ㎏

2010_C0010        ㎏

...

 

privateQSqlDatabasem_db;

 

需要将1千万条的如上示格式的数据写入sqllite数据库中,文件中的数据格式是(定额库ID_材料ID单位),

数据文件存储在特定的目录下,存在多个数据文件,为txt格式。我们需要将定额库ID_材料ID与单位数据存储在

数据表中,定额库ID与对应的数据表表名存储在索引表中。

 

boolGCreateSqliteTable::createDB()

{

//初始化sqllite数据库,包括建库与建表

   initDB();

 

//文件名不为空

   if (!m_dirPath.isEmpty())

   {

       QStringList filesList;

 

//添加需要数据文件(过滤、添加)

       addSubFolderFiles(filesList,m_dirPath,QString("*.txt"));

 

       for (inti = 0;i < filesList.size();++i)

       {

           qDebug() << QString("read%1 datawrite toGUnitsDB").arg(filesList.at(i));

           QFile file(filesList.at(i));

 

           if (!file.open(QIODevice::ReadOnly))

           {

               qDebug() << "Openfailed." << endl;

               return false;

           }

 

 //将数据导入数据表与索引表

           createTable(file);

           file.close();

           qDebug() << "writesuccess";

       }

 

   }

 

   qDebug() << "success--------------";

   return true;

}

 

新建两张表,一张索引表,字段名是定额库ID(例如2010)、新建的表名另一张表是具体

的数据表,包括定额库ID_材料ID2010_C0001),单位(kg,首先需要确定新建的数据表

个数,而后定额库ID %数据表个数将不同的定额库ID数据导入不同的数据表中。

 

voidGCreateSqliteTable::initDB()

{

   m_db =QSqlDatabase::addDatabase("QSQLITE");

   m_db.setDatabaseName("GUnitsDB");

 

   if (!m_db.open())

   {

       qDebug() << "Cannotopen database";

       return;

   }

 

   QSqlQuery query(m_db);

 

//创建索引表

   query.exec("createtable UnitTableIndex(idtext primarykey, tableNametext)");

 

   for (inti = 0;i < c_tableCount;++i)

   {

//根据索引表创建数据表

       query.exec(QString("createtableUnitTable%1(codetextprimarykey,unit  text)").arg(i));

   }

}

 

导数据进数据库过程。注意文件数据的读取方式。

voidGCreateSqliteTable::createTable(QFile&file)

{

   if (!m_db.isOpen())

   {

       qDebug() << "errorerror error";

   }

 

   QString lastTableName;

 

//开启事务

   m_db.transaction();

   while (!file.atEnd())

   {

       QTextStream txtOutput(file.readLine());

       QString sNorm;

       QString sUnit;

       txtOutput >> sNorm >> sUnit;

 

       QStringList slNorm(sNorm.split("_"));

       QString tableName = QString("UnitTable%1").arg(slNorm.first().toInt()% c_tableCount);

 

       QSqlQuery query(m_db);

       query.exec(QString("insertinto UnitTableIndex(id,tableName) values('%1','%2')")

                  .arg(slNorm.first())

                  .arg(tableName));

       query.exec(QString("insertinto %1(code,unit) values('%2','%3')")

                  .arg(tableName).arg(sNorm).arg(sUnit));

 

       if (lastTableName!= tableName)

       {

           m_db.commit();

           m_db.transaction();

           lastTableName =tableName;

       }

   }

//结束事务

   m_db.commit();

}

 

自动递归过滤文件。

voidGCreateSqliteTable::addSubFolderFiles(QStringList&fileList, QString&path, QString&filter)

{

   QDir dir(path);

 

   if (!dir.exists())

   {

       qDebug() << "notfind dirpath";

       return;

   }

 

   QStringList filters;

   filters << filter;

 

   QDirIterator dir_iterator(path, filters,

                             QDir::Files| QDir::NoSymLinks,

                             QDirIterator::Subdirectories);

 

   while (dir_iterator.hasNext())

   {

       dir_iterator.next();

       QFileInfo file_info = dir_iterator.fileInfo();

       QString file_path = file_info.absoluteFilePath();

       fileList.append(file_path);

   }

}

0 0
原创粉丝点击