编辑平面文件以在每行上具有特定数量的字符?

时间:2011-07-08 16:07:08

标签: file batch-file add spaces flat

我想创建一个批处理文件,将平面文件中的每一行转换为特定数量的字符(在每行末尾添加空格)。

实施例: 我有一个名为“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:

Andriys的回答让我前进了几步。我有几个问题。如果我退出#符号,输出将是这样的(仍然是句点而不是空格):

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 个答案:

答案 0 :(得分:3)

这是一种方式(我在“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脚本会遇到问题(你需要更改For命令的delims =参数来处理它们)。

答案 1 :(得分:2)

FOR循环确实省略了空行。这是设计的。要解决此问题,您可以使用以下命令:

FIND /N /V "" < sourcefile

认为没有行可以匹配""(空字符串),因此只需FIND "" < file就会产生空输出。但是/V选项导致输出的反转:而不是匹配搜索字符串的行,FIND将输出的那些>匹配它。因此FIND /V "" < file基本上会导致FIND输出所有file。并且/N会使每一行都加上行号,如下所示:

[number]text
[number]text

因此,空行看起来像这样:

[number]
[number]
…

所以,现在我们可以迭代所有的行。我们只需删除所有[number]部分,然后使用@ 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%#

#字符仅用于视觉指示。)

<强>更新

(之后添加了ECHO。这解决了ECHO is off问题。基本上,您可以使用多个不同的字符,而不是(,例如.,。但是,如this answer所示,(似乎最可靠。

更新2

"delims="之后的FOR循环中添加了/F选项,以便考虑文本中的空格。