Iva*_*van 5 shell pipe csv sqlite csv-simple
我编写了一个程序,以严格的纯 CSV 格式将结果输出到标准输出(每行代表一条记录并包含相同的逗号分隔字段集,字段仅包含小写英文字母、数字和点,没有空格,没有引号,也没有可能需要转义/编码的符号)。
如何将此输出重定向到它完全适合的 SQLite 表中?
如果我可以控制是否想要打破约束(例如,与表中已有的记录具有相同的主/副键)替换现有记录或被静默丢弃,那就太好了。
当然,我可能会在程序本身中构建直接的 SQLite 数据库输出支持,但如果可能的话,我更愿意采用 unix 方式。
我找到了一个更简单的解决方案,仍然使用,但不读取或临时命名管道。相反,它与管道运算符一起使用来调用以直接从标准输入读取。sqlite3
.import
/dev/stdin
.import
cat -
#!/bin/bash
function csv_to_sqlite() {
local database_file_name="$1"
local table_name="$2"
sqlite3 -csv $database_file_name ".import '|cat -' $table_name"
}
database_file_name=$1
table_name=$2
csv_to_sqlite "$database_file_name" "$table_name"
Run Code Online (Sandbox Code Playgroud)
请注意,这在 Windows 命令 shell 中不起作用。
两种方法:
样本test.csv
文件:
GroupName,Groupcode,GroupOwner,GroupCategoryID
System Administrators,sysadmin,13456,100
Independence High Teachers,HS Teachers,,101
John Glenn Middle Teachers,MS Teachers,13458,102
Liberty Elementary Teachers,Elem Teachers,13559,103
1st Grade Teachers,1stgrade,,104
2nd Grade Teachers,2nsgrade,13561,105
3rd Grade Teachers,3rdgrade,13562,106
Guidance Department,guidance,,107
Run Code Online (Sandbox Code Playgroud)
1 ) 使用csvkit(一套用于转换和使用 CSV 的命令行工具)
导入sqlite3数据库:
csvsql --db sqlite:///test_db --tables test_tbl --insert test.csv
Run Code Online (Sandbox Code Playgroud)
如果未指定输入 csv 文件,它将接受来自 stdin 的 csv 数据:
... | csvsql --db sqlite:///test_db --tables test_tbl --insert
Run Code Online (Sandbox Code Playgroud)
从sqlite数据库中提取数据:
sql2csv --db sqlite:///test_db --query 'select * from test_tbl limit 3'
Run Code Online (Sandbox Code Playgroud)
输出:
GroupName,Groupcode,GroupOwner,GroupCategoryID
System Administrators,sysadmin,13456,100
Independence High Teachers,HS Teachers,,101
John Glenn Middle Teachers,MS Teachers,13458,102
Run Code Online (Sandbox Code Playgroud)
2)使用sqlite3命令行工具(允许用户手动输入并针对SQLite数据库执行SQL语句)
使用“
.import
”命令将 CSV(逗号分隔值)数据导入到 SQLite 表中。“.import
”命令有两个参数,分别是要从中读取 CSV 数据的磁盘文件的名称和要向其中插入 CSV 数据的 SQLite 表的名称。请注意,在运行“ ”命令之前将“模式”设置为“csv”非常重要
.import
。这对于防止命令行 shell 尝试将输入文件文本解释为其他格式是必要的。
$ sqlite3
sqlite> .mode csv
sqlite> .import test.csv test_tbl
sqlite> select GroupName,Groupcode from test_tbl limit 5;
"System Administrators",sysadmin
"Independence High Teachers","HS Teachers"
"John Glenn Middle Teachers","MS Teachers"
"Liberty Elementary Teachers","Elem Teachers"
"1st Grade Teachers",1stgrade
sqlite>
Run Code Online (Sandbox Code Playgroud)