Изменить плоский файл так, чтобы в каждой строке было определенное количество символов? - PullRequest
2 голосов
/ 08 июля 2011

Я хотел бы создать пакетный файл, который преобразует каждую строку в плоском файле в определенное количество символов (добавьте пробелы в конце каждой строки).

Пример: у меня есть текстовый файл с именем"text.txt", и это выглядит так:

1
22
333
4444
55555

Я хотел бы запустить на нем пакетный файл и получить следующее (все строки длиной 7 символов):

1......
22.....
333....
4444...
55555..

(Мне пришлось заменить пробелы точками, чтобы сделать его видимым)

Возможно ли это и как?


Обновление:

Круто, чтоотлично работает.

Можно ли также преобразовать пустую строку (только CRLF) в 7 пробелов?Когда я запускаю вышеупомянутое в файле с пустыми строками, они удаляются.

Спасибо!

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, это файл:

1
22

333
22

1
4444
55555

ИЯ хочу получить:

1......
22.....
.......
333....
22.....
.......
1......
4444...
55555..

Еще раз спасибо!


Обновление 2:

Ответ Андрея заставляет меня сделать несколько шагов вперед.У меня есть несколько вопросов, хотя.Если я оставлю знак # выходным, результат будет таким (неподвижные точки вместо пробелов):

1.......
22......
ECHO is off.
333.....
22......
ECHO is off.
1.......
4444....
55555...

И если строка начинается с пробела, она будет выведена как:

ECHO is off.

Powershell, к сожалению, не вариант ...

Это может быть лучшим примером,
text.txt:

This is
 the input
file 
     I

 want to convert

Конечно, теперь мы должны сделатьзаписи длиннее, скажем, 20 символов.

Ответы [ 2 ]

3 голосов
/ 09 июля 2011

Вот один способ (я оставил точку в конце пробелов в «SET strTemp =% 1.» Для наглядности, вы можете удалить ее:

@ECHO OFF

FOR /F %%a IN (text.txt) DO Call :FixString %%a
PAUSE
EXIT

:FixString
 SET strTemp=%1       .
 ECHO.%strTemp:~0,7% >> output.txt
 EXIT /b

/ редактирование:

Является ли Powershell вариантом для вас? Там было бы легче обрабатывать возврат каретки, например:

Foreach ($strLine in Get-Content c:\temp\text.txt) 
{ 
 $strTemp = $strLine + "........"
 If ($strTemp.Length -lt 1) {
  Add-Content c:\temp\output.txt $strTemp
 } Else {
  Add-Content c:\temp\output.txt $strTemp.SubString(0,7)
 }
}

Этот сценарий Powershell также будет работать, если в каждой строке есть пробелы, и сценарий .cmd, который я дал вам ранее, будет иметь проблемы с ними (вам потребуется изменить параметр delims = команды For для их обработки).

2 голосов
/ 09 июля 2011

Цикл FOR пропускает пустые строки. Это по замыслу. Чтобы обойти это, вы можете использовать следующую команду:

FIND /N /V "" < <i>sourcefile</i>

Считается, что ни одна строка не может соответствовать "" (пустая строка), поэтому просто FIND "" < file будет выдавать пустой вывод. Но опция /V вызывает инверсию вывода: вместо строк, которые соответствуют строке поиска, FIND предназначена для вывода тех, которые не соответствуют ей. Таким образом, FIND /V "" < file по существу заставляет FIND выводить все строки file. И /N приводит к добавлению каждой строки к номеру строки, например:

[<i>number</i>]<i>text</i>
[<i>number</i>]<i>text</i>
…

Соответственно, пустые строки будут выглядеть так:

[<i>number</i>]
[<i>number</i>]
…

Итак, теперь мы можем перебирать все строки. Нам нужно только удалить все [<i>number</i>] части, а затем использовать идею @ Dave о добавлении пробелов и вырезании первых 7 символов. Вот полный сценарий:

@ECHO OFF
FOR /F "delims=" %%L IN ('FIND /N /V "" ^<text.txt') DO CALL :process "%%L"
GOTO :EOF

:process
SET "line=%~1"
SET "line=%line:*]=%       "
ECHO(%line:~0,7%#

(Символ # добавляется только для визуальной индикации.)

UPDATE

Добавлено ( сразу после ECHO. Это решает проблему ECHO is off. По сути, вместо ( можно использовать несколько разных символов, например, . или ,. Но, как показано в , этот ответ , ( кажется наиболее надежным.

ОБНОВЛЕНИЕ 2

Добавлена ​​опция "delims=" в цикл FOR после /F для учета пробелов в тексте.

...