批处理文件:在文件中查找字符串并将字符写入行首



我有一个。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

相关内容

最新更新