CSV文件
本帖最后由 109691180 于 2026-6-4 08:01 编辑返回文本 + 结果节点2.取所有文本 () + "\t,"// 身份证需要
<火山程序 类型 = "通常" 版本 = 1 />
方法 写出CSV文件 <公开>
参数 待写出文本 <类型 = 文本型>
参数 写到文件名 <类型 = 文本型>
{
变量 BOM头 <类型 = 字节集类>
变量 正文字节 <类型 = 字节集类>
变量 SQL写到文件名 <类型 = 文本型>
BOM头 = 字节集类.创建字节集 (0xEF, 0xBB, 0xBF)
// 2、文本以UTF8无BOM转为字节集
字节集类.添加字节集 (BOM头, 文本到UTF8 (待写出文本))
// 3、拼接BOM+正文
字节集类.添加字节集 (BOM头, 正文字节)
// 4、整体写入文件
字节集类.写字节集到文件 (BOM头, 写到文件名, -1)
}
<火山程序 类型 = "通常" 版本 = 1 />
方法 写出db文件批量 <折叠>
参数 csv文本 <类型 = 文本型>
参数 db保存路径 <类型 = 文本型>
{
变量 SQL数据库 <类型 = SQLite数据库类>
变量 错误内容 <类型 = 文本型>
变量 新DB路径 <类型 = 文本型>
变量 行数组 <类型 = 文本数组类>
变量 列数组 <类型 = 文本数组类>
变量 表头数组 <类型 = 文本数组类>
变量 i <类型 = 整数>
变量 成功数 <类型 = 整数 值 = 0>
变量 列总数 <类型 = 整数>
变量 k <类型 = 整数>
变量 批量SQL <类型 = 文本型>
变量 单值 <类型 = 文本型>
变量 建表SQL <类型 = 文本型>
常量 每批行数 <值 = 600>
删除文件 (db保存路径)
如果 (SQL数据库.打开 (db保存路径, 位或 (SQLite打开方式.读写打开, SQLite打开方式.新建打开)) == 假)
{
调试信息框 ("数据库打开失败")
返回
}
分割子文本 (csv文本, "\r\n", 行数组, 假, 假)
如果 (行数组.取成员数 () <= 1)
{
调试信息框 ("CSV没有有效数据")
SQL数据库.关闭 ()
返回
}
// 处理表头
分割子文本 (行数组.取成员 (0), ",", 表头数组, 假, 假)
列总数 = 表头数组.取成员数 ()
建表SQL = "CREATE TABLE IF NOT EXISTS 目标表("
表头数组.枚举循环 ()
{
k = 表头数组.取枚举索引 ()
如果 (k > 0)
{
建表SQL = 建表SQL + ","
}
单值 = 表头数组.取枚举值 ()
// 简单清理列名中的潜在问题字符,如引号、反引号等,以防 SQL 语法错误
子文本替换 (单值, "'", "''", 0, -1, 真)
子文本替换 (单值, "`", "", 0, -1, 真)// 移除反引号
子文本替换 (单值, "\"", "", 0, -1, 真)// 移除双引号
// 全部字段TEXT,身份证强制文本存储
建表SQL = 建表SQL + "`" + 单值 + "` TEXT"
}
建表SQL = 建表SQL + ");"
如果 (SQL数据库.执行SQL语句 (建表SQL, 错误内容) != SQLite执行结果.成功)
{
调试信息框 ("建表异常:" + 错误内容)
SQL数据库.关闭 ()// 建表失败,应关闭数据库
返回
}
// 初始化批量SQL
批量SQL = "INSERT INTO 目标表 VALUES"
行数组.枚举循环 ()
{
i = 行数组.取枚举索引 ()
变量 单行内容 <类型 = 文本型>
单行内容 = 行数组.取枚举值 ()
// 跳过表头行 (索引为 0)
// 检查数据行是否为空
如果 (i != 0 && 单行内容 != "")
{
分割子文本 (单行内容, ",", 列数组, 假, 假)
如果 (列数组.取成员数 () == 列总数)
{
// 添加值分隔符(如果不是第一批的第一个值)
如果 (成功数 > 0)// 如果已经处理过至少一行数据
{
批量SQL = 批量SQL + ","
}
批量SQL = 批量SQL + "("// 开始一个值组
列数组.枚举循环 ()
{
k = 列数组.取枚举索引 ()
单值 = 列数组.取枚举值 ()
删自身首尾空 (单值) // 去除CSV自带前后双引号
如果 (取文本左边 (单值, 1) == "\"" && 取文本右边 (单值, 1) == "\"")
{
单值 = 取文本中间 (单值, 2, 取文本长度 (单值) - 2)
}
// SQL单引号转义
子文本替换 (单值, "'", "''", 0, -1, 真)
删自身首尾空 (单值)
// 添加字段值分隔符(如果不是该行第一个值)
如果 (k > 0)
{
批量SQL = 批量SQL + ","
}
// 单引号包裹,身份证永久文本不丢数字
批量SQL = 批量SQL + "'" + 单值 + "'"
}
批量SQL = 批量SQL + ")"// 结束一个值组
成功数 = 成功数 + 1// 计数加一
// 检查是否达到批次大小,如果是则执行SQL
如果 (成功数 % 每批行数 == 0)// 当前处理的总行数刚好是每批行数的整数倍
{
批量SQL = 批量SQL + ";"// 完成SQL语句
如果 (SQL数据库.执行SQL语句 (批量SQL, 错误内容) != SQLite执行结果.成功)
{
调试信息框 ("批量写入出错:" + 错误内容)
调试输出 (批量SQL)// 输出有问题的SQL以便调试
SQL数据库.关闭 ()// 出错时关闭数据库
返回// 停止导入
}
调试输出 ("已批量写入 " + 到文本 (成功数) + " 条记录")// 可选:显示进度
// 重置批量SQL,准备下一批
批量SQL = "INSERT INTO 目标表 VALUES"
}
}
// else 可以添加日志,表示某行列数不匹配
}
// continue 循环继续到下一个元素,不需要显式 break || continue(除非有条件)
}
// 循环结束,上面的 '跳出循环' 已被移除
// 循环结束后,处理可能剩余的不足一批的数据
如果 (批量SQL != "INSERT INTO 目标表 VALUES")// 检查是否有待提交的数据
{
批量SQL = 批量SQL + ";"// 完成最后的SQL语句
如果 (SQL数据库.执行SQL语句 (批量SQL, 错误内容) != SQLite执行结果.成功)
{
调试信息框 ("剩余数据写入异常:" + 错误内容)
调试输出 (批量SQL)// 输出有问题的SQL以便调试
}
否则
{
调试输出 ("已写入剩余数据")
}
}
调试输出 ("导入完毕:" + 到文本 (成功数) + " 条数据")
SQL数据库.关闭 ()
}
页:
[1]