如何在SQLite的C++接口中执行命令实现CSV文件导入数据库
C++ 实现CSV导入SQLite的方案
SQLite 命令行的 .import 指令是CLI内置的封装逻辑,C/C++ 核心接口没有直接对应的API,你可以通过以下两种方式实现完全一致的效果:
方案1:原生实现(无额外依赖,生产环境推荐)
实现逻辑和CLI的.import底层逻辑完全一致:先解析CSV,再批量插入到库中,代码示例如下:
#include <sqlite3.h> #include <fstream> #include <string> #include <vector> #include <sstream> // 简单CSV行拆分逻辑,如需处理带引号、含逗号的字段等复杂格式,可替换为专业CSV解析库 std::vector<std::string> split_csv(const std::string& line) { std::vector<std::string> res; std::stringstream ss(line); std::string field; while (std::getline(ss, field, ',')) { res.push_back(field); } return res; } int main() { sqlite3* db; // 打开数据库 int ret = sqlite3_open("db", &db); if (ret != SQLITE_OK) { sqlite3_close(db); return -1; } // 开启事务,大幅提升批量插入速度 sqlite3_exec(db, "BEGIN;", nullptr, nullptr, nullptr); // 预编译插入语句,?数量对应stats表的字段数量,可按需调整 const char* insert_sql = "INSERT INTO stats VALUES (?,?,?);"; sqlite3_stmt* stmt; ret = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, nullptr); if (ret != SQLITE_OK) { sqlite3_close(db); return -1; } std::ifstream csv("statistics.csv"); std::string line; // 若CSV第一行是表头,执行下面这行跳过表头,和CLI.import默认逻辑对齐 std::getline(csv, line); while (std::getline(csv, line)) { auto fields = split_csv(line); // 绑定参数,根据实际字段类型可替换为sqlite3_bind_int等接口 for (int i = 0; i < fields.size(); ++i) { sqlite3_bind_text(stmt, i+1, fields[i].c_str(), -1, SQLITE_STATIC); } sqlite3_step(stmt); sqlite3_reset(stmt); } // 提交事务 sqlite3_exec(db, "COMMIT;", nullptr, nullptr, nullptr); // 资源释放 sqlite3_finalize(stmt); sqlite3_close(db); return 0; }
编译时需要链接sqlite3库,示例编译指令:g++ import.cpp -o import -lsqlite3
方案2:调用系统CLI命令(快速实现,适合测试/非嵌入式场景)
如果你的环境已经安装了sqlite3命令行工具,可以直接调用系统命令执行导入,代码量最少,和你手动执行命令的效果完全一致:
#include <cstdlib> int main() { // 路径含空格时需给CSV路径加引号转义 system("sqlite3 db \".import statistics.csv stats\""); return 0; }
注意事项
- 导入前请确保
stats表的字段顺序、字段类型和CSV内容完全匹配,否则会出现导入失败/数据错位问题,和CLI.import的报错逻辑一致 - 原生实现时必须开启事务,否则单条插入的速度会比CLI导入慢几十到上百倍
内容的提问来源于stack exchange,提问作者mewlynnmagic
相关产品推荐
相关产品推荐

