Board logo

标题: [文本处理] [已解决]批处理怎样实现文本文件合并,处理后分割? [打印本页]

作者: qixiaobin0715    时间: 2018-9-20 15:55     标题: [已解决]批处理怎样实现文本文件合并,处理后分割?

文件夹中有若干个文本文件,如何实现合并为一个文件,用“查找”“替换”处理后,再按原来的文件内容分割。
合并时将原来的文件名插入到各文件内容的第一行并在行首加特殊符号(如@)作为标记。
将“@+原文件名”作为分割后的文件名,并删除此行。
求助满足以上操作的两个批处理。
作者: 窄口牛    时间: 2018-9-20 17:51

直接第三方批量查找替换
作者: Batcher    时间: 2018-9-20 20:35

先合并的目的是什么?直接单独处理每个文件不行吗?
作者: qixiaobin0715    时间: 2018-9-20 20:45

回复 3# Batcher

文本文件较多,每个文件夹中的文本格式近似,需多次替换。不同文件夹文件替换替换方式又不尽相同,想合并后用EmEditor统一处理后,再分割。
作者: Batcher    时间: 2018-9-20 21:14

回复 4# qixiaobin0715


    这样的话,是需要把每个文件夹下的多个文件合并成一个文件,而不是把所有文件夹下的所有文件合并成一个文件是吧?
作者: qixiaobin0715    时间: 2018-9-20 21:33

yes,谢谢!
作者: Batcher    时间: 2018-9-20 21:42

合并.bat
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /ad') do (
  3.     (for /f "delims=" %%j in ('dir /b /a-d "%%i\*.txt"') do (
  4.         echo @%%j
  5.         type "%%i\%%j"
  6.         echo,
  7.     ))>"%%i\合并.log"
  8. )
复制代码

作者: hlzj88    时间: 2018-9-21 06:01

  1. @echo off&&setlocal enabledelayedexpansion
  2. del /q 完毕.ini
  3. for /f %%g in ('dir /b/on *.txt') do (
  4. for /f "delims=" %%i in ("%%g") do (
  5.     set "too=%%i"
  6.     set too=!too:依次=类推!
  7. ……
  8.     echo !too!>>test.ini
  9. )
  10.     move /y test.ini "%%g"
  11. )
  12. echo.>完毕.ini
  13. exit
复制代码
有n个文件,即使合并到一起,你所有的替换也是要一一进行的。同时白白增加了最后切割分离的难度。

以上是常见的文本内容替换,处理一批文件是可以的。
但对于大量,超大量的文件要处理,一次处理时间太长,不能中断,使用就不灵活了。
因此推荐我的另一个bat,分批处理调度bat,可以将大任务化解为小任务。方便实用。
http://www.bathome.net/viewthread.php?tid=47492&highlight=
作者: zaqmlp    时间: 2018-9-21 06:54

多文件替换字符串,合并再分割多此一举,而且EmEditor是支持对指定文件夹里的多文件进行字符串替换的
作者: qixiaobin0715    时间: 2018-9-21 09:06

本帖最后由 qixiaobin0715 于 2018-9-21 09:24 编辑

谢谢诸位关注!
1.EmEditor是可以在文件夹中多文件查找替换,但是不能跨行,比如替换空行就不行,\n+替换为\n没反应。
2.我也不想合并分割这么麻烦的折腾,但是查找替换需要用到较为复杂的正则表达式,批处理不好操作。如诸如这样的正则表达式:
^(\\[.*?](?![A-D][^一-龥\\n]+\\P{Punct})\\n(.*[一-龥].*\\P{Punct})$、
^((\\Q[00:00.00]¥\\E\\D.*\\n.*¥\\D.*\\n)?\\[.*?]¥(\\d+) *(.*)\\n\\[.*?]¥\\3? *(.*\\n))等
作者: qixiaobin0715    时间: 2018-9-21 09:12

回复 7# Batcher
到单位处理了一个文件夹中的超过100个文件,速度很快,效果极佳。太感谢了!
作者: flashercs    时间: 2018-9-21 10:21

回复 10# qixiaobin0715


    替换空行不是\n\s*\n替换为\n吗?
作者: qixiaobin0715    时间: 2018-9-21 10:49

本帖最后由 qixiaobin0715 于 2018-9-21 10:54 编辑

回复 12# flashercs
\s是任一空白字符,包括空格、制表符、换页符、回车符和垂直制表符。= [ \f\n\r\t\v]
我说的空行只包括换行符,含有空格,制表符等都不能叫空行。
\n+的意思是连续多个空行。效率更高一点可写为\n{2,}
作者: qixiaobin0715    时间: 2018-9-21 11:11

回复 12# flashercs
替换空白行(包括空行)效率更高一点可以这样写^\s*\n,替换为空字符。
替换纯空行^\n替换为空字符。
作者: qixiaobin0715    时间: 2018-9-22 21:56

虽然只是解决了合并问题,文本处理效率还是得到了提高。
作者: qixiaobin0715    时间: 2019-7-26 17:22

回复 7# Batcher

合并批处理很好用,速度也快。如果合并后每行行首都加上“文件名+@”,上面批处理如何修改。
作者: qixiaobin0715    时间: 2019-7-27 10:22

本帖最后由 qixiaobin0715 于 2019-7-27 10:25 编辑

已经自己解决:
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. for /f "delims=" %%i in ('dir /s /b /a-d *.txt') do (
  4.   for /f "delims=" %%a in ('type "%%i"') do (
  5.     set Var1=%%~ni
  6.     set Var2=%%a
  7.     echo,!Var1!@@@!Var2!>>全合并.log
  8.   )
  9. )
  10. pause
复制代码
文件名与文本各行是用@@@隔开的。
作者: qixiaobin0715    时间: 2019-7-29 14:29

回复 7# Batcher

文件分割问题也早已解决,但自己写的还是有问题:
当文本中有英文感叹号时,分割时会被忽略掉,如何才能解决,希望大神能给予帮助。
代码如下:
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. if not exist Fenge md Fenge
  4. for /f "delims=" %%i in ('dir /s /b /a-d "*.log"') do (
  5.   for /f "delims=" %%a in ('type "%%i"') do (
  6.     set Var=%%a
  7.     if "!Var:~0,1!"=="@" (
  8.       set Name=!Var!
  9.       cd.>"Fenge\!Name!.txt"
  10.     ) else (
  11.       echo,!Var!>>"Fenge\!Name!.txt"
  12.     )
  13.   )
  14. )
  15. pause
复制代码

作者: qixiaobin0715    时间: 2019-7-31 15:41

看来只有退而求其次,分割前将要分割文本中的"!"替换为"^!"后,再用批处理分割文本了。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2