2012-04-07 4 views
0

xml 파일을 읽는이 스크립트가 있습니다. 이 파일은 좌표를 포함하고 내가 좌표를 나열 할 : 당신이 좌표 라인을 참조xml 파일에서 좌표 읽기

14.63778004128814,49.50141683426452,0 14.63696238385996,49.48348965654706,0 14.6 
8840586504191,49.47901033971912,0 14.68589371304878,49.49939179836829,0 14.63778 
004128814,49.50141683426452,0 </coordinates> 
Press and key to continue... 
14.63778004128814,49.50141683426452,0 
Press and key to continue... 

첫째 :

@echo off 
setlocal EnableDelayedExpansion 

FOR %%K IN (*.xml) DO (
SET K=%%K 
SET K=!K:~0,-4! 
SET "prep=0" 

    REM READ DATA 
    FOR /F "tokens=*" %%X IN (!K!.kml) DO (
    if !prep! == 1 (
    echo %%X 
    pause 
     FOR /F %%L IN ("%%X") DO (
     SET L=%%L 
     IF NOT "!L:~0,1!" == "<" (
     echo %%L 
     )  
    ) 
     SET "prep=0" 
    ) 
    if "%%X" == "<coordinates>" (SET "prep=1") 
    ) 
) 

나는 이러한 결과를 얻었다. 둘째, 세 번째 루프에는 좌표가 인쇄됩니다. 하지만 한 쌍의 좌표 만 인쇄됩니다 ... 키를 다시 누르면 배치가 다음 열을 인쇄하지 않고 완료됩니다. 도울 수 있니?

편집 대답이 게시 된 후 우리가 이것을 사용할 수 있습니다, 내가) 질문 1이 : 더 지연 LF 변수가 없을 때

SET LF=^ 


setlocal EnableDelayedExpansion 
... (next code) ... 
set "var=!var: =%LF%!"  

그래서, 우리는 그것을 포함 할 수 있습니다. 안 그래요?

그리고 2) 코드에서

for %%L in ("!LF!") do set "X=!X: =%%~L!" 

당신이 %% 사용 했 왜 ~ L뿐 아니라 %% L

답변

1

귀하의 즉각적인 문제는 FOR/F가의 토큰을 반복하지 않는다는 것입니다 선. 당신이 요구하는 각각의 토큰을 간단히 분석합니다. "토큰"옵션을 지정하지 않으면 기본적으로 "토큰 = 1"- 행의 첫 번째 토큰 만 구문 분석합니다.

그러나 FOR/F는 문자열에 줄 바꿈 문자가 포함되어 있으면 문자열을 여러 줄로 취급합니다. 그런 다음 원하는대로 각 행을 반복합니다. 트릭은 줄 바꿈 문자로 공백 구분 기호를 바꾸는 것입니다. 작업을 수행 할 수있는 여러 가지 방법이 있지만 가장 쉬운 방법이라고 생각합니다.

는 먼저 다음 트릭 줄 바꿈하여 변수에 공백을 대체하는 하나의 라인 피드

set LF=^ 


::The two blank lines above are critical for the definition of the line feed 

을 포함하는 변수를 정의합니다. 일반적으로 치환을 위해 변수를 사용하는 치환은 set "var=!var:search=%replaceVar%!"과 같습니다. 그러나 그것은 LF 변수에서 작동하지 않습니다. 정상 확장을 사용하여 LF 변수로 작업하기가 어렵습니다. 지연된 확장을 사용하는 것이 훨씬 쉽습니다. 지연된 확장 내에서 지연 확장을 포함 할 수는 없지만 LF 값을 간단한 FOR 변수로 전송할 수 있습니다. for %%L in ("!LF!") do set "var=!var: =%%~L!"

