我正在尝试插入Crackstation 的 15 亿个单词表 (15gig)进入数据库表。我已经通过命令行尝试过 SQLite 和 Postgres,但目前都没有成功。
两者都对数据似乎包含一些分散在整个文件中的二进制数据值感到不满。数据没有似乎仅为 UTF-8 字符。
UltraEdit 将其检测为 UTF-8。
但是,linux 文件命令显示:
$ file crackstation.txt -I
crackstation.txt: application/octet-stream; charset=binary
我如何将这些数据放入 Postgres 或 SQLite 以便我可以分析/查询它?
有没有一种方法可以让我先清理/转换数据以便插入工作...或者我可以用另一种方式将其导入数据库以便它工作?
以下是我尝试过的:
SQLite的:
sqlite> .mode csv
sqlite> .separator "\n"
sqlite> .import crackstation.txt passwords
对此的响应是数百万条unescaped " character
消息,但表中仅插入 1 行(恰好只是一个空字符串值)。
Postgres:
psql> COPY passwords FROM 'crackstation.txt' WITH (FORMAT TEXT, NULL '', ENCODING 'UTF-8');
对此的响应是ERROR: invalid byte sequence for encoding "UTF8": 0xf6 blah blah
找到该行的行号。问题是,txt 文件是 15gig,所以我只能在 UltraEdit 中打开它,而且即使这样,找到该行、删除它、再次运行 psql 命令、重复这些操作的速度也非常慢……这就是为什么我现在问这个问题。
答案1
如果该文件没有任何指定的编码,您可能需要按此方式导入它。
如果目标是专用数据库,例如 PostgreSQL,则可以创建它而不强制执行任何编码。
作为 SQL 命令:
CREATE DATABASE dbname
encoding 'SQL_ASCII'
lc_collate= 'C'
lc_ctype='C'
template=template0;
在该数据库内创建的表将接受非零字节,而不检查它们是否对应于任何编码中的字符。字符串比较将按字节进行。
如果该文件恰好也包含空字节,那么您将需要通过使用tr -d '\0'
或与您的操作系统等效的命令进行过滤来删除它们。