1

Я пытаюсь вставить 1,5 миллиарда слов Crackstation (15 гигов) в таблицу базы данных. Я пробовал SQLite и Postgres оба безуспешно до сих пор через командную строку.

Оба расстраиваются из-за того, что данные содержат некоторые двоичные значения, разбросанные по всему файлу. Данные , кажется, не быть только UTF-8 символов.

UltraEdit обнаруживает это как UTF-8.
Однако команда linux file говорит:

$  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 сообщений" и только одна строка, вставленная в таблицу (что является просто пустым строковым значением).

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-файл имеет 15 гигабайт, так что я смог открыть его только в UltraEdit, и даже при этом очень медленно добраться до этой строки, удалить ее, снова запустить команду psql, промыть и повторить ... отсюда и почему сейчас задаю вопрос.

1 ответ1

0

Если у этого файла нет указанной кодировки, вы можете импортировать его как таковой.

Если целью является выделенная база данных, в случае PostgreSQL вы можете создать ее без применения какой-либо кодировки.

В качестве команды SQL:

CREATE DATABASE dbname
  encoding 'SQL_ASCII'
  lc_collate= 'C'
  lc_ctype='C'
  template=template0;

Таблицы, созданные внутри этой базы данных, будут принимать ненулевые байты, не проверяя, соответствуют ли они символам в любой кодировке. Сравнение строк будет выполняться побайтово.

Если файл также содержит nul байтов, вам нужно удалить их, отфильтровав его с помощью tr -d '\0' или эквивалентной команды для вашей ОС.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .