Последствия удаления символов NUL из текстового файла?

363
Hashim

У меня довольно большой текстовый файл (около 20 ГБ), который я использую в качестве простой базы данных, поэтому каждая запись разделяется новой строкой, и нарушение этого формата вызовет проблемы. Этот файл также содержит некоторые NUL-символы, или, по крайней мере, это то, что я подозреваю, так как grepрассматривает его как двоичный файл.

Я сталкивался с этим вопросом и ответом, который заявляет:

Некоторое чтение показало, что grep ищет нулевой символ в первой тысяче байтов или около того, а затем определяет из этого, является ли файл «двоичным».

По этой причине я думаю об удалении этих символов из файла примерно так:

tr < file-with-nulls -d '\000' > file-without-nulls 

Но я хочу быть уверен, что это не нарушит форматирование файла. Это вообще возможно?

0
Как насчет просто сделать это и сохранить в новый файл. Затем посмотрите, правильно ли работает новый файл. Текстовые файлы обычно не содержат нулевых значений, поэтому мы понятия не имеем, какую функцию они могут выполнять. fixer1234 6 лет назад 1
Нулевой символ исходит от смешивания UTF-16 с UTF-8? Текст UTF-16 содержит нули. matzeri 6 лет назад 2
[Этот ответ] (https://unix.stackexchange.com/a/276028/108618) говорит о возможной ошибке кодирования. Kamil Maciorowski 6 лет назад 0
@KamilMaciorowski Если это ошибка кодировки, описанная в этом ответе, что, по-моему, является менее вероятным случаем, удаляет ли файл NUL-символов его вероятность? Я предполагаю, что они более или менее независимы друг от друга, так что даже если ошибка кодирования действительно существует, удаление символов NUL теоретически вряд ли принесет больше вреда. Hashim 6 лет назад 0
@matzeri Я не создавал файлы, они были получены из Интернета и, вероятно, были отредактированы десятками людей, и таким образом приобрели всевозможные артефакты в процессе. Вполне возможно, что вы говорите, я просто понятия не имею. Hashim 6 лет назад 0
@ fixer1234 Поскольку было бы невозможно окончательно определить, является ли форматирование базы данных текстового файла объемом 20 ГБ со строками 1,2 ББ и более чем 1800 символами NUL на самом деле нарушено или нет - сбой здесь, скорее всего, будет молчать, так что отдельные записи будут просто слиться с предыдущими, и `grep`ping для этих записей создаст обманчивое впечатление, что для него не найдено совпадений. Вот почему я должен быть уверен, что то, что я планирую, теоретически правильно, потому что файл такого размера не может быть очищен после факта, чтобы проверить, все ли в порядке. Hashim 6 лет назад 0
@ fixer1234 Что касается функции NUL в текстовом файле с новой строкой, то, правда, такой файл обычно не содержит NUL, но, если сформулировать мой вопрос по-другому, действительно ли они в них нужны? Существуют ли какие-либо (теоретически, конечно) способы, с помощью которых текстовый файл с разграничением строк должен когда-либо полагаться на NUL для своего форматирования, или их можно с уверенностью считать артефактами, которые можно просто удалить, не влияя на положение новых строк? Hashim 6 лет назад 0
что выдает `file your-file-name '? matzeri 6 лет назад 0
@matzeri "данные" Hashim 6 лет назад 0
Данные могут означать, что различные тестовые коды были смешаны вместе. Если ноль исходит от нормальных символов ASCII в представлении UTF-16, вы должны увидеть альтернативные пары `нуль / ASCII`. В этом случае удаление нулевого значения - это просто преобразование UTF-16 в ASCII. Однако, если у вас есть код UTF-16, который превышает диапазон ASCII, удаление нуля просто оставит другие символы в неправильной кодировке. matzeri 6 лет назад 1
Если это простой текст ASCII, он не должен содержать ничего, кроме текстовых символов и LF или CR / LF. Там нет форматирования, кроме разрывов строк. Если бы содержимое содержало расширенный набор символов, я не думаю, что удаление нулей изменило бы что-либо, как уже предложил Маццери (я не думаю, что нулевое значение изменяет символ). Тем не менее, вам не нужно проверять эффект каждого последнего нуля. Если они пришли из чего-то вроде UTF-16, все они будут иметь одинаковый эффект, если их удалить. Найдите расположение нескольких примеров и проверьте их после очистки. (Продолжение) fixer1234 6 лет назад 1
Тем не менее, если абсолютно необходимо, чтобы вы случайно не изменили данные, не удаляйте пустые значения. По-видимому, они не являются источником проблем, и 1800 в 20 ГБ файле не будут иметь большого значения. fixer1234 6 лет назад 1

0 ответов на вопрос

Похожие вопросы