我想创建一个批处理文件,将平面文件中的每行转换为特定数量的字符(在每行末尾添加空格)。
的例子:我有一个名为"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个字符。
这里有一种方法(我在"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:temptext.txt)
{
$strTemp = $strLine + "........"
If ($strTemp.Length -lt 1) {
Add-Content c:tempoutput.txt $strTemp
} Else {
Add-Content c:tempoutput.txt $strTemp.SubString(0,7)
}
}
如果每行都有空格,这个Powershell脚本也会表现得很好,我之前给你的。cmd脚本会有问题(你需要改变For命令的delims=参数来处理它们)。
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
的问题。基本上,您可以使用许多不同的字符来代替(
,例如.
或,
。但是,从这个答案中可以看出,(
似乎是最可靠的。
更新2
在/F
之后的FOR
循环中添加"delims="
选项,以解释文本中的空格