中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 未解决的问题希望通过查找每行分隔符个数的方式解决。
作者:
标题: 未解决的问题希望通过查找每行分隔符个数的方式解决。 上一主题 | 下一主题
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『楼 主』:  未解决的问题希望通过查找每行分隔符个数的方式解决。

经坛中各位大侠帮忙,已经解决了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 ]

2008-9-15 15:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

我写的那个脚本有。。。比较,只是没有列出来。
你自己改,或者找人改吧,假放完了~洗澡,闪人了先。。。



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2008-9-15 16:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 3 楼』:  

用for /f?



C:\
C:\Del BC
2008-9-15 16:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  


@echo off
setlocal enabledelayedexpansion
set row=0
for /f "tokens=8 delims=|" %%a in (a.txt) do (
  set /a row+=1
  if "%%a" neq " " (
    echo !row!行中的分隔符与实际不符
  )
)




2008-9-15 17:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 5 楼』:  

.

可是这样的话, 只报告第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 ]

2008-9-15 17:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 6 楼』:  

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行中的分隔符与实际不符



2008-9-15 18:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 7 楼』:  

谢谢 HAT ,回家用这个测试一下。

如果实在不能加入到VBS代码中一并进行查验,

就用这个再搜一遍错误。

2008-9-15 18:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
metoo
初级用户





积分 195
发帖 93
注册 2006-10-28
状态 离线
『第 8 楼』:  

处理这种表单类的文本用awk是多么的幸福。。。
BEGIN {FS="[ |]*"}
{print $1 " | " $2 " | " $3 " | " $4 " | " $5 " | " $6 " | " $7 " | "}
[ Last edited by metoo on 2008-9-15 at 07:08 PM ]

2008-9-15 19:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
metoo
初级用户





积分 195
发帖 93
注册 2006-10-28
状态 离线
『第 9 楼』:  

如果想找错误可以自己加点判断
BEGIN {FS="[ |]*"}
NF==8 {print $1 " | " $2 " | " $3 " | " $4 " | " $5 " | " $6 " | " $7 " | "}
NF!=8 {err[++i]=NR}
END {
print "==============================================="
for (ee in err)
{print "第" err[ee] "行有错误"
}}


2008-9-15 19:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 10 楼』:  

奇怪了,好几次都修改成这种结果,就是不能将桌面的文件拖进去。

给%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

2008-9-15 20:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 11 楼』:  


@echo off
setlocal enabledelayedexpansion
title 查找分隔符个数不正确的行
set /p file=请将要处理的文本拖放到这里:
set row=0
for /f "tokens=1-8 delims=|" %%a in ('type %file%') do (
  set /a row+=1
  if "%%h" neq " " (
    echo !row!行中的分隔符与实际不符
  )
)
pause




2008-9-15 20:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 12 楼』:  


@echo off
setlocal enabledelayedexpansion
title 查找分隔符个数不正确的行
set /p "file=请将要处理的文本拖放到这里:"
set row=0
for /f "usebackq tokens=1-8 delims=|" %%a in (%file%) do (
  set /a row+=1
  if "%%h" neq " " (
    echo !row!行中的分隔符与实际不符
  )
)
pause




2008-9-15 21:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『第 13 楼』:  

ok 了    谢谢 HAT 老大出手

2008-9-15 21:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: