2017-09-25 65 views
0

如果我有一些示例數據,我該如何將它放入SQLite(最好是完全自動化的)?如何將JSON文件轉換爲SQLite數據庫

{"uri":"/","user_agent":"example1"} 
{"uri":"/foobar","user_agent":"example1"} 
{"uri":"/","user_agent":"example2"} 
{"uri":"/foobar","user_agent":"example3"} 
+0

自問自答:

全部放在一起

asciinema記錄在那裏? – lad2025

+0

回答你自己的問題沒有錯,只要它對別人有價值。這是一個寫得很好的答案。但是這其中只有兩個問題,通過回答的兩個部分來表現非常明顯,因此應該單獨發佈。但後來可能有重複... – glennsl

+0

@glennsl我對如何完成任務有一個模糊的想法,但是先查找它並沒有看到任何結果,所以我解決了它,並認爲這將是很好的填補SO知識庫中的空白空間。 – benaryorg

回答

0

我發現這樣做最簡單的方法是使用jq和CSV作爲中介格式。

取得CSV

首先將您的數據寫入文件。 我會在這裏假設data.json

然後構建使用jq頭:

% head -1 data.json | jq -r 'keys | @csv' 
"uri","user_agent" 

head -1是因爲我們只想要一條線。 jq-r使輸出成爲一個純字符串,而不是包裝CSV的JSON-String。 然後,我們調用內部函數keys以將輸入的鍵作爲數組獲取。 我們發送給@csv格式化程序,它輸出帶有CSV格式標題的單個字符串。

然後我們需要構造數據。

% jq -r '[.[]] | @csv' < data.json 
"/","example1" 
"/foobar","example1" 
"/","example2" 
"/foobar","example3" 

我們現在把整個輸入和解構使用.[]關聯數組(圖),然後把它放回一個簡單的數組[…]。 這基本上將我們的字典轉換爲一個鍵數組。 發送到@csv格式化程序,我們再次獲取一些CSV。

全部放在一起,我們的形式得到一個單一的一行代碼:

% (head -1 data.json | jq -r 'keys | @csv' && jq -r '[.[]] | @csv' < data.json) > data.csv 

如果您需要將數據轉換上的蒼蠅,即沒有一個文件,試試這個:

% cat data.json | (read -r first && jq -r '(keys | @csv),([.[]] | @csv)' <<<"${first}" && jq -r '[.[]] | @csv') 

加載到SQLite的

打開一個SQLite數據庫:

sqlite3 somedb.sqlite 

現在在交互shell執行以下操作(假設你寫的CSV到data.csv並希望它在一個名爲my_table表):

.mode csv 
.import data.csv my_table 

現在關閉外殼,然後再次打開它了乾淨的環境。 您現在可以輕鬆地從數據庫中SELECT中做任何你想做的事情。同時

asciicast

相關問題