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

如何在SQLite3 Shell中导入CSV时指定列类型并处理空值?

在SQLite3 Shell中优雅处理CSV导入的列类型和空白值

嘿,这个问题我之前折腾CSV导入的时候也碰到过!默认的.import命令确实省心,但全TEXT类型和空字符串的问题确实头疼。不过在SQLite Shell里完全有优雅的解决办法,咱们分两部分说:

一、预先指定列类型

最稳妥的方式是先手动创建好目标表,再导入CSV数据,这样就能精准控制每一列的类型:

  1. 先编写CREATE TABLE语句定义列类型
    比如你的CSV有id(整数)、price(浮点数)、create_date(日期)、note(文本)这几列,先建表:

    CREATE TABLE my_sqlite_table (
        id INTEGER PRIMARY KEY,
        price REAL,
        create_date DATE,
        note TEXT
    );
    
  2. 切换到CSV模式并导入(跳过表头行)
    如果你的CSV第一行是表头,记得加上--skip 1参数避免把表头当成数据导入:

    .mode CSV
    .import --skip 1 my_table.csv my_sqlite_table
    

    SQLite会自动尝试把CSV中的值转换为你定义的列类型,比如数字字符串转成INTEGER/REAL,日期字符串会按DATE类型的规则处理。

二、将空白值替换为NULL

默认情况下,CSV里的空字段(比如,,)会被导入为空字符串'',要转成SQLite的NULL,有两种实用方式:

方式1:导入后批量更新

如果数据量不大,直接用NULLIF函数批量替换指定列的空字符串:

UPDATE my_sqlite_table
SET
    price = NULLIF(price, ''),
    create_date = NULLIF(create_date, '')
WHERE price = '' OR create_date = '';

如果空白值还包含空格(比如' '),可以加上TRIM函数处理:

UPDATE my_sqlite_table
SET price = NULLIF(TRIM(price), '')
WHERE TRIM(price) = '';

方式2:用临时表过渡(更灵活高效)

如果需要同时处理类型转换和空值替换,或者数据量较大,用临时表中转是更优雅的选择:

-- 1. 创建临时表接收原始CSV数据(全TEXT类型)
CREATE TEMP TABLE temp_import (
    id TEXT,
    price TEXT,
    create_date TEXT,
    note TEXT
);

-- 2. 导入CSV到临时表
.mode CSV
.import --skip 1 my_table.csv temp_import

-- 3. 插入到正式表,同时完成类型转换和空值替换
INSERT INTO my_sqlite_table (id, price, create_date, note)
SELECT
    CAST(id AS INTEGER),
    -- 去除空格后判断为空则设为NULL,否则转成REAL
    CASE WHEN TRIM(price) = '' THEN NULL ELSE CAST(price AS REAL) END,
    -- 日期字段同理,还能顺便做格式转换
    CASE WHEN TRIM(create_date) = '' THEN NULL ELSE DATE(create_date) END,
    note
FROM temp_import;

-- 4. 清理临时表(可选)
DROP TABLE temp_import;

这种方式能处理各种复杂场景,比如带格式的日期转换、特殊字符的空白值等,全程在Shell里就能完成,不用依赖外部工具。


内容的提问来源于stack exchange,提问作者filtertips

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:10:57