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 批量读取文件 - 不将输入保存到其他文件的主要内容,如果未能解决你的问题,请参考以下文章

分批次读取csv文件,并保存到数据库

处理来自移动麦克风的音频输入而不将其保存到文件中

生成 MIDI 文件并播放它而不将其保存到磁盘

R语言批量读文件

opencv如何批量读取文件夹中图片

python批量读取txt某列,并复制对应txt文件名?