【发布时间】:2021-11-25 14:50:39
【问题描述】:
我有一个如下所示的 .csv 文件:
...
;OUTPUT;DISCRETE;VOLTAGE1;;
;OUTPUT;DISCRETE;VOLTAGE2;;
...
现在我想在这个 .csv 文件中搜索字符串,例如“VOLTAGE1”,如果找到,将“#”写到找到搜索字符串的行的开头。
因此,批处理脚本完成后 .csv 文件应如下所示:
...
#;OUTPUT;DISCRETE;VOLTAGE1;;
;OUTPUT;DISCRETE;VOLTAGE2;;
...
我已经找到了如何在文件中搜索字符串的方法,但我不知道如何在 for 循环的“do”部分中将“#”写到行首。那么我该怎么做呢?
到目前为止我的代码:
@echo off
setlocal
for /F "tokens=1* delims=;" %%a in ('findstr /I "VOLTAGE1" file.csv') do <write # to beginning of line>
endlocal
EDIT1:应对原始 .csv 文件进行更改。
所以最后每行包含一个搜索字符串应该在多次调用脚本后以 # 开头
EDIT2:我根据自己的需要调整了 Thor 的代码,但问题是脚本速度很慢。完成 1200 行的 excludes_signals.txt 和 1860 行的 csv 文件大约需要 8 分钟。 excludes_signals.txt 包含所有在 csv 文件中应以“#”开头的信号名称。您知道如何提高脚本的性能吗?
这是我当前的代码:
$base_path = $args[0]
$csv_path = $base_path + "\comms\comms.csv"
foreach($line in Get-Content .\exclude_signals.txt) {
Import-Csv -Delimiter ';' -Header a,b,c,d,e,f,g,h,i -Path
$csv_path |
ForEach-Object { if ($_.e -like $line) { $_.a = "#" } $_ } |
ConvertTo-Csv -Delimiter ';' -NoTypeInformation |
Select-Object -skip 1 |
ForEach-Object { $_ -replace '"','' } > mtad_comms.csv
Remove-Item -Path "$base_path\mtad_comms\mtad_comms.csv"
Move-Item -Path .\comms.csv -Destination
"$base_path\comms\" -Force
}
EDIT3:我认为性能低下的主要原因是
ForEach-Object { if ($_.e -like $line) { $_.a = "#" } $_ } |
也许Select-String 比将文件的每一行与搜索字符串进行比较更好。如果Select-String 匹配,我只是不知道如何编辑带有{ $_.a = "#" } 的行。
【问题讨论】:
标签: windows powershell csv batch-file