2

私が書いていたバットファイルにバグが見つかり、偶然に修正が見つかりましたが、修正が機能した理由がわかりません..最終的には私の質問です.または、このロジックに私が発見していない他の問題があるかどうか.

スクリプトは 2 つ以上のファイルで行数を計算します。目標は、行数が最も少ないファイルを見つけ、後でその数をスクリプト内の変数でパラメーターとして使用することです。

サンプルファイル 1 (9 行):

Wrote,0
Wrote,1
Wrote,2
Wrote,3
Wrote,4
Wrote,5
Wrote,6
Wrote,7
Wrote,8

サンプルファイル 2 (10 行):

Wrote,0
Wrote,1
Wrote,2
Wrote,3
Wrote,4
Wrote,5
Wrote,6
Wrote,7
Wrote,8
Wrote,9

主な違いは、ファイル 2 の 9 行目と 10 行目が 2 桁の行番号であることです。

注:コードは行を解析しようとせず、行数のみを取得するため、各行の実際の値ではなく、行番号のカウント値のみを参照しています。

作成したコードの先頭近くで、各ファイルのカウント値を ~numbers.txt という名前の一時ファイルに追加して、そのプロセスをシミュレートするために、ここで開始コードを次のように仮定します。

echo 9 > ~numbers.txt
echo 10 >> ~numbers.txt
type  ~numbers.txt

これで、「9」と「10」の 2 行のファイルができました。もちろん、9 は 10 よりも小さいですが、10 よりも 1 桁小さい値でもあります。

ここで、最初の行を変数に読み取り、現在の値が以前の値よりも小さいかどうかをループして評価することにより、ファイル ~numbers.txt に含まれる最小の数値を見つけようとします。

setlocal enabledelayedexpansion
set /p lowest=<~numbers.txt

FOR /F "delims=" %%G in (~numbers.txt) DO IF %%G LSS !lowest! SET lowest=%%G
echo  lowest num = %lowest%

このコードを実行すると、間違った次の出力が得られます。

最小数 = 10

私が見つけたのは、FOR ループから"delims="を削除すると、9 という正しい結果が得られるということです。

また、問題に対する私の理解を本当に台無しにしているもの。~numbers.txt の値のみを 10 と 100 に変更し、FOR ループ行をそのままにしておくと ( "delims="を保持)、答えとして正しい値 10 が得られますか???

これは、私のロジックに欠陥があり、他の数値の組み合わせでも異なる結果が得られることを意味するため、悪いことです。

なぜこれが当てはまるのか、および/または値に関係なく正しい最小値を取得する方法の例を誰かに説明できますか?

ありがとう...

4

1 に答える 1

4

何かが見えなくても、それが存在しないというわけではありません。(ここではスペースについて話しています)代わりにこれを試してください:

> ~numbers.txt echo 9<press ENTER immediately>
>> ~numbers.txt echo 10<press ENTER immediately>

これは真の WYSIWYG であり、行末にスペースifがなく、文字列はすべて数字ではないため、テキスト比較はありません。もちろん、既にお気づきのように、デフォルトの delim (そのうちの 1 つがスペース) でスペースを取り除くことも問題なく機能します。

最小行数を決定する次の方法を検討してください。

set /a minlines=0x7FFFFFFF
for /f "tokens=2 delims=:" %%a in ('find /c /v "" *.txt') do set /a minlines="%%a-(minlines-%%a)*(minlines-%%a>>255)"
echo %minlines%

注: ifs なし、遅延展開なし

于 2012-06-07T19:58:10.047 に答える