一般概要
次の形式の `history.csv url' という CSV ファイルがあります。
<url>;<title>;2024-03-30T12:00:00;2024-03-30T12:00:00
(これ2024-03-30T12:00:00同じです)
目的は、sqlite3のQutebrowser履歴からこのURLを取得することです。
私がしたこと
事前リクエスト
まずQutebrowserを閉じました。
データベースを開く
私は走る:
sqlite3 ~/.local/share/qutebrowser/history.sqlite
新しいURLを追加
sqlite3シェルで次のことを行いました。
.mode csv
.separator ';'
.import urls.txt History
以下のいくつかの誤った行を除いて、すべてが正常です。
history.csv:11671: unescaped " character
history.csv:11671: unescaped " character
history.csv:11772: expected 4 columns but found 6 - extras ignored
確認する
以下で変更が発生したことを確認しました。
SELECT * FROM History;
はい、URLを見ました。
閉幕式
最後にコンソールを閉じました。
.quit
質問
Qutebrowserに戻って動作することを確認するために一部のURLを開こうとすると機能しません。 URLを取得できないようです。
質問
Qutebrowserの履歴にURLを取得する方法は?私が説明した方法や他の方法で。
修正する
:history
Qutebrowserでコマンドを有効にすると、私が追加したリンクが表示されます。しかし歴史的完成には現れない。したがって、データベースの問題ではありません。
答え1
SQLiteは列型を適用せず、Cutebrowser履歴SQLの時間列は単純な整数(おそらくエポック以降の秒)です。あなたの文字列は、ISO形式の日付/時刻を含む完全な文字列です!したがって、qutebrowserはそれを解析できない可能性があります。
"
あなたのCSVがまたはその中にあると思われるという事実は、;
あなたがデータを正しく前処理していないことをもう一度示唆し、最初にURLをurlencodeする必要があります。 sqliteにエスケープされていない引用符があることを知らせるのは本当に悪い兆候です。一般に、パーサーには特定の許容誤差があり、実際にはCSVで明示的に解析できないデータがある可能性があります。テキストエディタでこの行をチェックしてください((neo)vimは何千行ものファイルを開くのに問題はありません)。
sqlite3
したがって、「拡張」SQLシェルを介して直接インポートすることはうまくいきません。選択した言語でスクリプトを書くのはとても簡単です。ここでは基本的に組み込みのpython3を使用しています。
- この
sqlite3
モジュールを使用すると、テーブルに行を簡単に挿入できます。 datetime
日付変換の場合、csv
CSVファイルを読み取るための簡単な行読み取り処理のためのモジュールもあります。予期しない場所に引用符があるように見えるので、ここでは手動解析を好みます。
私が思いついたプログラムスタブはおおよそ次のようになります。
#!/usr/bin/env python3
from datetime import datetime
# Need to install python3-requests:
from requests.utils import requote_uri
import sqlite3
from sys import argv
def parseline(line: str) -> tuple:
components = line.split(";")
url = requote_uri(components[0])
raw_title = components[1]
if raw_title[0] == '"' and raw_title[-1] == '"':
raw_title = raw_title[1:-1]
title = raw_title
timestamp1 = int(datetime.fromisoformat(components[-2]).timestamp())
return (url, title, timestamp1, 0)
assert(len(argv) == 3)
with sqlite3.Connection(argv[1]) as db:
handle = db.cursor()
with open(argv[2], "r", encoding="utf-8") as textfile:
handle.executemany("INSERT INTO History VALUES(?, ?, ?, ?)",
(parseline(line) for line in textfile))
上記のスクリプトは完全にテストされておらず、単に私の想像上の製品であることに注意してください。実行可能にし、セミコロンで区切られたファイルパスをパラメータとして使用してディレクトリからchmod a+x scriptname
実行できます。.local/share/qutebrowser
cd ~/.local/share/qutebrowser; ~/bin/scriptname ~/urls.txt
デバッグ
次のスクリプトを実行できます
#!/usr/bin/env python3
from datetime import datetime
# Need to install python3-requests:
from requests.utils import requote_uri
import sqlite3
from sys import argv
def parseline(line: str) -> tuple:
components = line.split(";")
url = requote_uri(components[0])
raw_title = components[1]
if raw_title[0] == '"' and raw_title[-1] == '"':
raw_title = raw_title[1:-1]
title = raw_title
timestamp1 = int(datetime.fromisoformat(components[-2]).timestamp())
return (url, title, timestamp1, 0)
assert(len(argv) == 3)
with sqlite3.Connection(argv[1]) as db:
handle = db.cursor()
with open(argv[2], "r", encoding="utf-8") as textfile:
handle.executemany("INSERT INTO History VALUES(?, ?, ?, ?)",
(parseline(line) for line in textfile))
そしてpython3 importHistory.py ~/.local/share/qutebrowser/history.sqlite history.csv
私のスクリプトはデータベースパスを提供する必要があります。