himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

【macOS】【続】PowerShell から SQLite を使うための備忘録・補遺【.import】

.import で CSV ファイルを扱う話の続き…

何度も書いたように、SQLite 内部では CSV 形式では格納されていないため、CSV 形式でやりとりするためには、.separator で区切り文字を切り替えるか、SQLite 外部で CSV 形式に変換する必要がある。
実は、.separator の他に、.mode csv でも同様の指定ができる。
.mode csv も .separator と同様に、セッション中有効なので、複数行のステートメントでコマンドを渡せば、.mode 以降のステートメントでは、CSV 形式が適用(mode)されて入出力ができる。

そこで、.separator と .mode による切り替えが全く同様なのか検証してみた。

まず .separator '|'

PS /Users/hoge/devPwsh> @"
>> DELETE FROM Proverb;
>> .separator ,
>> .import ./Proverb.csv --skip 1 Proverb      
>> SELECT * FROM Proverb;
>> "@ | sqlite3 ./Proverb.db $_
1,厩戸皇子,以和爲貴
2,釈迦,天上天下唯我独尊
3,孔子,有朋自遠方来不亦楽乎
4,杜甫,国破山河在
PS /Users/hoge/devPwsh>

次に .mode csv

PS /Users/hoge/devPwsh> @"
>> DELETE FROM Proverb;
>> .mode csv   
>> .import ./Proverb.csv --skip 1 Proverb      
>> SELECT * FROM Proverb;
>> "@ | sqlite3 ./Proverb.db $_
1,"厩戸皇子","以和爲貴"
2,"釈迦","天上天下唯我独尊"
3,"孔子","有朋自遠方来不亦楽乎"
4,"杜甫","国破山河在"
PS /Users/hoge/devPwsh>

そしてて SQLite デフォルト形式を convertfrom-csv と convertto-csv で変換した場合。

PS /Users/hoge/devPwsh> @"
>> DELETE FROM Proverb;
>> .import ./Proverb.csv --csv --skip 1 Proverb
>> SELECT * FROM Proverb;
>> "@ | sqlite3 ./Proverb.db $_ | convertfrom-csv -delimiter '|' | convertto-csv
"1","厩戸皇子","以和爲貴"
"2","釈迦","天上天下唯我独尊"
"3","孔子","有朋自遠方来不亦楽乎"
"4","杜甫","国破山河在"
PS /Users/hoge/devPwsh>

このように、文字列については double-quote で囲われる方が望ましいので .separator は避けるべきかもしれない。
また、Powershell で読み込むのではなく、一旦 CSV ファイルとして結果を格納したいのなら、convertfrom-csv と convertto-csv 経由だと数値データも double-quote で囲われるため、使い方に留意すべきだろう。

何にせよ .separator も .mode も、convertfrom-csv と convertto-csv で変換してしまえば、結果は同一。

PS /Users/hoge/devPwsh> @"
>> DELETE FROM Proverb;
>> .separator ,
>> .import ./Proverb.csv --skip 1 Proverb
>> SELECT * FROM Proverb;
>> "@ | sqlite3 ./Proverb.db $_| convertfrom-csv | convertto-csv 
"1","厩戸皇子","以和爲貴"
"2","釈迦","天上天下唯我独尊"
"3","孔子","有朋自遠方来不亦楽乎"
"4","杜甫","国破山河在"
PS /Users/hoge/devPwsh>
PS /Users/hoge/devPwsh> @"
>> DELETE FROM Proverb;
>> .mode csv
>> .import ./Proverb.csv --skip 1 Proverb
>> SELECT * FROM Proverb;
>> "@ | sqlite3 ./Proverb.db $_ | convertfrom-csv | convertto-csv 
"1","厩戸皇子","以和爲貴"
"2","釈迦","天上天下唯我独尊"
"3","孔子","有朋自遠方来不亦楽乎"
"4","杜甫","国破山河在"
PS /Users/hoge/devPwsh>