2012-04-07 6 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") 
    ) 
) 

が、私はこれらの結果を得ました。次に、3番目のループには、座標が印刷されています。しかし、私は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は中のトークンを反復しないということですライン。あなたが求めるトークンを解析するだけです。 "tokens"オプションを指定しないと、デフォルトで "tokens = 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ファイル。部分文字列操作を使用して拡張機能を取り除きます。環境変数を使用せずに行うほうがずっと簡単です:は拡張子のないファイルのベース名を与えます。しかし、なぜあなたは戻って回ってエクステンションをもう一度追加するときにそれをやるのですか?

私は%% 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文書に追加するか、または空白を加えることは、無数の有効な方法があります。すべての入力ファイルが同じソースから来たものであることを確かめて、いつものようにフォーマットされますか? XML文書を解析して座標の裸のリストに変換するには、XSLTを使用する必要があります。追加の質問へ

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パーサを作成するつもりはありません。私はこの1つの情報だけが必要です。このxmlはプログラムによって生成され、常に同じでなければなりません。 – user1141649

+0

拡張を削除した理由は、このコードの後に​​フォルダを作成することです。また、temp /!K!.txtというファイルに行形式の座標を書きます。 – user1141649

+0

なぜこのような引用符を追加できないのですか? SET "LF = ^"(改行文字はここに表示されます) – user1141649

関連する問題