@echo off
setlocal EnableDelayedExpansion
for /f "delims=; tokens=1-5" %%i in ('type listing.csv') do (
echo %%k | find "CNSHA" > nul
if !errorlevel!==0 echo Searched_Value "CNSHA" was found in %%i: %%j:%%k
)
pause
使用文件listing.csv
我想将搜索结果保存到另一个文件listing2.txt
。
在代码公式>> listing2.txt
中包含哪些代码行来保存排序结果或类似内容?
答案 0 :(得分:2)
您可以在这样的循环中追加文件:
for ... %%i in (...) do (
echo something >> output.txt
echo or other
)
上面只会在输出文件中放入“某些”行,而“或其他”行会打印到控制台。
您还可以通过将重定向运算符放在循环外部来将整个循环输出写入文件:
for ... %%i in (...) do (
echo something
echo or other
) >> output.txt
这会将“某些东西”和“或其他”行放入输出文件中。
请注意,在使用追加重定向运算符(>>
)时,如果您不想保留循环之前存在的内容,则需要截断或删除现有文件:
type nul> output.txt
您可以通过使用写重定向运算符(>
)来避免这一额外步骤,但为此您需要将整个循环放在括号中:
(for ... %%i in (...) do (
echo something
echo or other
)) > output.txt
顺便说一下,您也可以将重定向运算符放在一行的开头,这样做是很好的,因为它可以避免不自觉地在输出行中添加尾随空格:
for ... %%i in (...) do (
>>output.txt echo something
echo or other
)
或
>>output.txt for ... %%i in (...) do (
echo something
echo or other
)
当然你也可以混合使用两种方法(在循环内部和外部重定向),这样你就可以在一个文件中得到一些输出,而在另一个文件中得到其余的输出:
>>output1.txt for ... %%i in (...) do (
>>output2.txt echo something
echo or other
)
如果您希望CSV中的过滤记录作为输出,则需要重建输出行:
>>output.csv echo %%~i;%%~j;%%~k
在您的特定情况下,使用find
而不是使用循环可能更容易:
>output.csv (type input.csv | find ";CNSHA")
既然你也标记了你的问题powershell我也会提出一个PowerShell解决方案,只是为了好的措施:
$headers = 'foo', 'bar', 'baz'
Import-Csv 'input.csv' -Delimiter ';' -Header $headers | Where-Object {
$_.baz -eq 'CNSHA'
} | Export-Csv 'output.csv' -NoType
上面将第3个字段的值为“CNSHA”的所有记录写入新文件。如果您的输入CSV附带标题,请移除-Header $headers
。如果您不想在输出中使用标题,请将Export-Csv
语句更改为类似的内容:
... | ConvertTo-Csv -NoType | Select-Object -Skip 1 | Set-Content 'output.csv'
答案 1 :(得分:0)
假定可能的先前文件listing2.txt应该被覆盖:
@echo off
setlocal
(for /f "delims=; tokens=1-5" %%i in (
'find /i "CNSHA" listing.csv'
) do echo Searched_Value "CNSHA" was found in %%i: %%j:%%k
) >listing2.txt
pause
其他请将>
重定向加倍>>
答案 2 :(得分:0)
你有没有理由不能使用:
Find "CNSHA"<"listing.csv">"listing2.txt"