标题: [文本处理] 批处理如何合并逻辑上属于同行的内容? [打印本页]
作者: 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
- @echo off
- setlocal enabledelayedexpansion
- set d=0
-
- for /f "tokens=*" %%a in (test.txt) do (
- if not defined r0 (set r0=%%a)
- set p=%%a
- set k=f
- set q=!p: =!
- if "!q:||=!" neq "!q!" (
- for /f %%b in ('echo;%%a') do (
- set/a e=!d!-1
- call set t=%%r!e!%%
- for /f %%c in ('echo;!t!') do (
- set r!e!=%%c%%b!t:%%c=!
- )
- set k=y
- )
- )
- if "!k!"=="f" (
- set r!d!=%%a
- set /a d+=1
- )
- )
- for /l %%a in (0,1,!d!) do (echo;!r%%a!>>Result.txt)
- pause
复制代码
试一试
作者: 回家路上 时间: 2015-9-4 21:54
- @echo off & setlocal enabledelayedexpansion
- (for /f "tokens=1* delims= " %%i in ('type test.txt') do (
- set line=%%j
- set line=!line: =!
- if "!line:||=!" equ "!line!" (
- if defined adr (
- echo;!adr! !num!
- )
- set adr=%%i&set num=%%j
- )else (
- set adr=!adr!%%i
- )
- )
- echo;!adr! !num!
- )>结果.txt
- 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 - @echo off & setlocal enabledelayedexpansion
- (for /f "delims=" %%i in ('type test1.txt') do (
- set line=%%i
- set line=!line: =!
- if "!line:||=!" equ "!line!" (
- if defined adr echo;!adr! !num!
- set num=|!line:*|=!
- for /f "delims=" %%a in ("!num!") do set adr=!line:%%a=!
- )else (
- if "!line!" neq "" (
- set n=|!line:*|=!
- for /f "delims=" %%a in ("!n!") do set adr=!adr!!line:%%a=!
- )
- )
- )
- echo;!adr! !num!
- )>结果.txt
- pause & exit /b
复制代码
作者: pcl_test 时间: 2015-9-6 00:15
本帖最后由 pcl_test 于 2015-9-6 00:21 编辑
样本不足,并不能考虑全部的情况,最好打包上传原件- @if(0)==(0) echo off&cscript -nologo -e:jscript "%~f0"<"test1.txt"&pause & exit/b@end
- var t1=t2='';
- var arr = WScript.StdIn.ReadAll().split(/\s*\r?\n/);
- arr.push('#');
- for (var i=0;i<arr.length;i++){
- if (def==0&&!/|\s+|+/.test(arr[i])){
- WSH.Echo(t1.replace(/\s+/g,'')+' '+t2.replace(/|[\s|]*$/,''));
- def=1;t1=t2='';
- }
- var str1 = arr[i].replace(/|.+$/g,'');
- var str2 = arr[i].replace(/^[^|]+/,'');
- t1 += str1;t2 += str2;var def=0;
- }
复制代码
作者: buypro99 时间: 2015-9-6 08:30
回家路上你好
谢谢你的改写
你测试成功吗?
我本地测试后合并的顺序问题解决了
但是最后一个记录整条都丢失了。
N个记录的话。第n个记录整条都丢失
作者: 回家路上 时间: 2015-9-6 09:43
回复 11# buypro99
已修改。
其实对比我的两个,就会发现,第二个倒数第几行少了一行复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |