2012-02-13 3 views
0

XML 파일을 구문 분석하고 추출 된 데이터 (압축을 푼 파일)가있는 파일을 만드는 배치 스크립트가 있습니다.방금 ​​만든 파일을 처리 할 때 마지막 줄이 왜 처음입니까?

동일한 배치 스크립트에서 추출한 파일을 사용하여 SQL 명령 (SQL 파일)이있는 파일을 만듭니다.

SQL 파일을 만들 때 추출 된 파일의 마지막 레코드 (줄)가 먼저 나오고 명령문이 올바르게 작성됩니다.

마지막 레코드를 가져 오는 것을 중단하려면 어떻게해야합니까? buildsql?

@echo off 
echo Beginning parsing of XML files for pagecount and docid extraction. 
echo Processing... 
SET /A counter = 0 
FOR /F %%i IN (CDIZeroPage.TXT) DO (
    IF EXIST %%i (
    FOR /F "tokens=12 delims==" %%h IN (%%i) DO (CALL :pagestring %%h) 
    FOR /F "tokens=8 delims==" %%g IN (%%i) DO (CALL :docidstring %%g) 
) 
) 
goto buildsql 

:pagestring 
    echo %1 >> C:\Richtemp\PagesandDocs.txt 
    CALL set page=%1 
goto :eof 

:docidstring 
    echo %1 >> C:\Richtemp\PagesandDocs.txt 
    CALL SET docid=%1 
    SET /A counter+=1 
goto :eof 

:buildsql 
echo End extracting pagecount and docid. 
echo Number of files processed %counter% 
echo  
echo Begin building SQL 
echo Processing... 
SET /A counter=0 
SET /A countbytwo=0 
FOR /F %%i IN (PagesandDocs.txt) DO (
    CALL :subroutine %%i 
    SET /A counter+=1 
) 
goto endofscript 

:subroutine 
    SET /A countbytwo+=1 
    IF %countbytwo%==1 (
    FOR /F "DELIMS=" %%G IN ('ECHO %1') DO (SET page=%%~G) 
    echo Update documents set pagecount = %page% >> C:\Richtemp\Update.txt 
) 
    IF %countbytwo%==2 (
    FOR /F "DELIMS=" %%G IN ('ECHO %1') DO (SET docid=%%~G) 
    echo where uniqueid = %docid% ^; >> C:\Richtemp\Update.txt 
    SET /A countbytwo=0 
) 
goto :eof 

:endofscript 
    SET /A counter/=2 
    echo End building sql, number of scripts built %counter% 

:eof 

답변

1

귀하의 문제는 여기에 있습니다 : 위의 코드에서

:docidstring 
    echo %1 >> C:\Richtemp\PagesandDocs.txt 
    CALL SET docid=%1 
    SET /A counter+=1 
goto :eof 

, 당신은 DOCID 설정합니다. 첫 번째 처리 단계가 끝날 때 마지막 줄은 docid에 저장됩니다. 그럼 당신은 buildsql를 호출 문제는 여기에 있습니다 :

IF %countbytwo%==2 (
    FOR /F "DELIMS=" %%G IN ('ECHO %1') DO (SET docid=%%~G) 
    echo where uniqueid = %docid% ^; >> C:\Richtemp\Update.txt 
    SET /A countbytwo=0 
) 

당신은 echo 방금 ​​설정 docid을 사용하는 것입니다 생각, 불행하게도이 아니다. 확장에서 이전에 대체 된 의 대체 값 ... 첫 번째 호출에서 마지막 행을 나타냅니다. page 변수에서 정확히 같은 오류가 발생합니다.

지연 확장을 사용하여이 문제를 해결할 수 있지만 코드가 지나치게 복잡해 보입니다. 정확히 달성하기를 원하십니까? 처음에 다음 # 8 모든 # 12, 및 오프로드 때문에 의도 한대로

Update documents set pagecount = #12 where where uniqueid = #8; 

가 작동하지 않습니다 : 의도는 라인에 위치 12,8에서 항목을 추출하고이 같은 쿼리 식을 구축 할 수 있었다면 파일.

어쩌면이게 효과가 있을까요?

setlocal 
    FOR /F %%i IN (CDIZeroPage.TXT) DO (
    FOR /F "tokens=8-12 delims==" %%j IN (%%i) do (
     ECHO Update documents set pagecount = %%n where where uniqueid = %%j ^; >>update.txt 
     SET /A counter+=1 
    ) 
) 
echo End building sql, number of scripts built %counter% 
+0

예, 지나치게 복잡했습니다. 나는 그것을 슬림 화하여 한꺼번에 두 파일을 썼다. 나는 왜이 판에서 마지막 기록이 처음으로 쓰여졌는지를 판단 할 수 없었다. 설명해 주셔서 감사합니다. 스크립트 작성에 도움이 될 것입니다. –

관련 문제