找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28060|回复: 11

[文本处理] 批处理如何合并逻辑上属于同行的内容?

[复制链接]
发表于 2015-9-4 16:34:40 | 显示全部楼层 |阅读模式
这个问题困惑了好久了。一直没想到好的解决方法。
文本文件内容如下,可能有N行,举例4行。如果地址分行的话
则分行内容都紧挨着地址的第一行,地址第二行也规律性的有分隔符



地址1 第一行|   111|    111-2|   111-3   
地址1第二行   |          |        |            

地址2第一行 |   222|    222-2|   222-3
地址3第一行|   333|    333-2|   333-3   
地址3第二行   |          |        |  

地址4 第一行|   444|    444-2|   444-3



如何通过批处理或者vbs将分成两行的一个记录合并成在一行里

效果如下


地址1 地址1第二行  |   111|    111-2|   111-3        
地址2 |   222|    222-2|   222-3
地址3地址3第二行 |   333|    333-2|   333-3   
地址4 |   444|    444-2|   444-3




谁能提供一下思路。
谢谢
发表于 2015-9-4 17:09:47 | 显示全部楼层
如果不好描述描述不清楚,建议上部分附件或截图。
 楼主| 发表于 2015-9-4 17:49:05 | 显示全部楼层
好的

附上图和附件
 楼主| 发表于 2015-9-4 17:51:00 | 显示全部楼层
附件如下
发表于 2015-9-4 18:37:25 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set d=0

  4. for /f "tokens=*" %%a in (test.txt) do (
  5. if not defined r0 (set r0=%%a)
  6. set p=%%a
  7. set k=f
  8. set q=!p: =!
  9. if "!q:||=!" neq "!q!" (
  10.   for /f %%b in ('echo;%%a') do (
  11.    set/a e=!d!-1
  12.    call set t=%%r!e!%%
  13.    for /f %%c in ('echo;!t!') do (
  14.     set r!e!=%%c%%b!t:%%c=!
  15.    )
  16.    set k=y
  17.   )
  18. )
  19. if "!k!"=="f" (
  20.   set r!d!=%%a
  21.   set /a d+=1
  22. )
  23. )
  24. for /l %%a in (0,1,!d!) do (echo;!r%%a!>>Result.txt)
  25. pause
复制代码
试一试
发表于 2015-9-4 21:54:06 | 显示全部楼层

  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "tokens=1* delims= " %%i in ('type test.txt') do (
  3.         set line=%%j
  4.         set line=!line: =!
  5.         if "!line:||=!" equ "!line!" (
  6.                 if defined adr (
  7.                         echo;!adr!       !num!
  8.                 )
  9.                 set adr=%%i&set num=%%j
  10.         )else (
  11.                 set adr=!adr!%%i
  12.         )
  13. )
  14. echo;!adr!       !num!
  15. )>结果.txt
  16. pause & exit /b
复制代码
 楼主| 发表于 2015-9-5 20:45:53 | 显示全部楼层
谢谢楼上两位老师

测试了一下果然可以
不过如果在地址中含有空格的话。合并后的地址顺序是错的

能否考虑空格问题?

比如test1.txt的情况
 楼主| 发表于 2015-9-5 20:58:43 | 显示全部楼层
圈1的记录含有空格,合并后地址顺序错了


圈2的记录也含有空格,合并后地址的最后部分丢失了。
发表于 2015-9-5 21:20:42 | 显示全部楼层
本帖最后由 回家路上 于 2015-9-6 09:42 编辑

回复 8# buypro99

  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in ('type test1.txt') do (
  3.         set line=%%i
  4.         set line=!line: =!
  5.         if "!line:||=!" equ "!line!" (
  6.                 if defined adr echo;!adr!       !num!
  7.                 set num=|!line:*|=!
  8.                 for /f "delims=" %%a in ("!num!") do set adr=!line:%%a=!
  9.         )else (
  10.                 if "!line!" neq "" (
  11.                         set n=|!line:*|=!
  12.                         for /f "delims=" %%a in ("!n!") do set adr=!adr!!line:%%a=!
  13.                 )
  14.         )
  15. )
  16. echo;!adr!       !num!
  17. )>结果.txt
  18. pause & exit /b
复制代码
发表于 2015-9-6 00:15:37 | 显示全部楼层
本帖最后由 pcl_test 于 2015-9-6 00:21 编辑

样本不足,并不能考虑全部的情况,最好打包上传原件
  1. @if(0)==(0) echo off&cscript -nologo -e:jscript "%~f0"<"test1.txt"&pause & exit/b@end
  2. var t1=t2='';
  3. var arr = WScript.StdIn.ReadAll().split(/\s*\r?\n/);
  4. arr.push('#');
  5. for (var i=0;i<arr.length;i++){
  6.       if (def==0&&!/|\s+|+/.test(arr[i])){
  7.           WSH.Echo(t1.replace(/\s+/g,'')+'        '+t2.replace(/|[\s|]*$/,''));
  8.           def=1;t1=t2='';
  9.       }
  10.       var str1 = arr[i].replace(/|.+$/g,'');
  11.       var str2 = arr[i].replace(/^[^|]+/,'');
  12.       t1 += str1;t2 += str2;var def=0;
  13. }
复制代码
 楼主| 发表于 2015-9-6 08:30:48 | 显示全部楼层
回家路上你好

谢谢你的改写
你测试成功吗?
我本地测试后合并的顺序问题解决了

但是最后一个记录整条都丢失了。
N个记录的话。第n个记录整条都丢失
发表于 2015-9-6 09:43:32 | 显示全部楼层
回复 11# buypro99


已修改。
其实对比我的两个,就会发现,第二个倒数第几行少了一行

  1. echo;!adr!       !num!
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 16:23 , Processed in 0.010573 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表