Board logo

标题: [文本处理] 批处理如何在文本里以空白行分割的每一小段内容的每一行末尾添加特定字符串 [打印本页]

作者: 1e3e    时间: 2014-1-22 14:53     标题: 批处理如何在文本里以空白行分割的每一小段内容的每一行末尾添加特定字符串

已知:
a县项目汇总.txt内容如下:
weewewe  wwww   sdsdsdssd     eeeeee
eweweweewe dsdsd  wewewew  dsdsd

sdsdsdsdsd sdsdsd sdsdsdsd dsdsdsdsads
sdadadaerer dsadfafa ffasdfasdf da**sfasf


dadfasf sadfafasf a**fafasf   fafasfdsafsaf
**fasfsafsafd   fafasfasfsafsaf  fasfasfasfasf
**f胗   fafasfasfeweewf  fasfarrf

现在按照其空白顺序(如图所示)依次在行尾加上使其内容如下:
weewewe  wwww   sdsdsdssd     eeeeee 项目规划地1部分
eweweweewe dsdsd  wewewew  dsdsd 项目规划地1部分

sdsdsdsdsd sdsdsd sdsdsdsd dsdsdsdsads 项目规划地2部分
sdadadaerer dsadfafa ffasdfasdf da**sfasf 项目规划地2部分


dadfasf sadfafasf a**fafasf   fafasfdsafsaf 项目规划地3部分
**fasfsafsafd   fafasfasfsafsaf  fasfasfasfasf 项目规划地3部分
**f胗   fafasfasfeweewf  fasfarrf 项目规划地3部分

说明:地1部分我没有打成“第1部分”,是因为处理文本的需要选择了“地”而非“第”
作者: xxpinqz    时间: 2014-1-22 15:41

  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1
  3. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "a.txt"') do (
  4.     if "%%b" == "" (
  5.     if defined y set y=&set/an+=1
  6.     echo,
  7.     ) else (
  8.         echo,%%b 项目规划地!n!部分
  9.         set y=.
  10.     )
  11.    
  12. ))>b.txt
复制代码

作者: 1e3e    时间: 2014-1-22 15:55

回复 2# xxpinqz


    谢谢,我试试去
作者: 1e3e    时间: 2014-1-22 16:04

回复 2# xxpinqz


    非常感谢,试验确实可行,现在一个文件夹下有145个这样文本都要这样处理,怎么办?
作者: terse    时间: 2014-1-22 16:24

回复 4# 1e3e
外包一个FOR 循环 试
作者: 1e3e    时间: 2014-1-22 16:27

回复 2# xxpinqz


    现在我还发现一个悲剧的问题:就是比如现在我上传的附件运行不正常,是因为行未有空白吗?我去除行未空白似乎是正常的,3县.txt这个根本运行不了,你的代码可以再完善一下吗?
作者: DAIC    时间: 2014-1-22 16:53

回复 6# 1e3e


2县.txt试试这个代码
作者: DAIC    时间: 2014-1-22 17:14

回复 6# 1e3e


3县.txt这个文件时unicode编码,你可以把它另存为ANSI编码。

或者,把
('findstr /n .* "3县.txt"')
改成
('type "3县.txt" ^| findstr /n .*')
作者: xxpinqz    时间: 2014-1-22 17:42

本帖最后由 xxpinqz 于 2014-1-22 17:55 编辑

回复 4# 1e3e
处理当前文件夹下所有txt文档,生成文件到目录new下。
  1. @echo off&setlocal enabledelayedexpansion
  2. md new 2>nul
  3. for %%i in (*.txt) do (
  4.     set n=1
  5.     set "y="
  6.     (for /f "tokens=1* delims=:" %%a in ('type "%%i" ^|findstr /n .*') do (
  7.         set "str=%%b"
  8.         if "%%b" == "" (
  9.             if defined y set y=&set/an+=1
  10.         ) else (
  11.             for /f "tokens=*" %%a in ("%%b") do (
  12.                 if not "%%a"=="" set "str=%%b 项目规划地!n!部分"
  13.             )
  14.             set y=.
  15.         )
  16.         echo,!str!
  17.     ))>"new\%%~ni(新).txt"
  18. )
复制代码

作者: 1e3e    时间: 2014-1-23 08:15

如附件:有a县项目汇总.txt,b县项目汇总.txt,现在汇总成a县+b县项目汇总.txt。
实际上就是按照项目规划地1部分的项目汇总到一块,项目规划地2部分的项目汇总到一块,…………
作者: xxpinqz    时间: 2014-1-23 12:18

本帖最后由 xxpinqz 于 2014-1-23 12:24 编辑

回复 10# 1e3e
用上面的改改,大约如此
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a num=f=10000
  3. (for %%i in (*.txt) do (
  4.     set /a m=n=10000,f+=1
  5.     set "y="
  6.     for /f "tokens=1* delims=:" %%a in ('type "%%i"^|findstr /n .*') do (
  7.         set "str=%%b"
  8.         if "%%b" == "" (
  9.             if defined y set y=&set/an+=1
  10.         ) else (
  11.             for /f "tokens=*" %%a in ("%%b") do (
  12.                 set/a m+=1
  13.                 if not "%%a"=="" echo,!n!:!f!!m!:%%b
  14.             )
  15.             set y=.
  16.         )
  17.     )
  18. ))>tmp
  19. (for /f "tokens=1-2* delims=:" %%a in ('type tmp^|sort') do (
  20.       if %%a neq !num! set/a num+=1&echo,
  21.       echo,%%c
  22. ))>all.txt
  23. del tmp
  24. start all.txt
复制代码
如果也要按顶楼要求,改下序号
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a num=f=10001
  3. (for %%i in (*.txt) do (
  4.     set /a m=n=10001,f+=1
  5.     set "y="
  6.     for /f "tokens=1* delims=:" %%a in ('type "%%i"^|findstr /n .*') do (
  7.         set "str=%%b"
  8.         if "%%b" == "" (
  9.             if defined y set y=&set/an+=1
  10.         ) else (
  11.             for /f "tokens=*" %%a in ("%%b") do (
  12.                 set/a m+=1,nn=n%%10000
  13.                 if not "%%a"=="" echo,!n!:!f!!m!:%%b 项目规划地!nn!部分
  14.             )
  15.             set y=.
  16.         )
  17.     )
  18. ))>tmp
  19. (for /f "tokens=1-2* delims=:" %%a in ('type tmp^|sort') do (
  20.       if %%a neq !num! set/a num+=1&echo,
  21.       echo,%%c
  22. ))>all.txt
  23. del tmp
  24. start all.txt
复制代码

作者: PowerShell    时间: 2014-1-23 15:29

从第一行开始,取一行,去掉行尾空格,然后插入 " 项目规划地1部分"
下一行如果是空行," 项目规划地1部分" 变成" 项目规划地2部分"
如此继续,




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