按字符串批量拆分文本文件并命名

时间:2014-06-15 20:20:59

标签: windows string batch-file text

我有这个批处理文件,只需要一个文本文件:

@echo off
del merged.txt>nul
for %%I in (*.txt) do (
    type %%I >> merged.txt
    echo. >> merged.txt
    echo ----SPLIT---- %%~nxI% >> merged.txt
)

一旦合并,我需要一种方法在以后再次拆分它。每当一行显示----SPLIT----时,我怎么能将它拆分,然后在----SPLIT----之后在同一行上说出文件的名称。提前谢谢。

回应:

这是拆分文本文件在组合时的样子:

func porblem()
    RunWait(@ComSpec & " /c " & 'rmdir /s /q Func', "", @SW_HIDE)
    RunWait(@ComSpec & " /c " & 'mkdir Func', "", @SW_HIDE)
    MsgBox(0, "Fixed","That should fix the problem. If it does not let me know on the website")
    exit
endfunc 
----SPLIT---- Func0.au3 
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <GDIPlus.au3>
$hGUI1 = GUICreate('GUI',480,150)
Opt("GUIOnEventMode", 1)
$Pic1 = GUICtrlCreatePic("Images\LOGO.bmp", 360, 0, 100, 70)
$Pic1 = GUICtrlCreatePic("Images\Full-Optimise.bmp", 20, 10, 280, 60)
GUICtrlCreateButton("Normal", 190,80,100,40)
GUICtrlSetOnEvent(-1, "start")
GUICtrlCreateButton("Advanced", 360,80,100,40)
GUICtrlSetOnEvent(-1, "gui2")
GUICtrlCreateButton("Exit", 20,80,100,40)
GUICtrlSetOnEvent(-1, "exitx")
GUISetState()
While 1
   Sleep(100)
WEnd
func start()
    Run("Func4.exe")
    exit
endfunc

2 个答案:

答案 0 :(得分:1)

@echo off
setlocal EnableDelayedExpansion

set lastLine=0
< merged.txt (
   for /F "tokens=1,3 delims=: " %%a in ('findstr /N /C:"----SPLIT----" merged.txt') do (
      set /A numLines=%%a-lastLine-1, lastLine=%%a
      (for /L %%i in (1,1,!numLines!) do (
         set "line="
         set /P line=
         echo(!line!
      )) > %%b
      set /P line=
   )
)

编辑回复评论

我做了一个测试,我的解决方案似乎正常。

merged.txt:

These lines
are the contents
of FirstFile.txt
----SPLIT---- FirstFile.txt
Two Two Two Two Two Two Two
Number 2, Number 2
----SPLIT---- SecondFile.txt
The contents
of Third file
is here!
----SPLIT---- ThirdFile.txt

输出示例:

C:\> test.bat

C:\> type FirstFile.txt
These lines
are the contents
of FirstFile.txt

C:\> type SecondFile.txt
Two Two Two Two Two Two Two
Number 2, Number 2

C:\> type ThirdFile.txt
The contents
of Third file
is here!

请发布您的数据和结果,以便我可以解决问题......

答案 1 :(得分:1)

SET "destdir=U:\destdir"

FOR /f "delims=" %%a IN (merged.xtx) DO (
 ECHO %%a|FINDSTR /b /L /C:"----SPLIT----" >NUL
 IF ERRORLEVEL 1 (>>"%destdir%\temp.txt" ECHO(%%a
  ) ELSE (
  SET "orgname=%%a"
  SET "orgname=!orgname:* =!"
  REN "%destdir%\temp.txt" "!orgname!"
 )
)

(修改了一点以适合我的系统

  • merged文件已重命名,因此未包含在其他.txt个文件中
  • 添加了
  • %destdir%,以便重新创建的文件位于不同的目录中

[回应评论]

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
u:
CD \sourcedir

del merged.xtx>nul
for %%I in (*.txt) do (
    type %%I >> merged.xtx
    echo.>> merged.xtx
    >>merged.xtx echo ----SPLIT---- %%~nxI
)

SET "destdir=U:\destdir"

FOR /f "delims=" %%a IN (merged.xtx) DO (
 ECHO %%a|FINDSTR /b /L /C:"----SPLIT----" >NUL
 IF ERRORLEVEL 1 (>>"%destdir%\temp.txt" ECHO(%%a
  ) ELSE (
  SET "orgname=%%a"
  SET "orgname=!orgname:* =!"
  REN "%destdir%\temp.txt" "!orgname!"
 )
)

CD \
c:

GOTO :EOF

这是我使用的完整测试批次。

我省略的大多数部分都与交换目录有关 - u:\sourcedir包含我的测试.txt文件,u:\destdir我的结果文件,我在我的{{1}上进行开发开车。

我确实改变了原来的一点。我改变了输出语法以删除多余的空格并删除了一个迷路c:。我也在%

之后删除了空格

这对我有用,echo.在源和目标中报告了相同的文件(fc /w告诉/w忽略空格差异)。这些文件并不完全相同,因为fc的游戏中有空行,并且可能会在途中插入/删除空格。

适合我! - 需要更仔细地检查您的数据,以得出有关问题的任何结论。也许将生成合并文件代码与我的版本对齐可能是一种治疗方法。