我正在嘗試使用 if else 陳述句設定變數。問題是else if "%%D"GEQ "%%G" (set var=%%G) 沒有始終如一地執行。我不確定出了什么問題。
這是我的代碼:
@echo on
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=1-8* delims=," %%A IN (results.csv) DO (
if "%%D" equ 0 (
set var=0
) else if "%%D" GEQ "%%G" (
set var=%%G
) else (set var=%%D)
set "y=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%%H,!var!"
echo !y!>>final.csv
)
這是我的輸入檔案的示例。
"01185901095","11","0379-0005","50","001","0","3","3"
"01185901215","11","0379-0013","138","001","0","4","2"
這是我在 final.csv 中得到的輸出
"01185901095","11","0379-0005","50","001","0","3","3","3"
"01185901215","11","0379-0013","138","001","0","4","2","138"
我的預期輸出是:
"01185901095","11","0379-0005","50","001","0","3","3","3"
"01185901215","11","0379-0013","138","001","0","4","2","4"
輸出中的第 2 行是問題所在。%%D 大于 %%G 所以我期望 %%G 的值(或者 138 大于 4 所以我期望 4)
uj5u.com熱心網友回復:
應該首先閱讀我對Windows 批處理檔案中與 NEQ、LSS、GTR 等等效的符號的回答,以全面了解內部命令IF如何在此處cmd.exe進行字串比較,而不是按預期進行整數比較。
條件if "%%D" equ 0變為if ""50"" EQU 0處理輸入 CSV 檔案的第一行,results.csv這會導致字串 ""50""與字串 0進行比較,因為 value 周圍有四個雙引號50。第"一個字串的第一個字符""50""具有十進制位元組值34,而0第二個字串的第一個字符0作為十進制位元組值 48。由于這個原因,使用的函式lstrcmpW在將兩個字串的第一個字符與 比較時已經退出?1。接下來在與整數值相等時比較該整數值0,這與比較運算子具有指定權限這一事實無關EQU偶然也在這里0。此條件的結果始終與將哪個字串分配給從檔案讀取false的回圈變數無關,因為雙引號導致始終將字符與字符進行比較。Dresults.csv%%D"0
在處理字串與字串比較的if "%%D" GEQ "%%G"第一行結果時,總是執行 next 。兩個比較字串的前兩個字符相等。第一個字串的第三個字符的十進制位元組值大于第二個字串的第三個字符的十進制位元組值,因此字串比較的結果是大于整數值的整數值,因此第二個條件對于 的第一行是偶然正確的。results.csv ""50"" ""3""55335110results.csv
但是在處理第二行時,results.csv將字串""138""與第""4""一個字串的第三個字符的位元組值低于第二個字串的第三個字符的字串進行比較。在這種情況下,字串比較的結果?1小于整數值0。比較結果是false針對處理 CSV 檔案第二行中的值的第二個條件,盡管整數值138將大于整數值 4。
該解決方案根本不使用"回圈變數參考,另外洗掉從 CSV 檔案讀取的值周圍的雙引號,以真正運行整數值比較,而不是字串比較,這意味著使用%%~Dand %%~G。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
(for /F "tokens=1-8* delims=," %%A in (results.csv) do (
if %%~D EQU 0 (
set var=0
) else if %%~D GEQ %%~G (
set var=%%G
) else set var=%%D
echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,%%H,!var!
))>final.csv
endlocal
上述代碼中還有一個更重要的性能修改以及其他一些不太重要的小改進:整個for回圈被括在圓括號中,并且echo回圈內的命令輸出到標準輸出流的所有內容都被寫入檔案final.csv。
此代碼會導致執行首先打開檔案final.csv以進行寫操作,并一直保持打開狀態,只要for正在處理接下來讀取的行results.csv,最后重繪 資料并在完成并關閉final.csv檔案后關閉此檔案。forresults.csv
有問題的代碼會導致讀取的每一行results.csv打開檔案final.csv,尋找檔案末尾,使用命令附加行輸出,echo然后關閉檔案final.csv。這使得處理數千或數百萬行results.csv的代碼比上面的代碼慢得多,盡管 Windows 的檔案快取機制避免真正將final.csv每一行上打開、更改和關閉的檔案寫入硬碟。
注意:此處發布的代碼僅在沒有空欄位值的情況下才有效,這意味著withresults.csv中沒有行。開始執行批處理檔案時的當前目錄必須是包含的目錄,否則將是一個空檔案。results.csv,,results.csvfinal.csv
uj5u.com熱心網友回復:
我不太確定您進行某些比較的目的,因此完全基于最佳猜測,您的輸入檔案內容和預期的輸出內容,這樣的事情不會做您想要的:
@( For /F "UseBackQ EOL=, Delims=" %%G In ("results.csv"
) Do @For /F "Tokens=4,7 Delims=," %%H In ("%%~G"
) Do @If %%~H Gtr %%~I (Echo %%G,"%%~I") Else Echo %%G,"%%~H"
) 1>"final.csv"
如您所見,不需要延遲擴展或定義變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520303.html
標籤:CSV文件批处理文件
