总体概述
我有一个 `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
添加新网址
在 sqlite3 shell 中我做了:
.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;
是的,我看到了网址。
闭幕式
最后我关闭了控制台:
.quit
问题
当我回到 Qutebrowser 并尝试打开一些网址以查看它是否有效时,它不起作用。网址似乎未导入。
问题
如何将网址导入到 Qutebrowser 的历史记录中?通过我描述的方式或任何其他方式。
更新
:history
当我在 Qutebrowser 中激活命令时,会出现我添加的链接。但没有出现在历史补全中。所以这不是数据库的问题。
答案1
SQLite 不强制执行列类型,cutebrowser 历史 SQL 中的时间列是简单整数(可能是自纪元以来的秒数)。您的是带有 ISO 格式日期时间的完整字符串!所以,qutebrowser 可能无法解析这些。
事实上,您的 CSV 中似乎有"
或 ,;
这又表明您没有正确预处理数据; URL 需要首先进行 urlencode 编码。不过,sqlite 告诉您存在未转义的引号这一事实确实是一个坏兆头;通常,它们的解析器具有一定的容忍度,并且您可能确实拥有无法明确解析为 CSV 的数据。在文本编辑器中检查这些行((neo)vim 打开具有几千行的文件应该没有任何问题)。
因此,恐怕通过sqlite3
“扩展”SQL shell 直接导入它们是行不通的。用您选择的语言编写脚本应该非常简单;我这里是 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
Fauve 调试
我可以运行以下脚本
#!/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
在我的脚本中,您应该给出数据库路径。