2014-01-13 54 views
1

我想創建一個批處理文件,將讀取包含類似內容的TXT文件(它都將在1號線):批處理腳本 - 閱讀文本文件,查找Usful文字,寫新的文本文件

"http://schemas.google.com/g/2005#event"}],"title":{"$t":"Test Begins","type":"text"},"content":{"$t":"","type":"text"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid=XzhkOWxjZ3JmZHByNmFzams2MWhtNGU5azY4c200cDfr45yxN65kYjE2cGhqNGMxbDY4cjNjZWIxYzhwamNlMzE2Z28wIGFkbWluQGJodWpkaGFtLm9yZw","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/admin%40test.org/public/full/_8d9lcgrfdpr6asjk61hm4e9k68sm4p336oq62db16phj4c1l63erceb1c8pjce316go0"}],"author":[{"name":{"$t":"[email protected]"},"email":{"$t":"[email protected]"}}],"gd$comments":{"gd$feedLink":{"href":"http://www.google.com/calendar/feeds/admin%40test.org/public/full/_8d9lcgrfdpr6asjk61hm4e9k68sm4p336oq62db16phj4c1l68r3ceb1c8pjce316go0/comments"}},"gd$eventStatus":{"value":"http://schemas.google.com/g/2005#event.confirmed"},"gd$where":[{"valueString":""}],"gd$who":[{"email":"[email protected]","rel":"http://schemas.google.com/g/2005#event.organizer","valueString":"[email protected]"}],"gd$when":[{"endTime":"2014-01-17","startTime":"2014-01-16"}],"gd$transparency":{"value":"http://schemas.google.com/g/2005#event.opaque"},"gCal$anyoneCanAddSelf":{"value":"false"},"gCal$guestsCanInviteOthers":{"value":"true"},"gCal$guestsCanModify":{"value":"false"},"gCal$guestsCanSeeGuests":{"value":"true"},"gCal$sequence":{"value":0},"gCal$uid":{"value":"CSVConvert0cb9429bdc64a5a6c2052669ab368a40"}},{"id":{"$t":"http://www.google.com/calendar/feeds/admin%40test.org/public/full/_8d9lcgrfdpr6asjk6hh3gphjccpmaphg6opj0d316sq34cj570p3ic1j6grj4opgcoog"},"published":{"$t":"1900-01-01T12:00:00.000Z"},"updated":{"$t":"2013-08-20T11:13:33.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term": 

以上是這種文本塊的一個實例的示例,真正的文件可能有多個這樣的塊。

我想要做的就是批處理腳本讀取該文件,並在找到「稱號」:{「$ T」:「測試開始」,「類型」:「文本」}我想測試開始(在上面的示例中,但它可以是實際文件中的任何文本)存儲在變量中。

腳本應該繼續閱讀文本文件UTIL它遇到」,‘開始時間’:‘2014年1月16日’}],‘GD $透明度’這裏我要存儲到一個變量的日期

現在我們有了第一雙變量,我希望他們能夠被寫入一個文本文件中的格式如下:

[日期] [文]

它一直這樣做,直到它到達正在讀取文件的末尾。

我幾個月來一直在嘲弄我的頭,我通常喜歡不加擾亂的人學習它,但我不能讓我的頭在這附近。

您的幫助將不勝感激。

回答

1

對於此問題,批處理不是一個好選擇,因爲它通常不能處理超過8191個字符的字符串,並且您的問題看起來像可能輕易超過該限制。

一個好的選擇是某種正則表達式處理器。 sed或awk的Windows端口可能會運行良好。那裏有免費的版本。我寫過REPL.BAT - a hybrid JScript/batch utility that performs a regex search and replace on stdin and writes the result to stdout。它是純粹的腳本,可以在任何現代Windows機器上運行,無需任何第三方可執行文件。完整的文檔嵌入在腳本中。

假設REPL.BAT在你的當前目錄中,或者更好,在你的PATH中的某個地方,下面的應該可以做到。

@echo off 
setlocal 
set "search=.*?\qtitle\q:{\q\$t\q:\q(.*?)\q,\qtype\q:\qtext\q}.*?\q,\qstartTime\q:\q(.*?)\q}],\qgd\$transparency\q" 
type "input.txt" | repl "%search%" "$&\r\n" x | repl "%search%" "[$2][$1]" xa >"output.txt" 

