Board logo

标题: [文本处理] 批处理如何合并逻辑上属于同行的内容? [打印本页]

作者: buypro99    时间: 2015-9-4 16:34     标题: 批处理如何合并逻辑上属于同行的内容?

这个问题困惑了好久了。一直没想到好的解决方法。
文本文件内容如下,可能有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

如果不好描述描述不清楚,建议上部分附件或截图。
作者: buypro99    时间: 2015-9-4 17:49

好的

附上图和附件
作者: buypro99    时间: 2015-9-4 17:51

附件如下
作者: 路过    时间: 2015-9-4 18:37

  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

  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
复制代码

作者: buypro99    时间: 2015-9-5 20:45

谢谢楼上两位老师

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

能否考虑空格问题?

比如test1.txt的情况
作者: buypro99    时间: 2015-9-5 20:58

圈1的记录含有空格,合并后地址顺序错了


圈2的记录也含有空格,合并后地址的最后部分丢失了。
作者: 回家路上    时间: 2015-9-5 21:20

本帖最后由 回家路上 于 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
复制代码

作者: pcl_test    时间: 2015-9-6 00:15

本帖最后由 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. }
复制代码

作者: buypro99    时间: 2015-9-6 08:30

回家路上你好

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

但是最后一个记录整条都丢失了。
N个记录的话。第n个记录整条都丢失
作者: 回家路上    时间: 2015-9-6 09:43

回复 11# buypro99


已修改。
其实对比我的两个,就会发现,第二个倒数第几行少了一行
  1. echo;!adr!       !num!
复制代码





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