2016-12-20 136 views
1

我以前用過簡單的批處理文件來查找單個txt文件中的字符串併合並多個txt文件,但是這個更復雜一點,我不確定在哪裏開始。批處理文件返回文件名和多個字符串

這裏是一個休息的什麼我試圖做下來:

有300多個txt文件

一個文件夾下的txt文件至少有一個,但也許上百串的出現的「 documentID:「,後面有6個章程。

想要txt文件或與txt文件的文件名一個CSV,併爲每字符串「documentID:」時間在TXT文件中找到 - 6個以下字符

實施例:

jsmith.txt:

<type>not needed</type> 
<version>1.0</version> 
not needed,not needed, not needed, documentID:NEED01, not needed 
not needed,not needed, not needed, documentID:NEED02, not needed 

jdoe.txt

<type>not needed</type> 
<version>1.0</version> 
not needed,not needed, not needed, documentID:NEED03, not needed 

希望的輸出:

new.txt

jsmith, NEED01, NEED02 
jdoe, NEED03 
+1

這是某種形式的混合XML的文件?每個文檔ID是否在自己的行上?它總是在第四個逗號分隔的字段中嗎? – Squashman

+0

是的這些都是XML文件(但爲了輸出的需要使他們txt文件) - 所需的內容並不總是在第四個領域,有時有更多或更少的領域。 – PaperClip

回答

1
@echo off 
setlocal EnableDelayedExpansion 

for %%A in (*.txt) do (
    set "out=" 
    for /f "usebackq tokens=*" %%B in (`findstr /rc:"documentID:[^^,]*" "%%A"`) do (
     set "str=%%B" 
     set "val=!str:*documentID:=!" 
     set "tail=!val:*,=!" 
     call set "res=%%val:,!tail!=%%" 
     set "out=!out!, !res!" 
    ) 
    echo %%~nA!out! 
) 

endlocal 


Rem For mentioned jsmith.txt and jdoe.txt will output 
Rem 
Rem jdoe, NEED03 
Rem jsmith, NEED01, NEED02 

通過在當前目錄中的所有文件*.txt第一for循環迭代。

第二個for循環遍歷findstr命令的輸出。

findstr命令將使用documentID:*,模式查找字符串。 documentID字是區分大小寫的。 ,符號應該遵循該模式。

set "val=!str:*documentID:=!"命令擦除找到的字符串的開始和documentID:字。

set "tail=!val:*,=!"命令接收documentID:*,模式後的所有符號。

call set "res=%%val:,!tail!=%%"命令提取documentID:之後的值。

+0

不錯的解決方案+1,爲什麼不使用'!val:〜0,6!'而不是tail和res? – LotPings

+0

不成熟的優化:)對於ID的長度可變的情況。 –

+0

非常感謝您的意見!我會在下週的星期二試試這個(假期休息時間),並且告訴你它是如何解決的......但是你的解釋很有意義。謝謝! – PaperClip

0

下面的腳本你想要做什麼,假設每一個需要串部分是在其自己的行:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_LOCATION=%~dp0." & rem // (path to the directory containing the input files) 
set "_PATTERN=*.txt"  & rem // (pattern the input files need to match) 
set "_PREFIX=documentID:" & rem // (string that precedes the needed string portion) 
set "_SEPAR=, "   & rem // (field separator for both input and output files) 

rem // Loop through all matching input files: 
for %%F in ("%_LOCATION%\%_PATTERN%") do (
    rem // Initialise collection variable with the name of the currently iterated file: 
    set "COLLECT=%%~nxF" 
    rem // Search current file for predefined prefix and loop over all applicable lines: 
    for /F delims^=^ eol^= %%L in ('findstr /C:"%_PREFIX%" "%%~F"') do (
     rem // Store currently processed line: 
     set "ITEM=" & set "LINE=%%L" 
     rem // Toggle delayed expansion to not lose any exclamation marks `!`: 
     setlocal EnableDelayedExpansion 
     rem /* Split off the prefix and everything in front of it, then split off the 
     rem next separator (regard first character only) and everything behind: */ 
     for /F "delims=%_SEPAR:~,1% eol=%_SEPAR:~,1%" %%K in ("!LINE:*%_PREFIX%=!") do (
      endlocal 
      set "ITEM=%%K" 
      setlocal EnableDelayedExpansion 
     ) 
     rem /* Append extracted string portion to collection variable and transport the 
     rem result over the `endlocal` barrier using the `for /F` command: */ 
     for /F "delims= eol=:" %%K in ("!COLLECT!%_SEPAR%!ITEM!") do (
      endlocal 
      set "COLLECT=%%K" 
     ) 
    ) 
    rem // Return the collected line for the currently iterated file: 
    setlocal EnableDelayedExpansion 
    echo(!COLLECT! 
    endlocal 
) 

endlocal 
exit /B 

存儲結果在文本文件中,使用重定向;例如,該腳本保存爲merge-files.bat和生成的文本文件應該是D:\result\new.csv,這樣調用腳本:

merge-files.bat > "D:\result\new.csv" 
相關問題