Удаление всех пробелов, табуляций из файла .txt - PullRequest
0 голосов
/ 26 февраля 2019

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

for /F "delims=" %%a in (CODE_CHECK.txt) do (
   set one=%%a
   set one=%one:=%
) >> CODE_CHECK_2.txt

Пример строки файла:

ONE VIEW

TWO PACKEGE BODY

После кода это должно быть:

ONEVIEW

TWOPACKEGEBODY

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Учитывая, что файл содержит менее 64 КБ строк длиной менее 8 КБ / символов каждая, пустые строки не нужно сохранять, и файл кодируется в ASCII / ANSI с переносами строк в стиле DOS / Windows,Вы можете сделать следующее:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Write output to another file:
> "CODE_CHECK_2.txt" (
    rem /* Read file by `more` which replaces TABs by SPACEs;
    rem    then parse the output by `for /F` (skipping empty lines): */
    for /F delims^=^ eol^= %%L in ('more "CODE_CHECK.txt"') do (
        rem // Store current (non-empty) line:
        set "LINE=%%L"
        rem /* Toggle delayed expansion to be able to write and read
        rem    a variable in the same block of code and to preserve `!`: */
        setlocal EnableDelayedExpansion
        rem // Replace every SPACE by nothing, hence remove it:
        echo(!LINE: =!
        endlocal
    )
)
endlocal
exit /B

Вот подход, который сохраняет пустые строки (хотя все еще применяются остальные ограничения):

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Write output to another file:
> "CODE_CHECK_2.txt" (
    rem /* Read file by `more` which replaces TABs by SPACEs;
    rem    precede every line by line number plus `:` to not appear empty;
    rem    then parse the output by `for /F` (which would skip empty lines): */
    for /F "delims=" %%L in ('more "CODE_CHECK.txt" ^| findstr /N "^"') do (
        rem // Store current line:
        set "LINE=%%L"
        rem /* Toggle delayed expansion to be able to write and read
        rem    a variable in the same block of code and to preserve `!`: */
        setlocal EnableDelayedExpansion
        rem // Replace every SPACE by nothing, hence remove it:
        set "LINE=!LINE: =!"
        rem // Remove line number prefix and return result:
        echo(!LINE:*:=!
        endlocal
    )
)
endlocal
exit /B
0 голосов
/ 26 февраля 2019

Если вы работаете на платформе Windows, из-за предоставленного вами кода и включенных тегов…

В следующем примере будут удалены пробелы и табуляции, а также удалены все пустые строки.:

@If Exist "CODE_CHECK.txt" (For /F Delims^=^ EOL^= %%A In ('More /T1 "CODE_CHECK.txt"')Do @Set "$=%%A"&Call Echo(%%$: =%%)>"CODE_CHECK_2.txt"

Чтобы сохранить какие-либо пустые строки, используя , вам понадобится что-то вроде этого:

@If Exist "CODE_CHECK.txt" (For /F "Tokens=1*Delims=]" %%A In ('More "CODE_CHECK.txt"^|Find /V /N ""')Do @Set "$= %%B"&Call Echo(%%$: =%%)>"CODE_CHECK_2.txt"

InВ этом примере я удалил параметр /T1 для More, я не уверен, является ли его включение более или менее эффективным


Вы также можете использовать для этого (при необходимости входной и выходной файлы могут совпадать) :

(GC 'CODE_CHECK.txt') -Replace '\s',''|SC 'CODE_CHECK_2.txt'

Вы также можете запустить версию из :

@PowerShell -NoP "(GC 'CODE_CHECK.txt') -Replace ' |\t',''|SC 'CODE_CHECK_2.txt'"

В этой версии я использовал ' |\t', как возможную альтернативу '\s'.

...