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

文件中数据的格式

2010_C0001        ㎏

2010_C0002        ㎏

2010_C0003        ㎏

2010_C0004        ㎏

2010_C0005        ㎏

2010_C0006        ㎏

2010_C0007        ㎏

2010_C0008        ㎏

2010_C0009        ㎏

2010_C0010        ㎏

...

 

private QSqlDatabase m_db;

 

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

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

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

 

bool GCreateSqliteTable::createDB()

{

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

    initDB();

 

//文件名不为空

    if (!m_dirPath.isEmpty())

    {

        QStringList filesList;

 

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

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

 

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

        {

            qDebug() << QString("read %1 data write to GUnitsDB").arg(filesList.at(i));

            QFile file(filesList.at(i));

 

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

            {

                qDebug() << "Open failed." << endl;

                return false;

            }

 

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

            createTable(file);

            file.close();

            qDebug() << "write success";

        }

 

    }

 

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

    return true;

}

 

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

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

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

 

void GCreateSqliteTable::initDB()

{

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

    m_db.setDatabaseName("GUnitsDB");

 

    if (!m_db.open())

    {

        qDebug() << "Cannot open database";

        return;

    }

 

    QSqlQuery query(m_db);

 

//创建索引表

    query.exec("create table UnitTableIndex(id text primary key, tableName text)");

 

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

    {

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

        query.exec(QString("create table UnitTable%1(code text primary key, unit   text)").arg(i));

    }

}

 

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

void GCreateSqliteTable::createTable(QFile &file)

{

    if (!m_db.isOpen())

    {

        qDebug() << "error error 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("insert into UnitTableIndex(id, tableName) values('%1','%2')")

                   .arg(slNorm.first())

                   .arg(tableName));

        query.exec(QString("insert into %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();

}

 

自动递归过滤文件。

void GCreateSqliteTable::addSubFolderFiles(QStringList &fileList, QString &path, QString &filter)

{

    QDir dir(path);

 

    if (!dir.exists())

    {

        qDebug() << "not find 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值