我有一个。csv文件,看起来像这样:
...
;OUTPUT;DISCRETE;VOLTAGE1;;
;OUTPUT;DISCRETE;VOLTAGE2;;
...
现在我想在这个。csv文件中搜索字符串,例如"VOLTAGE1"如果找到了,写";#"到找到搜索字符串的行首
因此,批处理脚本完成后,.csv文件应该是这样的:...
#;OUTPUT;DISCRETE;VOLTAGE1;;
;OUTPUT;DISCRETE;VOLTAGE2;;
...
我已经找到了如何在文件中搜索字符串的方法,但我不知道如何编写"#"到行首的"do";for循环的一部分。我该怎么做呢?
我的代码:
@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的代码,问题是脚本相当慢。它需要大约8分钟来完成一个1200行的excludes_signals.txt和一个1860行的csv文件。exudes_signals .txt包含所有在csv文件中应该以'#'开头的信号名称。你知道如何提高脚本的性能吗?
下面是我当前的代码:
$base_path = $args[0]
$csv_path = $base_path + "commscomms.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_pathmtad_commsmtad_comms.csv"
Move-Item -Path .comms.csv -Destination
"$base_pathcomms" -Force
}
我认为低性能的主要原因是
ForEach-Object { if ($_.e -like $line) { $_.a = "#" } $_ } |
也许Select-String
会比将文件的每一行与搜索字符串进行比较更好。我只是不知道如何编辑{ $_.a = "#" }
如果Select-String
匹配的行。
powershell
是一个选项吗?例如:
ipcsv -d ';' -h a,b,c,d,e,f -pa infile.csv |
% { if ($_.d -like "voltage1") { $_.a = "#" }; $_ } |
ConvertTo-Csv -d ';' -nti | select -skip 1 |
% { $_ -replace '"','' }
或ungolfed:
Import-Csv -Delimiter ';' -Header a,b,c,d,e,f -Path infile.csv |
ForEach-Object { if ($_.d -like "voltage1") { $_.a = "#" } $_ } |
ConvertTo-Csv -Delimiter ';' -NoTypeInformation |
Select-Object -skip 1 |
ForEach-Object { $_ -replace '"','' }
输出:
#;OUTPUT;DISCRETE;VOLTAGE1;;
;OUTPUT;DISCRETE;VOLTAGE2;;
@echo off
setlocal EnableDelayedExpansion
rem %1 is full file name
rem %2 is search string
set "n="
for /F "delims=:" %%n in ('findstr /N "%~2" %1') do set /A "n=%%n-1"
if not defined n goto :EOF
< %1 (
rem Copy N-1 lines
for /L %%i in (1,1,%n%) do set /P "line=" & echo !line!
rem Modify target line
set /P "line=" & echo #!line!
rem Copy the rest
findstr "^" 2>NUL
) > output.csv
move /Y output.csv %1