开发者

Edit flat file to have a specific number of characters on each line?

I would like to create a batch file that converts every line in a flat file to e specific amount of characters (add spaces at the end of every row).

Example: I have a text file called "text.txt", and it looks like this:

1
22
333
4444
55555

I would like to run a batch file on it and recieve the following (all lines are 7 characters long):

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

(I had to replace my spaces with dots to make it visible)

Is this possible, and how?


Update:

Cool, that works perfect.

开发者_开发知识库

Is it also possible to convert a blank line (just CRLF) to 7 spaces? When I run the above on a file with empty lines they are deleted.

Thanks!

EDIT: Just to clarify, this is the file:

1
22

333
22

1
4444
55555

And I want to recieve:

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

Thanks again!


Update 2:

Andriys answer is getting me a few steps forward. I've got a few issues though. If I leave the # sign out, the output will be like this (still periods instead of spaces):

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

And if a line starts with a space it will be outputted as:

ECHO is off.

Powershell is unfortunately not an option...

This might be a better example,

text.txt:

This is
 the input
file 
     I

 want to convert

Of course now we have to make the records longer, let's say 20 char.


Here's one way (I left a period at the end of the spaces in "SET strTemp=%1 ." for visibility, you can remove it:

@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

/edit:

Is Powershell an option for you? It would be easier to handle the carriage returns there, like this:

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)
 }
}

This Powershell script will also behave if there are spaces within each line, the .cmd script I gave you earlier will have trouble with them (you'd need to change the delims= parameter of the For command to handle them).


The FOR loop does omit empty lines. This is by design. To work around that, you could use the following command:

FIND /N /V "" < sourcefile

It is considered that no line can match "" (empty string), so simply FIND "" < file would produce empty output. But the /V option causes the inversion of the output: instead of the lines that match the search string, FIND is to output those that do not match it. So FIND /V "" < file essentially causes FIND to output all the lines of file. And /N causes every line to be prepended with the line number, like this:

[number]text
[number]text

Accordingly, empty lines will look just like this:

[number]
[number]
…

So, now we are able to iterate over all the lines. We only need to remove all the [number] parts, then use @Dave's idea of appending the spaces and cutting out the first 7 characters. Here's a full script:

@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%#

(The # character is only added for visual indication.)

UPDATE

Added ( just after ECHO. This solves the ECHO is off issue. Basically, you can use a number of different characters instead of (, like ., or , for instance. But, as shown in this answer, ( seems most reliable.

UPDATE 2

Added the "delims=" option to the FOR loop after /F to account for spaces in the text.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