You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:15:04