シェルパイプラインを介してCSVデータをSQLiteテーブルに挿入するには?

シェルパイプラインを介してCSVデータをSQLiteテーブルに挿入するには?

私は厳密に純粋なCSV形式で結果をstdoutに出力するプログラムを書いています。 (各行はレコードを表し、同じカンマ区切りのフィールドセットを含み、フィールドには小文字の英語の文字、数字、およびドットのみが含まれ、スペースはなく、引用符もありません。エスケープ/エンコードする必要がある記号はありません。

この出力を完全にフィットするSQLiteテーブルにどのようにリダイレクトできますか?

制約に違反するか(たとえば、すでにテーブルにあるレコードと同じプライマリ/セカンダリキーを持つ)、既存のレコードを置き換えるか自動的に削除するかを制御できればよいでしょう。

もちろん、プログラム自体に直接SQLiteデータベース出力サポートを構築することもできますが、可能であればUNIXアプローチを好みます。

ベストアンサー1

それでも使用するより簡単な解決策を見つけました。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"

これは、Windowsコマンドシェルでは機能しません。

おすすめ記事