[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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




谁能提供一下思路。
谢谢

如果不好描述描述不清楚,建议上部分附件或截图。
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

好的

附上图和附件

TOP

附件如下

TOP

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

TOP

  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
复制代码
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

谢谢楼上两位老师

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

能否考虑空格问题?

比如test1.txt的情况

TOP

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


圈2的记录也含有空格,合并后地址的最后部分丢失了。

TOP

本帖最后由 回家路上 于 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
复制代码
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

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

TOP

回家路上你好

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

但是最后一个记录整条都丢失了。
N个记录的话。第n个记录整条都丢失

TOP

回复 11# buypro99


已修改。
其实对比我的两个,就会发现,第二个倒数第几行少了一行
  1. echo;!adr!       !num!
复制代码
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

返回列表