2017-02-10 13 views
0

У меня есть 30 текстовых файлов в папке. Мне нужно удалить разрывы строк/разрывы каретки в данных для всех из них. Я уже использую пакет для других задач, поэтому было бы неплохо продолжать его использовать. Сейчас пакет переименовывает все расширения из .csv в .txt, а затем запускает файл excel.Удалить возврат каретки с помощью пакета для нескольких файлов в папке

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

+1

Это, к сожалению, не так, как этот сайт работает, вы предоставляете свой код, и мы поможем вам с ним. Мы не являемся бесплатной службой написания кода. – Compo

+0

Не получится сделать это с чистым [тегом: пакетный файл]. Вы можете сделать это с помощью Vbscript, но для этого потребуется, чтобы весь файл был загружен в память. Каков максимальный размер файла? – Squashman

+0

Они около 7 мб каждый. Как работает Vbscript? Могу ли я просто закодировать все, что я пытаюсь сделать с ним? Я знаю, что пакет устарел, поэтому я готов переместить языки, если это путь. – Charles

ответ

1

Вы можете использовать встроенную в исполняемом certutil для преобразования файлов из ASCII в шестнадцатеричный, обрабатывать полученный файл с for /f циклом, полосой всех экземпляров 0d (который является символом возврата каретки в шестнадцатеричном формате) из каждой строки и перестроить файл из оставшегося шестнадцатеричного кода. Клянусь, это легче, чем я.

Обратите внимание, что максимальный размер входного файла составляет 71 МБ из-за ограничения с certutil и что файлы размером более 2 МБ могут потребоваться некоторое время для обработки, но по крайней мере все является родным для Windows, поэтому вы не не нужно ничего устанавливать или изучать совершенно новый язык.

@echo off 
setlocal enabledelayedexpansion 

:: Ensure a file was passed in 
if "%~1"=="" (
    echo Please provide a file to process. 
    pause 
    exit /b 
) 

:: Ensure file is under the certutil input limit 
if %~z1 GTR 74472684 (
    echo This file exceeds the maximum file size of 74472684 bytes ^(71 MB^) 
    echo Please use a smaller file. 
    pause 
    exit /b 
) 

:make_rand 
:: Generate a random number to reduce the risk of filename collision 
set rand=%RANDOM%%RANDOM% 
set "temp_file=%~dpf1_%rand%.tmp" 
set "hex_file=%~dpf1_%rand%.hex" 
set "new_file=%~dpf1_new.%~x1" 
if exist %temp_file% goto :make_rand 
if exist %hex_file% goto :make_rand 

if exist %new_file% choice /c:YN /M "%new_file% already exists. Overwrite? " 
if %errorlevel% equ 1 del %new_file% 
if %errorlevel% equ 2 exit /b 

certutil -encodehex "%~1" "%temp_file%" 

:: The script will break if you have spaces in your file path. 
:: This is a feature, not a bug. Names your paths correctly. 
for /f "tokens=1,*" %%A in (%temp_file%) do (
    set "line=%%B" 
    set "hex_substring=!line:~0,48!" 
    set "no_carriage=!hex_substring:0d=!" 
    echo !no_carriage! >>%hex_file% 
) 

certutil -decodehex "%hex_file%" "%new_file%" 

:: Temp file cleanup 
del /q %hex_file% 
del /q %temp_file% 
+0

Что это такое: установите «hex_file =% ~ dpf1_% rand% .hex». Я также посмотрел certutil и не могу понять, для чего он используется в целом. – Charles

+1

@Charles - устанавливает имя выходного файла на имя входного файла (и помещает его в тот же каталог), но с подчеркиванием и случайным числом в конце. 'certutil' в общем случае используется для действий сертификата, но также может использоваться для обработки файлов на уровне шестнадцатеричного. – SomethingDark

+0

О, это интересно. Где этот цикл проходит через все файлы? (У меня также есть много пробелов в каталогах, думаю, мне нужно будет изменить это, хотя я не уверен, что проблема с этим) – Charles

1

Посмотрите на How can you find and replace text in a file using the Windows command-line environment?

Мой предпочтительным решением является использование консольного приложения xchang32.exe из Clay's Utilities for Win32 коллекции объяснена в this answer для простых, не заменяет регулярное выражение.

Скачать файл ZIP, распаковать только файл xchang32.exe в папку вашего пакетного файла и добавить в пакетный файл, например:

"%~dp0xchang32.exe" *.txt "^x0D" "" >nul 

Эта команда удаляет все символы возврата каретки из всех * .txt в текущем каталоге.

Линейные каналы не удаляются из файлов. Я не могу предложить что-то лучше, поскольку ничего не было написано о типе терминаторов строк (возврат каретки + прямая линия, только строка, только возврат каретки или самая ужасная смесь) или кодировка символов (ANSI, UTF-8 , UTF-16 LE, UTF-16 BE) файлов для изменения. И ничего в вопросе не было написано об именах файлов, размерах файлов и т.д.

+0

Да, я пытался использовать FART из этой темы, но у меня были проблемы с этим, я тоже проверю это. Я предполагаю, что^x0d = - возврат каретки. Основная проблема заключается в том, что я не знаю, каков тип возврата, и мне, вероятно, нужно учитывать все, что создает новую строку, отличную от разделителя, я пытался использовать командные команды различных типов в качестве процесса устранения. – Charles

+2

Хороший текстовый редактор, такой как UltraEdit, отображает тип терминатора линии в строке состояния открытого текстового файла. UltraEdit также имеет шестнадцатеричный режим редактирования, который отображает двоичный поток данных любого файла в шестнадцатеричном и ASCII-представлении. Хороший файловый менеджер, такой как Total Commander, имеет встроенный листер, который может отображать все файлы (двоичные и текстовые) с (почти) всеми кодировками символов, а также в шестнадцатеричном формате. Поэтому вам следует подумать о том, чтобы использовать, по крайней мере, для написания кода лучшие инструменты, поддерживающие файлы любого размера и любого типа, чем Windows Notepad и Windows Explorer. – Mofi

+0

Это действительно возврат каретки, но есть также линии, которые также должны оставаться. – Charles