2017-03-18 40 views
0
@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中包含哪些代碼行以保存排序結果或類似內容?從外部listing.csv文件,並插入結果txt文件>>排序listing2.txt

screenshot

+0

我已經格式化您的代碼,但它似乎看起來不正確,如果它是錯誤的,可以請你編輯它,以便潛在的響應者可以這樣做。 – Compo

+2

請避免張貼鏈接到外部資源。如果他們的內容與你的問題相關:把你的問題的內容。否則,不要打擾張貼鏈接。 –

+0

完成 - 只是刪除此鏈接 - 感謝您的指導 –

回答

0

是否有一個理由,爲什麼你不能只使用:

Find "CNSHA"<"listing.csv">"listing2.txt" 
+0

我會看到你在哪裏添加代碼這一行你提到過。這是解決方案,但我會嘗試擴展可能更多的項目從%% i-至%% z列。無論如何非常感謝您的建議 –

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 

Otherwse雙>重定向到>>

+0

感謝您對codu和幫助進行修改。 這最後一行)> listing2.txt /)>> listing2.txt它允許您保存結果(解決方案)不能使用沒有你的修改。我不必要地使用:行 if!錯誤級別! == 0 echo Searched_Value「CNSHA」在%%和%% j %% k.-中找到,這可能會傷害記錄到txt。 再次感謝你,祝你週末愉快。 –

2

您可以附加到文件就像一個循環內這個:

for ... %%i in (...) do (
    echo something >> output.txt 
    echo or other 
) 

上面的內容只會在輸出文件中放入「something」行,而「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作爲輸出濾波的記錄,你需要與r econstruct輸出線,雖然:

>>output.csv echo %%~i;%%~j;%%~k 

在您的特定情況下可能更容易,只需使用find而不是用一個循環工作:

>output.csv (type input.csv | find ";CNSHA") 

既然你還標記了你的問題我也想拋出一個PowerShell的解決方案,只是爲了好的措施:

$headers = 'foo', 'bar', 'baz' 
Import-Csv 'input.csv' -Delimiter ';' -Header $headers | Where-Object { 
    $_.baz -eq 'CNSHA' 
} | Export-Csv 'output.csv' -NoType 

以上內容將第三個字段的值爲「CNSHA」的所有記錄寫入新文件。如果您的輸入CSV帶有標題,請刪除-Header $headers。更改Export-Csv聲明是這樣的,如果你不想在輸出頭:

... | ConvertTo-Csv -NoType | Select-Object -Skip 1 | Set-Content 'output.csv' 
+0

來自你的非常寶貴的建議。明天我會嘗試做同樣的事情,但沒有循環只能找到命令。感謝您的支持和幫助 –

+0

我喜歡這個解釋!+1我只是補充一點,你也可以使用多個_standard handles_:'for ... %% i in(...)do('&')來將輸出重定向到不同的文件中, echo'something&'>&2 echo or other'&')> output1.txt 2> output2.txt' – Aacini

+1

只有在將括號括在括號內時,才能重定向整個循環:'(for %% I in(... )do(...))> file.ext' – aschipfl