我最終使用REPL兩次,第一次插入在每個組塊的末尾的新線,並且在第二時間從每個所得的行解壓縮的值。似乎應該有一個步驟的解決方案,但我無法弄清楚。響應


更新評論

我也寫getTimeStamp.bat - a hybrid JScript/batch utility to compute and format date and time information。假設getTimeStamp.bat位於當前目錄或PATH中,則以下內容將提供您所需的格式。

@echo off 
setlocal 
set "search=.*?\qtitle\q:{\q\$t\q:\q(.*?)\q,\qtype\q:\qtext\q}.*?\q,\qstartTime\q:\q(.*?)\q}],\qgd\$transparency\q" 
>"output.txt" (
    for /f "tokens=1,2 delims=[]" %%A in (
    'type "input.txt" ^| repl "%search%" "$&\r\n" x ^| repl "%search%" "[$1][$2]" xa' 
) do (
    set "txt=%%A" 
    set "dt=%%B" 
    setlocal enableDelayedExpansion 
    call getTimeStamp -d "'!dt:-=/!'" -f "{wkd} {dd} {mth}" -r dt 
    echo [!dt!][!txt!] 
    endlocal 
) 
) 

響應於評論說已被刪除

最後更新我添加一個附加REPL以汽提出初始"title":{"$t":"Unwanted Text","type":"text"}

@echo off 
setlocal 
set "skipSearch=\qtitle\q:\{\q\$t\q:\q.*?\q,\qtype\q:\qtext\q\}((\s|\S)*)" 
set "search=.*?\qtitle\q:\{\q\$t\q:\q(.*?)\q,\qtype\q:\qtext\q\}.*?\q,\qstartTime\q:\q(.*?)\q}],\qgd\$transparency\q" 
>"output.txt" (
    for /f "tokens=1,2 delims=[]" %%A in (
    'type "input.txt" ^| repl "%skipSearch%" "$1" mx ^| repl "%search%" "$&\r\n" x ^| repl "%search%" "[$1][$2]" xa' 
) do (
    set "txt=%%A" 
    set "dt=%%B" 
    setlocal enableDelayedExpansion 
    call getTimeStamp -d "'!dt:-=/!'" -f "{wkd} {dd} {mth}" -r dt 
    echo [!dt!][!txt!] 
    endlocal 
) 
) 

另一種選擇,假定「日曆「絕不是虛擬值,應始終放棄,是使用負面向前看功能來防止墊子清日曆。

@echo off 
setlocal 
set "search=.*?\qtitle\q:\{\q\$t\q:\q(?!Calendar\q)(.*?)\q,\qtype\q:\qtext\q\}.*?\q,\qstartTime\q:\q(.*?)\q}],\qgd\$transparency\q" 
>"output.txt" (
    for /f "tokens=1,2 delims=[]" %%A in (
    'type "input.txt" ^| repl "%search%" "$&\r\n" x ^| repl "%search%" "[$1][$2]" xa' 
) do (
    set "txt=%%A" 
    set "dt=%%B" 
    setlocal enableDelayedExpansion 
    call getTimeStamp -d "'!dt:-=/!'" -f "{wkd} {dd} {mth}" -r dt 
    echo [!dt!][!txt!] 
    endlocal 
) 
) 
+0

@debenham,你是一個天才;完美的作品!哇!!!我會稍微玩一下它,以便日期格式是我不想要的,理想情況下我想將它改爲「1月14日星期二」而不是當前的「2014-01-14」 如果我不能這樣做,我會回覆。 再次,驚人的幫助,非常感謝。 – user3191135

+0

好,所以一旦我看了腳本,方括號和命令就變得輕而易舉了。 所以現在只有解決日期問題,並找到某種方式讓它忽略所需的第一次出現,這一直是相同的,所以我不需要它。 – user3191135

+0

@ user3191135 - 糟糕,我錯過了訂單問題。固定。使用另一個混合腳本查看我的更新答案,獲取簡單日期格式解決方案本地批處理也不能很好地處理日期或時間。我不明白「第一次發生所需」 - 也許這是一個新問題。 – dbenham

相關問題