結果を厳密な純粋なCSV形式で標準出力に出力するプログラムを作成しました(すべての行は単一のレコードを表し、同じコンマ区切りフィールドのセットを含みます。フィールドには小文字の英字、数字、ドットのみが含まれ、スペースは含まれません。エスケープ/エンコードが必要になる可能性のある引用符や記号はありません。
この出力を完全に収まるSQLiteテーブルにリダイレクトするにはどうすればよいですか?
制約を破る(たとえば、すでにテーブルにあるレコードと同じ主キー/二次キーを持つ)ことで既存のレコードを置き換えるか、サイレントに破棄するかを制御できれば素晴らしいと思います。
もちろん、プログラム自体に直接SQLiteデータベース出力サポートを構築することもできますが、可能であればUNIXの方法を使用したいと思います。
承認された回答:
2つのアプローチ:
サンプル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
1 ) csvkitを使用 (CSVに変換して操作するための一連のコマンドラインツール)
sqlite3にインポートします データベース:
csvsql --db sqlite:///test_db --tables test_tbl --insert test.csv
入力csvファイルが指定されていない場合は、stdinからのcsvデータを受け入れます:
... | csvsql --db sqlite:///test_db --tables test_tbl --insert
sqliteからデータを抽出するには データベース:
sql2csv --db sqlite:///test_db --query 'select * from test_tbl limit 3'
出力:
GroupName,Groupcode,GroupOwner,GroupCategoryID
System Administrators,sysadmin,13456,100
Independence High Teachers,HS Teachers,,101
John Glenn Middle Teachers,MS Teachers,13458,102
2 ) sqlite3を使用 コマンドラインツール(ユーザーが SQLiteに対してSQLステートメントを手動で入力して実行できるようにします データベース)
「
.import
」を使用します 」コマンドを使用して、CSV(カンマ区切り値)データを
SQLiteテーブルにインポートします。 「.import
」コマンドは2つの引数を取ります。これらは、
CSVデータが読み取られるディスクファイルの名前と、
CSVデータが挿入されるSQLiteテーブルの名前です。
「
.import
」を実行する前に、「mode」を「csv」に設定することが重要であることに注意してください。
" 指図。これは、コマンドラインシェルが入力ファイルのテキストを他の
形式として解釈しようとするのを防ぐために必要です。
$ 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>