2013-10-09 82 views
0

我有一個文本文件,我們將調用info.txt,該文本文件包含許多長行,每個行中都有許多標記,如下所示:批處理腳本,在文本文件中查找字符串並分離成多個輸出文件

A bunch of usless info {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2} 

所以這個文件,我需要找到{Tag15}拉和{TAG11} {Tag15}之間的所有內容,也可能是另一個{Tag15}和數據的片段放到一個新的文本文件英寸所以我有一個15.txt和一個11.txt包含正確的數據段,包括它和下一個標記字符串之間的所有標記。因此,在這個例子中15.txt將包含:

{tag15}data data{Tag1}data {Tag2}data data 
{tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data 
{tag15}data data{Tag1}data {Tag2}data 

而且11.txt將包含:

{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data 
{Tag11}data {Tag1}data {Tag2}data 
{Tag11}data {Tag1}data {Tag2}data data 

話雖這麼說,我可以看到這樣做的最合理的方式是找到所有Tag15的和Tag11,並將它們移動到一個新的行,所以我們不必確定數據集有多長時間,因爲它可以非常適合每個標籤集。通過另一個findstr處理文件,並將每個匹配的線拉出到適當的文件。我不知道該怎麼做的是在找到{tag15}或{tag11}的行中的確切點處插入一條新行。有什麼想法嗎?

總的來說,文本文件將包含大約200-300個這些標籤集,需要解析並分類到合適的txt文件。提前感謝您提供的任何幫助。

我對其他解決方案開放,而不僅僅是批處理,它恰好是我最舒服的。

編輯:

我可以理解爲什麼在這裏需要更多的信息,而對沒有提供它開始與道歉。因此,源文件每行中的代碼段總是以{tag15}或{tag11}開頭,但該代碼段後面的代碼可能因所推送的數據而異,例如,如果Tag2填充的是Y Tag3是必需的,但如果Tag2是N,那麼Tag3將不會存在於該段中,但tag5,6或200可能會存在。這就是爲什麼我覺得最好找到Tag15或11並將它移到自己的行,這樣你就不必依賴試圖確定要移動的字符串的長度。這個例子15.txt和11.txt是爲了說明它可能是什麼樣子,由於每一段不同的數據,但這裏是源文件可能是什麼樣子產生這些:

Line1: FirstLast 55555555 10092013 0000000 {tag15}data data{Tag1}data {Tag2}data data {tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data {Tag11}data {Tag1}data {Tag2}data data data {Tag3}data 
Line2: FirstLast 444444444 10092013 000000005 {Tag11}data {Tag1}data {Tag2}data {tag15}data data{Tag1}data {Tag2}data {Tag11}data {Tag1}data {Tag2}data data 

我的想法是你取這個文件具有所有數據的它,並找到Tag15和TAG11並將其移動到自己的行,以便該文件將是這個樣子:

FirstLast 55555555 10092013 0000000 
{tag15}data data{Tag1}data {Tag2}data data 
{tag15}data data{Tag1}data {Tag2}data data data data {Tag3}data 
{Tag11}data {Tag1}data {Tag2}data data data {Tag3}data 
FirstLast 444444444 10092013 000000005 
{Tag11}data {Tag1}data {Tag2}data 
{tag15}data data{Tag1}data {Tag2}data 
{Tag11}data {Tag1}data {Tag2}data data 

現在,每一行是其自身的段,我們將只需使用Findstr運行一個For循環,並將這些行回顯到正確的txt文件,或者我錯過了什麼?前面提到的我最大的問題是我不確定如何將文件從其原始狀態轉換爲上面的示例,以便可以對它進行排序而無需知道我們嘗試提取的字符串的確切長度。我希望這有助於

+2

請給出一個更好的描述你正在提取什麼和你想要在目標文件中。您在源文件中顯示了一行,並在目標文件中有三行。請清楚地顯示輸入和輸出。 – foxidrive

+1

我同意foxidrive。我無法理解你如何從邏輯上期望從發佈的一行輸入中獲得你的15.txt和11.txt輸出。 – dbenham

+0

沒有模式。例如:關於「{Tag3}」呢?或者,在{tag15}數據數據{Tag1}數據{Tag2}數據數據中,最後一個數據是從哪裏來的?需要Mor說明。 – Endoro

回答

0

所以我結束了使用一個工具,我有點更舒適和安裝Sed的Windows。我從使用AWK的建議中得到了這個想法。由於此腳本只能在一個地方運行,因此我決定安裝非本地工具不是問題。這是我想出來解決這個問題:

Set sed=(the path to sed.exe for windows) 
set filedir=Dir the source file is in 
set file=name of source file 
set wout=tag15.txt 
set win=tag11.txt 

:: Locate "FTI0811 " which occurs prior to every {Tag15} tag and call a new line 
%sed% -i -c --expression="s/FTI0811 /&\n/g" %filedir%%file% 
:: Locate XFT811 which occurs prior to every {Tag11} tag and call a new line 
%sed% -i -c --expression="s/XFT811 /&\n/g" %filedir%%file% 
:: Find all strings that start with {Tag15} and echo them out to the Wires Out file variable 
findstr "{tag15}" %filedir%%file% >> %wout% 
:: Find all strings that start with {tag11} and echo them out to the Wires In file variable 
findstr "{tag11}" %filedir%%file% >> %win% 

謝謝大家的幫助和想法。請隨時編輯/評論我的做法,我總是非常樂意得到反饋。對不起,這個問題有些模糊,由於我的工作,我無法發佈整個源文件及其包含的內容。再次感謝!

0

此使用名爲repl.bat一個輔助批處理文件從 - http://www.dostips.com/forum/viewtopic.php?f=3&t=3855

repl.bat在同一文件夾中的批處理文件和文本文件。

對您的文件樣本嘗試執行此命令 - iix將使其不區分大小寫,因爲您的標籤處於不同的情況。

type file.txt |repl "{tag15}" "\r\n{tag15}" ix |repl "{tag11}" "\r\n{tag11}" ix >newfile.txt 

該任務仍然非常泥濘/不清楚。

相關問題