如何在SQLite3 Shell中导入CSV时指定列类型并处理空值?
在SQLite3 Shell中优雅处理CSV导入的列类型和空白值
嘿,这个问题我之前折腾CSV导入的时候也碰到过!默认的.import命令确实省心,但全TEXT类型和空字符串的问题确实头疼。不过在SQLite Shell里完全有优雅的解决办法,咱们分两部分说:
一、预先指定列类型
最稳妥的方式是先手动创建好目标表,再导入CSV数据,这样就能精准控制每一列的类型:
先编写
CREATE TABLE语句定义列类型
比如你的CSV有id(整数)、price(浮点数)、create_date(日期)、note(文本)这几列,先建表:CREATE TABLE my_sqlite_table ( id INTEGER PRIMARY KEY, price REAL, create_date DATE, note TEXT );切换到CSV模式并导入(跳过表头行)
如果你的CSV第一行是表头,记得加上--skip 1参数避免把表头当成数据导入:.mode CSV .import --skip 1 my_table.csv my_sqlite_tableSQLite会自动尝试把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
相关产品推荐
相关产品推荐

