将CSV导入Sqlite时省略列

Jac*_*b H 3 sql unix sqlite shell import-csv

我的问题很简单.想象一下,您在CSV中有以下数据:

Name, Age, Gender
Jake, 40, M
Bill, 17, M
Suzie, 21, F
Run Code Online (Sandbox Code Playgroud)

导入上述CSV时是否可以排除Age变量?我目前的方法是简单地使用cutshell命令.

更新

iluvcapra对小型CSV有很好的答案.但是,对于非常大的CSV,这种方法效率很低.例如,假设上面的CSV非常大,30Gb可以说.仅加载所有Age数据以立即删除是浪费时间.考虑到这一点,是否有更有效的方法将列子集加载到sqlite数据库?

我怀疑最好的选择是使用shell命令cut来剔除不必要的列.这种直觉是否正确?使用shell命令将CSV文件预处理成更多sqlite友好版本是否常见?

谢谢!

ilu*_*pra 6

使用age列创建一个临时表,然后使用INSERT ... SELECT将数据从临时表移动到主表中:

CREATE TEMP TABLE _csv_import (name text, age integer, gender text);
.separator ","
.import file.csv test

INSERT INTO names_genders (name, gender) SELECT name, gender
    FROM _csv_import WHERE 1;
DROP TABLE _csv_import;
Run Code Online (Sandbox Code Playgroud)

编辑:使用幻像年龄列更新到视图中:

CREATE VIEW names_ages_genders AS 
    SELECT (name, 0 AS age ,gender) FROM names_genders;
CREATE TRIGGER lose_age
    INSTEAD OF INSERT ON names_ages_genders
    BEGIN
        INSERT INTO names_genders (name, gender) 
            VALUES (NEW.name, NEW.gender)
    END;
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为的视图names_ages_genders,它会说每个人都是零岁,并且会默默地从任何INSERT调用它的语句中删除age字段.没测试过!(我实际上不确定.import可以导入视图.)

  • 谢谢!这对于我的例子来说非常好。然而,对于大型 CSV 文件(几 GB)来说,这是相当低效的。我不喜欢加载所有数据只是在加载后立即删除一些数据的想法。 (2认同)