中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-09 20:42
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 未解决的问题希望通过查找每行分隔符个数的方式解决。 查看 1,209 回复 12
楼 主 未解决的问题希望通过查找每行分隔符个数的方式解决。 发表于 2008-09-15 15:46 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
经坛中各位大侠帮忙,已经解决了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 发表于 2008-09-15 16:00 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
我写的那个脚本有。。。比较,只是没有列出来。
你自己改,或者找人改吧,假放完了~洗澡,闪人了先。。。
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
3 发表于 2008-09-15 16:58 ·  中国 广东 江门 电信
中级用户
★★
积分 338
发帖 175
注册 2007-10-21 15:30
18年会员
UID 100351
性别 男
状态 离线
用for /f?
4 发表于 2008-09-15 17:12 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
@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!行中的分隔符与实际不符
)
)
5 发表于 2008-09-15 17:59 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
.

可是这样的话, 只报告第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 发表于 2008-09-15 18:06 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
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 发表于 2008-09-15 18:19 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
谢谢 HAT ,回家用这个测试一下。

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

就用这个再搜一遍错误。
8 发表于 2008-09-15 19:04 ·  中国 江苏 苏州 电信
初级用户
★★
积分 195
发帖 93
注册 2006-10-28 08:20
19年会员
UID 68626
性别 男
状态 离线
处理这种表单类的文本用awk是多么的幸福。。。

BEGIN {FS="*"}
{print $1 " | " $2 " | " $3 " | " $4 " | " $5 " | " $6 " | " $7 " | "}


[ Last edited by metoo on 2008-9-15 at 07:08 PM ]
9 发表于 2008-09-15 19:15 ·  中国 江苏 苏州 电信
初级用户
★★
积分 195
发帖 93
注册 2006-10-28 08:20
19年会员
UID 68626
性别 男
状态 离线
如果想找错误可以自己加点判断

BEGIN {FS="*"}
NF==8 {print $1 " | " $2 " | " $3 " | " $4 " | " $5 " | " $6 " | " $7 " | "}
NF!=8 {err=NR}
END {
print "==============================================="
for (ee in err)
{print "第" err "行有错误"
}}
10 发表于 2008-09-15 20:43 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
奇怪了,好几次都修改成这种结果,就是不能将桌面的文件拖进去。

给%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 发表于 2008-09-15 20:55 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
@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
12 发表于 2008-09-15 21:28 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
@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
13 发表于 2008-09-15 21:34 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
ok 了 谢谢 HAT 老大出手
论坛跳转: