2012-06-07 1 views
2

내가 작성한 버그 파일에서 버그를 발견했지만 실수로 수정본을 찾았지만 해결 된 이유를 이해할 수 없습니다 궁극적으로 내 질문입니다 , 또는 내가 발견하지 못한이 논리에 다른 문제가있는 경우.DOS - 구분선이 가장 낮은 행 개수의 inf 파일을 찾으려고 시도 중

스크립트는 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 

주요 차이점 I 볼 라인 파일 2 9 & 10 점이다 두 디지트 라인 번호

참고 : 참고 : 각 라인의 실제 값은 아니지만 라인 번호의 카운트 값 내 코드는 줄을 구문 분석하지 않고 줄 수만 가져옵니다. 내가 지금 여기에 그 과정을 시뮬레이션 내 시작 코드를 가정하는 ~ numbers.txt라는 임시 파일에 각 파일의 카운트 값을 추가 한 후 생성 코드의 상단 부근

은 다음과 같습니다

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

그래서 지금 "9"와 "10"두 줄의 파일이 있고 물론 9는 10보다 낮지 만 10보다 작은 한 자리입니다.

이제 파일 ~ 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

내가 발견 한 것은 그 나는 를 제거하는 경우 "delims = " for 루프에서 올바른 결과를 얻으려고합니다.

ALSO d는 문제에 대한 나의 이해를 정말로 망쳐 놓는다. ~ numbers.txt의 값을 10과 100으로 변경하고 FOR 루프 회선 만 그대로두면 ("delims =") 그러면 올바른 값은 10이됩니다. ???

이것은 내 논리에 결함이 있으며 다른 숫자 조합도 다른 결과를 산출하기 때문에 바람직하지 않습니다.

아무도 나에게 이유를 설명 할 수 있습니까? 그리고/또는 값에 관계없이 가장 낮은 수를 얻는 방법에 대한 예를 들려 줄 수 있습니까?

감사합니다 ...

답변

4

아무 것도 표시되지 않는다면 그것이 존재하지 않는다는 의미는 아닙니다. 대신 시도 (내가 여기에 공백 말하는거야)

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

이 진정한 WYSIWYG, 줄의 끝에 공백이 될 것입니다, if 없음 텍스트 비교는 문자열은 모든 숫자는 아니다 없기 때문입니다. 물론 기본 delim (하나는 공백 임)으로 공백을 제거하는 것은 이미 눈치 챘 듯이 잘 작동합니다.

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, 아니 지연 확장

+1

+1, 좋은 캐치

최저 라인 수를 결정하는이 방법을 고려하십시오. 비교 연산자 앞뒤의 여분의 공백은 일반적으로 중요하지 않습니다. 그러나 그들은 %% G 또는! 비교할 값. 파서가 작동하는 방식 때문에 % var % 확장을 사용하면 문제가되지 않는다는 것이 흥미 롭습니다. 물론 지연된 확장은 루프에 있기 때문에 사용해야합니다. – dbenham

+0

그래서 내가 올바르게 이해한다면 ... "delims ="이 경우의 기본 방법이 아닌가? 이 NOT을 FOR 루프에 포함시키는 것이 공백을 계산하지 않는 기본 방법일까요? 이 문맥에서 "delims ="이 나를 위해 행하는 것에 무엇을 사용하고, 왜 내가 그런 식으로 사용하겠습니까? 아니면 내가 처음에 그 행을 쓰는 방식으로 그것을 사용하는 것이 완전히 잘못 되었습니까? 나는 아직도이 예제를 웹에서 얻었으므로 축 어적으로 예제를 사용하는 것이 정확하지 않을 수 있습니다. 감사합니다 ... – LabRat

+0

아니요, 기본 delim은 공백과 표입니다. delim = "delims는 없으므로 공백이 문자열의 일부로 유지됩니다. –

관련 문제