2015-12-20 4 views
1

У меня есть текстовый файл, содержащий двоичные управляющие символы, такие как «^ @» и «^ M». Когда я пытаюсь выполнить строковые операции непосредственно в текстовом файле, управляющие символы сбрасывают скрипт.Удаление двоичных управляющих символов из текстового файла

Через пробную версию и ошибку я обнаружил, что команда more лишит управляющие символы, чтобы я мог обработать файл должным образом.

more file_with_control_characters.not_txt > file_without_control_characters.txt 

Это считается хорошим способом, или есть лучший способ, чтобы удалить управляющие символы из текстового файла? Есть ли у more такое поведение в ОС раньше Windows 8?

+0

Там нет команды в CMD/Win8 делать то, что вы пытаетесь сделать (что звучит как фильтр неконтролируемый альфа-числовых байты из двоичного файла) ... Side Примечание: Вы бы гораздо лучше найти читатель для формата файла, который вы пытаетесь просканировать через ... –

+2

Пожалуйста, прочитайте [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и разместите вопрос, чтобы мы могли вам помочь. – Vedda

+0

Я сообщаю метод, который работает. Я использую пакет для связи с одновременно запущенным .exe с ограниченными параметрами вывода файлов. – svengineer99

ответ

1

Конечно, вы не хотите просто удалять все управляющие символы. Символы Newline и Tab также являются управляющими символами, и вы не хотите их удалять.

Я предполагаю, что ваш ^M является возвратом каретки, а ^@ - это NULL-байт. Возврат каретки не вызывает проблем, и MORE не удаляет их. Но NULL байты могут вызвать проблемы, если ваша утилита ожидает текстовые файлы ASCII.

Ваш входной файл скорее всего UTF-16. MORE преобразует формат UTF-16 в формат ANSI (расширенный ASCII), который эффективно удаляет NULL-байты. Он также преобразует значения, отличные от ASCII, в расширенные символы ASCII в десятичном значении 128 - 255 байтов. Я считаю, что он использует значение вашей активной кодовой страницы (CHCP), чтобы выяснить, какие символы отображают где, но я не уверен.

Вы должны знать о некоторых дополнительных проблемах.

  • MORE преобразует все символы Tab в ряд пробелов, и вы не можете контролировать, сколько пространства (оно изменяется в зависимости от текущей позиции в строке).

  • MORE всегда будет завершать каждую строку с помощью \ r \ n (возврат каретки и подача строки).

  • MORE также удаляет двухбайтную спецификацию в начале файла, если она существует. Спецификация указывает формат UTF-16. Но MORE не требует 2-байтового индикатора спецификации, он будет конвертировать UTF-16 в ANSI независимо.

  • Наконец-то MORE может вешать бесконечно, если ваш файл превышает 64K строк.

Если БОЛЬШЕ работает для вас, чем это возможно.

Еще один вариант заключается в использовании TYPE, который будет также преобразовать UTF-16 в ANSI:

type "yourFile.txt" >"newFile.txt" 

TYPE определенно отображает не-ASCII коды, основанные на активной кодовой страницы.

Есть некоторые различия с тем, как TYPE преобразует против MORE

  • одно преимущество TYPE он не выполняет преобразование символов табуляции в пробелы.

  • Другим преимуществом является то, что он не будет висеть с большими файлами.

  • Другое отличие (возможно, хорошее, может быть, плохое) заключается в том, что он не добавит терминатор линии к линии, у которой ее еще нет.

  • Потенциальный недостаток TYPE заключается в том, что он не преобразует UTF-16 в ANSI, если на входе отсутствует спецификация.

+0

Благодарим вас за этот чрезвычайно подробный, полезный и полезный ответ! Мой входной файл имеет очень специализированный и четко определенный формат (я на самом деле создаю этот файл из сценария, который я написал, работая на другом параллельном исполняемом файле), поэтому я могу позаботиться о том, чтобы избежать потенциальных проблем, которые вы любезно задокументировали. Если я столкнулся с одной из этих проблем, теперь я знаю, что тип может быть улучшенным вариантом. Еще раз благодарю вас за ваше время и заботу, чтобы ответить на этот вопрос. – svengineer99

Смежные вопросы