2

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

示例:我有一个名为“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 个字符。

4

2 回答 2

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= 参数来处理它们)。

于 2011-07-08T21:28:19.277 回答
2

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

FIND /N /V "" < sourcefile

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

[number]text
[number]text

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

[number]
[number]
…

所以,现在我们可以遍历所有的行了。我们只需要删除所有部分,然后使用@Dave 的想法添加空格并删除前 7 个字符。这是一个完整的脚本:[number]

@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问题。基本上,您可以使用许多不同的字符来代替(, like ., or,例如。但是,如this answer所示,(似乎最可靠。

更新 2

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

于 2011-07-09T18:04:25.490 回答