109691180 发表于 2026-6-3 15:14:42

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]
查看完整版本: CSV文件