코드에 대한 한 가지 사실을 모르겠습니다. 초기 FOR 루프는 모든 .KML 파일. 하위 문자열 작업을 사용하여 확장을 제거합니다. 환경 변수를 사용하지 않고이를 수행하는 훨씬 쉬운 방법이 있습니다 : %%~nK은 확장자가없는 파일의 기본 이름을 제공합니다. 그런데 왜 돌아 서서 확장을 다시 할 때 왜 그렇게합니까?

%% K 값을 직접 사용했습니다. USEBACKQ 옵션을 추가하고 따옴표를 추가하여 파일 이름의 공백을 허용했습니다.

예상하는대로 수행해야하는 코드는 다음과 같습니다.

@echo off 
setlocal EnableDelayedExpansion 

::define a variable containing a linefeed character 
set LF=^ 


::Above 2 blank lines are part of the LF definition, do not remove 

for %%K in (*.kml) do (
    set "prep=0" 
    for /f "usebackq tokens=*" %%X in ("%%K") do (
    if !prep! == 1 (
     echo %%X 
     pause 
     set "ln=%%X" 
     for %%L in ("!LF!") do set "ln=!ln: =%%~L!" 
     for /f %%L in ("!ln!") do (
     set L=%%L 
     if not "!L:~0,1!" == "<" (
      echo %%L 
     ) 
    ) 
     set "prep=0" 
    ) 
    if "%%X" == "<coordinates>" (set "prep=1") 
) 
) 

하지만 더 큰 문제가 있다고 생각합니다. XML을 구문 분석하기 위해 일괄 처리를 사용하여 고통의 세계에 스스로를 설정하고 싶습니다. 당신은 XML이 항상 같은 방식으로 배치 될 것이라고 가정합니다.줄 바꿈 및 공백을 XML 문서에 추가하거나 뺄 때 알고리즘을 손상시킬 수있는 수많은 유효한 방법이 있습니다. 모든 입력 파일이 동일한 출처에서 온 것이고 항상 예상대로 형식화 될 수 있습니까? XSLT를 사용하여 XML 문서를 구문 분석하고 펼친 좌표 목록으로 변환해야합니다.

Answsers

1) set "var=!var: =%LF%!" 작동하지 않습니다 추가 질문에 - LF 정기적으로 확장 시퀀스와 다수의 확장을 탈출해야합니다. 이것은 작동 할 것입니다 : set "var=!var: =^%LF%LF%!"

% LF %의 이스케이프 시퀀스는 매우 까다로워 질 수 있으므로이를 피하려고합니다.

2) for %%L in ("!LF!") do set "X=!X: =%%~L!"에 대해서는 FOR/F가 아닌 간단한 FOR임을 유의하십시오. ! LF! 따옴표를 붙여야합니다. 그렇지 않으면 FOR는 그것을 읽지 않습니다. 그러나 FOR 문은 FOR/F와 달리 따옴표를 유지하므로 따옴표를 제거하려면 %% ~ L이 필요합니다.

줄 바꿈과 관련하여 FOR와 FOR/F 사이에는 매우 중요한 구별이 있습니다. FOR는 따옴표 붙은 줄 바꿈을 유지하지만 FOR/F는 줄 바꿈을 줄 구분 기호로 취급하고 각 줄을 반복하므로 줄 바꿈이 유지되지 않습니다.

+0

감사합니다. 그것은 긴 대답입니다 (솔루션을 대체하는 것은 매우 간단합니다). 나는이 여러 번 나중에 논평 할 것이다. 이제 xml 구문 분석에 대한 주석을 달아주세요. 아니, xml 파서를 만들지는 않겠다. 이 정보 만 필요합니다. 이 XML은 프로그램에 의해 생성되며 항상 동일해야합니다. – user1141649

+0

확장 기능을 제거한 이유는이 코드 뒤에 폴더를 생성하기 때문입니다. 또한 temp /! K! .txt라는 파일에 라인 형식의 좌표를 쓰겠습니다. – user1141649

+0

왜 이런 따옴표를 추가 할 수 없습니까? SET "LF = ^"(줄 바꿈 문자는 여기에 표시됨) – user1141649