文件中数据的格式
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_材料ID(2010_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);
}
}