일반 개요
다음 형식의 `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
내 스크립트에서는 데이터베이스 경로를 제공해야 합니다.