我想创建一个批处理文件,将平面文件中的每一行转换为特定数量的字符(在每行末尾添加空格)。
实施例: 我有一个名为“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..
再次感谢!
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个字符。
答案 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
选项,以便考虑文本中的空格。