![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-09 18:40 |
共 47,811 主题排行 / 349,896 发帖 / 今日 1 篇 / 48,254 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 未解决的问题希望通过查找每行分隔符个数的方式解决。 |
| 可打印版本 1,203 / 12 |
| 第1楼 youaoyi | 发表于 2008-09-15 15:46 |
| 初级用户 发帖 67 积分 154 | |
|
未解决的问题希望通过查找每行分隔符个数的方式解决。 经坛中各位大侠帮忙,已经解决了90%的问题文本的处理。
剩下的问题文本我仔细寻觅了一下,多是由于输入人员姓名时录入了半个字符, 导致产生多或少了分割符“|”,比如下面样本,本来都应该是七个“|”符号, 但是因为第5行、第13行的原始数据有问题,所以一个是八个“|”,一个是六个“|” 这个问题应该可以通过查找分隔符个数与实际不符的行来确认问题出在哪行。 特此求助,求一个查找每行 “|” 分隔符个数,不符则提示第几行有问题的批处理: 样本.txt 1|0757 | 合同 | 其它 | 殷晏 | 200837015029392 | 4000.0 | 2|0752 | 合同 | 经济原因 | 葛宝 | 200000026251 | 10232.35 | 3|2810 | 合同 | 经济原因 | 王传 | 2002810000013079 | 479.0 | 4|2810 | 合同 | 经济原因 | 王传 | 20028000013079 | 479.0 | 5|2810 | 合同 | 经济原因 | 趙朹 | 燕 | 200231000013099 | 939.0 | 6|2810 | 合同 | 经济原因 | 王传 | 200237281000013079 | 23.72 | 7|2810 | 合同 | 经济原因 | 王传 | 200237810000013079 | 260.28 | 8|0808 | 合同 | 经济原因 | 梁汝 | 2005300005411 | 280.0 | 9|1104 | 合同 | 其它 | 张成 | 2008374015010838 | 1630.0 | 10|1104 | 合同 | 其它 | 张成 | 200830015010838 | 36.0 | 11|1104 | 合同 | 其它 | 张成 | 200837015010845 | 10.0 | 12|1104 | 合同 | 其它 | 张成 | 20083715010845 | 10.0 | 13|1104 | 合同 | 其它 | 张成 | 20083602015010845 四湖 | ======================================= 想求得的批处大体如下面这样: @echo off @title 查找分隔符个数不正确的行 echo. echo. set /p file= 请将要处理的文本拖放到这里: echo. set /p lie= 每行中应该有几个“|”分隔符: echo. ...... ...... echo 以下行中的分隔符与实际不符: ..... ...... ........ [ Last edited by youaoyi on 2008-9-15 at 03:52 PM ] |
|
| 第2楼 slore | 发表于 2008-09-15 16:00 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
我写的那个脚本有。。。比较,只是没有列出来。
你自己改,或者找人改吧,假放完了~洗澡,闪人了先。。。 |
|
| 第3楼 BC | 发表于 2008-09-15 16:58 |
| 中级用户 发帖 175 积分 338 | |
|
用for /f?
|
|
| 第4楼 HAT | 发表于 2008-09-15 17:12 |
| 版主 发帖 5,017 积分 9,023 | |
| 第5楼 youaoyi | 发表于 2008-09-15 17:59 |
| 初级用户 发帖 67 积分 154 | |
|
.
可是这样的话, 只报告第5行有问题,未列出第 13行也有问题啊? 二楼slore兄所说的脚本附下,如有VBS高手望能协助修改。 @title 求某列数据的合计数 echo. echo. set /p file= 请将要处理的文本拖放到这里: echo. set /p lie= 待合计的数据在文本中所处的列为: set /a lie-=1 set file=%file:"=% echo. cls echo. for /f "tokens=*" %%a in ('sed -n "$=" "%file%"') do set var=%%a echo. cd.>temp.vbs >temp.vbs echo sum=0 ::>>temp.vbs echo If WSH.Arguments.Count^<1 Then ::>>temp.vbs echo MsgBox "缺少统计文本!",vbCritical,"错误" ::>>temp.vbs echo WSH.Quit ::>>temp.vbs echo End If ::>>temp.vbs echo vbFile=WSH.Arguments^(0^) ::>>temp.vbs echo col=InputBox^("请输入要统计的列:","输入列号",7^)-1 ::>>temp.vbs echo If col="" Then WSH.Quit >>temp.vbs echo Set objFso=CreateObject^("Scripting.FileSystemObject"^) >>temp.vbs echo Set objFile=objFso.OpenTextFile^("%file%",1^) >>temp.vbs echo Do Until objFile.AtEndOfStream >>temp.vbs echo n=n+1 >>temp.vbs echo x=Split^(objFile.ReadLine,"|"^) >>temp.vbs echo If %lie%^>ubound^(x^) Then >>temp.vbs echo ExsitErr=True >>temp.vbs echo ErrLine=ErrLine^&n^&"、" >>temp.vbs echo Else >>temp.vbs echo If IsNumeric^(x^(%lie%^)^) Then >>temp.vbs echo If Not ExsitErr Then sum=sum+x^(%lie%^) >>temp.vbs echo Else >>temp.vbs echo ExsitErr=True >>temp.vbs echo ErrLine=ErrLine^&n^&"," >>temp.vbs echo End If >>temp.vbs echo End If >>temp.vbs echo Loop >>temp.vbs echo If ExsitErr Then >>temp.vbs echo ErrLine = Left^(ErrLine,Len^(ErrLine^)-1^) ::弹出窗口>>temp.vbs echo MsgBox "第" ^& ErrLine ^& "行有错误数据请修正!",vbInformation,"错误" >>temp.vbs echo wscript.echo "报错行数:" ^& ErrLine ::^& " 发现错误数据请进行修正!" >>temp.vbs echo wscript.echo " " >>temp.vbs echo wscript.echo " 计算结束:" >>temp.vbs echo wscript.echo " 以上行中发现错误,请先进行修正!" >>temp.vbs echo Else ::弹出窗口>>temp.vbs echo MsgBox "所选列数据合计为:" ^& FormatNumber^(sum,2^) >>temp.vbs echo wscript.echo " " >>temp.vbs echo wscript.echo " 计算结束:" >>temp.vbs echo wscript.echo " 所选列数据合计为:"^&Formatnumber(sum,2) >>temp.vbs echo wscript.echo " 该文本中共有 %var% 条数据" >>temp.vbs echo End If >>temp.vbs echo Set objFile=Nothing >>temp.vbs echo Set objFso=Nothing cscript//nologo temp.vbs echo. @del temp.vbs>nul2>nul pause>nul [ Last edited by youaoyi on 2008-9-15 at 06:09 PM ] |
|
| 第6楼 HAT | 发表于 2008-09-15 18:06 |
| 版主 发帖 5,017 积分 9,023 | |
|
C:\Test>type test.bat
@echo off setlocal enabledelayedexpansion set row=0 for /f "tokens=1-8 delims=|" %%a in (a.txt) do ( set /a row+=1 if "%%h" neq " " ( echo !row!行中的分隔符与实际不符 ) ) C:\Test>test.bat 5行中的分隔符与实际不符 13行中的分隔符与实际不符 |
|
| 第7楼 youaoyi | 发表于 2008-09-15 18:19 |
| 初级用户 发帖 67 积分 154 | |
|
谢谢 HAT ,回家用这个测试一下。
如果实在不能加入到VBS代码中一并进行查验, 就用这个再搜一遍错误。 |
|
| 第8楼 metoo | 发表于 2008-09-15 19:04 |
| 初级用户 发帖 93 积分 195 | |
|
处理这种表单类的文本用awk是多么的幸福。。。
[ Last edited by metoo on 2008-9-15 at 07:08 PM ] |
|
| 第9楼 metoo | 发表于 2008-09-15 19:15 |
| 初级用户 发帖 93 积分 195 | |
|
如果想找错误可以自己加点判断
|
|
| 第10楼 youaoyi | 发表于 2008-09-15 20:43 |
| 初级用户 发帖 67 积分 154 | |
|
奇怪了,好几次都修改成这种结果,就是不能将桌面的文件拖进去。
给%file%加上引号也不行,到底是啥原因捏 ? ![]() @echo off setlocal enabledelayedexpansion @title 查找分隔符个数不正确的行 echo. echo. set /p file= 请将要处理的文本拖放到这里: echo. set /p geshu= 每行中应该有几个分隔符: set /a geshu+=1 set file=%file:"=% echo. set row=0 for /f "tokens=1-%geshu% delims=|" %%a in (%file%) do ( set /a row+=1 if "%%h" neq " " ( echo !row!行中的分隔符与实际不符 ) ) pause |
|
| 第11楼 HAT | 发表于 2008-09-15 20:55 |
| 版主 发帖 5,017 积分 9,023 | |
| 第12楼 HAT | 发表于 2008-09-15 21:28 |
| 版主 发帖 5,017 积分 9,023 | |
| 第13楼 youaoyi | 发表于 2008-09-15 21:34 |
| 初级用户 发帖 67 积分 154 | |
|
ok 了 谢谢 HAT 老大出手
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |