2014-09-02 30 views
0

我有這個批處理腳本即時通訊工作,重點是從XML中提取某些信息並在文本文件中輸出結果。我能夠使它工作,但我希望我的結果出來。用批處理文件製作一行結果?

@echo off 
setlocal EnableDelayedExpansion 

(for /F "delims=" %%a in ('findstr /I /L "<XOrigin> <YOrigin> <XExtent> <YExtent>" grid_crawler_output.xml') do (
    set "line=%%a" 
    set "line=!line:*<XOrigin>=!" 
    set "line=!line:*<YOrigin>=!" 
    set "line=!line:*<XExtent>=!" 
    set "line=!line:*<YExtent>=!" 
    for /F "delims=<" %%b in ("!line!") do echo %%b 
)) > result.txt 

我的結果是

502800 
928000 
23650 
30750 

我想它出來

502800,928000,23650,30750 

任何幫助嗎?

來源的信息

- <Projection> 
    <Mapsheet /> 
    <Projection /> 
    <CentralMeridian>0</CentralMeridian> 
    <Spheroid /> 
    </Projection> 
    <MaprecordProjection /> 
- <CoordinateInfo> 
    <CoordinateType>Rectangular</CoordinateType> 
    <GridType>Unrotated</GridType> 
    <XOrigin>502800</XOrigin> 
    <YOrigin>928000</YOrigin> 
    <XExtent>23650</XExtent> 
    <YExtent>30750</YExtent> 

的XLM文件

- <Projection> 
    <Mapsheet /> 
    <Projection /> 
    <CentralMeridian>200</CentralMeridian> 
    <Spheroid /> 
    </Projection> 
    <MaprecordProjection /> 
- <CoordinateInfo> 
    <CoordinateType>Rectangular</CoordinateType> 
    <GridType>Unrotated</GridType> 
    <XOrigin>114438</XOrigin> 
    <YOrigin>863252</YOrigin> 
    <XExtent>534000</XExtent> 
    <YExtent>404000</YExtent> 
    </CoordinateInfo> 
+0

如何向我們展示生成您發佈的報告的源數據? – Magoo 2014-09-02 14:13:24

+0

我根據您的要求編輯了信息。 – Alex 2014-09-02 14:20:30

回答

0
@echo off 
setlocal EnableDelayedExpansion 
SET "build=" 
for /F "delims=" %%a in ('findstr /I /L "<XOrigin> <YOrigin> <XExtent> <YExtent>" q25624153.txt') do (
    set "line=%%a" 
    set "line=!line:*<XOrigin>=!" 
    set "line=!line:*<YOrigin>=!" 
    set "line=!line:*<XExtent>=!" 
    set "line=!line:*<YExtent>=!" 
    for /F "delims=<" %%b in ("!line!") do SET "build=!build!,%%b" 
    set "line=%%a" 
    set "line=!line:*<YExtent>=!" 
    IF "%%a" neq "!line!" ECHO(!build:~1!&SET "build=" 
) 

GOTO :eof 

我用了一個包含您的數據,我的測試命名爲q25624153.txt文件,並省略了重定向到輸出文件。

你沒有說明這組行是否可以在你的文件中重複,但是如果存在多個Xorigin..Yextent集,這個例程將產生每個找到的塊中的每個集合。它假定所需數據行的順序將是恆定和完整的。

+0

是的,我完全忘記明確表示這一點。但是,您的假設是正確的,我確實需要它來掃描每個塊並檢索數據。你的建議是正確的。謝謝! – Alex 2014-09-02 16:06:31

0

怎麼樣把所有的數據到單一變量,然後回顯到文件中的另一塊剪斷?

@echo off 
setlocal EnableDelayedExpansion 

(for /F "delims=" %%a in ('findstr /I /L "<XOrigin> <YOrigin> <XExtent> <YExtent>" grid_crawler_output.xml') do (
    set "line=%%a" 
    set "line=!line:*<XOrigin>=!" 
    set "line=!line:*<YOrigin>=!" 
    set "line=!line:*<XExtent>=!" 
    set "line=!line:*<YExtent>=!" 
    for /F "delims=<" %%b in ("!line!") do set "out=!out!%%b," 
)) 
echo %out% > result.txt 
+0

我跑了它,它說吐出「ECHO關閉」的文本文件。 – Alex 2014-09-02 13:44:20

+0

*它吐出「回聲是關閉的」 – Alex 2014-09-02 13:50:24

+0

對不起,第二次丟失集合 – rostok 2014-09-02 14:07:29

0

與其他發佈的答案一樣,此解決方案高度依賴於XML源的格式。格式可以很容易地改變成仍然有效的XML的等價形式,但它會破壞解決方案。理想情況下,您應該使用爲解析XML而構建的工具。

話雖這麼說...

這是一個純粹的批量解決方案,它最小的字符串操作。它依賴於</CoordinateInfo>將遵循每個座標塊的事實。

@echo off 
setlocal enableDelayedExpansion 
set "in=grid_crawler_output.xml" 
set "out=result.txt" 
set "ln=" 
(
    for /f "tokens=1,2 delims=<> " %%A in (
    'findstr /il "<XOrigin> <YOrigin> <XExtent> <YExtent> </CoordinateInfo>" "%in%"' 
) do if "%%A"=="/CoordinateInfo" (
    echo(!ln:~0,-1! 
    set "ln=" 
) else set "ln=!ln!%%B," 
)>"%out%" 

如果輸入較大,上面的代碼可能會變得很慢。

下面是另一個選項,可以非常有效地處理非常大的輸入文件。它依賴a hybrid JScript/batch utility called REPL.BAT執行stdin上的搜索/替換並將結果寫入stdout。 REPL.BAT是純粹的腳本,可以在XP以後的任何現代Windows機器上運行。

該解決方案可以寫成長一行。我選擇了定義一些變量來幫助更好地顯示邏輯。

@echo off 
setlocal 
set "in=grid_crawler_output.xml" 
set "out=result.txt" 
set "search=<XOrigin> <YOrigin> <XExtent> <YExtent>" 
set "val=[\s\S]*?>(.*?)<.*" 
findstr /il "%search%" "%in%"|repl "%val%%val%%val%%val%" "$1,$2,$3,$4\r\n" mx >"%out%"