SQLite 命令“.import”如何直接从标准输入读取?

Der*_*har 3 bash io-redirection shell-script csv sqlite

您将如何修改函数csv_to_sqlite以便sqlite3命令.import直接从标准输入而不是从临时命名管道读取?

#!/bin/bash

function csv_to_sqlite() {
  local database_file_name="$1"
  local table_name="$2"
  local temp_input_fifo=$(mktemp -u)
  mkfifo $temp_input_fifo
  sqlite3 -csv $database_file_name ".import $temp_input_fifo $table_name" &
  cat > $temp_input_fifo
  rm $temp_input_fifo
}

database_file_name=$1
table_name=$2

csv_to_sqlite "$database_file_name" "$table_name"
Run Code Online (Sandbox Code Playgroud)
$ printf "col1,col2,col3\na,1,2.6\nb,2,5.4\n" | ./csv_to_sqlite test.sqlite test
$ sqlite3 -csv -header test.sqlite "SELECT * FROM test"
col1,col2,col3
a,1,2.6
b,2,5.4
Run Code Online (Sandbox Code Playgroud)

Der*_*har 5

我找到了另一个仍然使用的解决方案,但它不读取或临时命名管道。相反,它与管道操作符一起调用以直接从标准输入读取。sqlite3 .import/dev/stdin.importcat -

#!/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)

  • @ilkkachu 这个解决方案并不明显,因为不幸的是,[`.import`](https://sqlite.org/cli.html#importing_csv_files) 文档没有提到 `|` 运算符。正如您所发现的,您必须阅读 [`.read`](https://www.sqlite.org/cli.html#reading_sql_from_a_file) 文档才能发现 `|` 运算符。 (2认同)
  • @kevinarpe 一位 SQLite 贡献者于 2021 年 4 月 1 日在“.import”命令的文档中添加了对管道字符的引用,就在我和 @ikkachu 发表评论几天后。请参阅 https://www.sqlite.org/cgi/docsrc/info/7652db76ff667908。 (2认同)