Win 批量读取文件 - 不将输入保存到其他文件
Posted
技术标签:
【中文标题】Win 批量读取文件 - 不将输入保存到其他文件【英文标题】:Win Batch reading file - does not save input to other file 【发布时间】:2020-10-30 09:58:56 【问题描述】:我想逐行读取 .csv 文件,删除空格,然后将这些行作为“过滤”输出回显到另一个 .csv 文件。首先是我的输入:
test
test
t e st .
th isssss a te st
现在我的解析脚本(更新):
@echo off
SETLOCAL EnableDelayedExpansion
cls
del K:\Users\Ultron\test\test2.csv
echo CSRV>>K:\Users\Ultron\test\test2.csv
for /F "tokens=*" %%A in (K:\Users\Ultron\test\test.csv) do (
set "line=%%A"
echo %line%
echo %line% >>K:\Users\Ultron\test\test2.csv
)
notepad K:\Users\Ultron\test\test2.csv
现在记事本打开并显示预期的结果:
CSRV
ECHO Turned Off (OFF).
ECHO ist ausgeschaltet (OFF).
ECHO ist ausgeschaltet (OFF).
ECHO ist ausgeschaltet (OFF).
如果我打开 echo 我可以看到这些行已正确读取,但它不会将它们打印到文件中。如果打开了回显,则文件包含相同的信息,只是它说“ECHO 已打开 (ON)。”
它不保存实际变量。
【问题讨论】:
For 循环只能使用 32 个标记。您发布的代码在将输出写入文件之前用右括号终止 for 循环,因此仅输出最后一个值。此外,在将输入分配给变量时,请使用双引号方法Set "varname=value"
这不会影响结果:“tokens=1-10*”只输出:“th”
Set "varname=value" 是怎么回事。我从未使用过这种方法,实际上编写了极其复杂的批处理脚本。然而我无法存档这么简单的东西。我不知道为什么人们只是对这些问题投反对票。有什么事。还没有答案,但已经在责备我了。这很……人性。编辑:使用“tokens=*”将正确读取最后一行,但只读取最后一行。不完善,但不是很多......
顺便说一句:我建议切换到 PowerShell,它具有对 CSV 文件的原生、面向对象的支持。与尝试使用 cmd
for
命令相比,您的生活会轻松得多。
您的代码中是否存在)
行上的set line=%%A )
?那会破坏事情。
【参考方案1】:
这很容易使用 PowerShell 完成。如果您在受支持的 Windows 计算机上,则可以使用 PowerShell。注意:这将删除所有空格字符。它不会在 CSV 格式文件的分隔字段内保留空格字符。这就是问题中的示例。
Get-Content -Path 'C:/src/t/test2.csv' |
ForEach-Object $_ -replace ' ','' |
Out-File -FilePath 'test3.csv' -Encoding utf8
如果您必须从 cmd.exe 控制台或 .bat 文件脚本运行,则可以使用。
powershell -NoLogo -NoProfile -Command ^
"Get-Content -Path 'test2.csv' |" ^
"ForEach-Object $($_ -replace ' ','') |" ^
"Out-File -FilePath 'test3.csv' -Encoding utf8"
【讨论】:
我现在将使用 .bat 版本。工作得很好。但是,您的示例将很快接受我的检查,因为我想在某个时候深入研究 PS。所以还是谢谢你! @HeartOfGermany,第二个例子是".bat version."
IMO,使用 PowerShell 编写整个脚本比从 cmd.exe shell 脚本(批处理文件)调用 PowerShell 更有好处。
@Bill_Stewart,我同意。但是,这是 OP 的决定。【参考方案2】:
问题,读写不正确不止一个细节。
修复所需:
我删除了令牌编号 更改了文件输出。它必须使用 !var!合成器(延迟扩展) 删除一个“)”,我在多次尝试后都没有看到。好尴尬…… 使用奇怪的合成器,例如 ('type "C:\path with spaces\stuff"'),因此脚本可以使用带空格的路径 - 因为这是目标用例结果看起来就像:
@echo off
SETLOCAL EnableDelayedExpansion
cls
del "K:\Users\Ultron\test\te st\test2.csv"
echo CSRV>>"K:\Users\Ultron\test\te st\test2.csv"
for /F "tokens=*" %%A in ('type "K:\Users\Ultron\test\te st\test.csv"') do (
set "line=%%A"
set "line=!line: =!"
set "line=!line: =!"
(echo !line: =!)>>"K:\Users\Ultron\test\te st\test2.csv"
)
notepad "K:\Users\Ultron\test\3.7-12V_inductor_current\te st\test2.csv"
这会产生预期的 .csv:
test
test
test.
thisssssatest
【讨论】:
注意:echo !line: =! >>file
在每行末尾添加一个(可能不需要的)空格。将语法更改为>>file echo "!line!" or
(echo !line!)>>file`
或者更好的是,将整个 for 循环括在括号中,并将重定向移动到 for 循环的外部。 (For /F "OPTIONS" %%X In (Set) Do (commands))>"%~dp0outfile.txt"
正确。我没有解决这个问题,因为它不是问题。但是,是的,我想了半秒钟,为什么这些在那里。显然,空间是问题所在。感谢 >>file echo 等提示。我通常会这样写: !line: =!>>"K:\Users\ 这也是一种享受。有时批处理像这次一样非常灵活,有时它简直是疯了,这么复杂的超级 -简单的脚本语言可以。:D
!line: =!>>
当行以单个数字(数字)结尾时会让您有些头疼。
Stephan,我无法重现这种情况,这让我很头疼。我尝试了一条带有“1”的行和类似的东西,例如“这是一个测试 1”。在这里创建错误的条件是什么?请告诉我。谢谢。以上是关于Win 批量读取文件 - 不将输入保存到其他文件的主要内容,如果未能解决你的问题,请参考以下文章