Board logo

标题: 未解决的问题希望通过查找每行分隔符个数的方式解决。 [打印本页]

作者: youaoyi     时间: 2008-9-15 15:46    标题: 未解决的问题希望通过查找每行分隔符个数的方式解决。

经坛中各位大侠帮忙,已经解决了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 ]
作者: slore     时间: 2008-9-15 16:00
我写的那个脚本有。。。比较,只是没有列出来。
你自己改,或者找人改吧,假放完了~洗澡,闪人了先。。。
作者: BC     时间: 2008-9-15 16:58
用for /f?
作者: HAT     时间: 2008-9-15 17:12

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

作者: youaoyi     时间: 2008-9-15 17:59
.

可是这样的话, 只报告第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 ]
作者: HAT     时间: 2008-9-15 18:06
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行中的分隔符与实际不符
作者: youaoyi     时间: 2008-9-15 18:19
谢谢 HAT ,回家用这个测试一下。

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

就用这个再搜一遍错误。
作者: metoo     时间: 2008-9-15 19:04
处理这种表单类的文本用awk是多么的幸福。。。
BEGIN {FS="[ |]*"}
{print $1 " | " $2 " | " $3 " | " $4 " | " $5 " | " $6 " | " $7 " | "}
[ Last edited by metoo on 2008-9-15 at 07:08 PM ]
作者: metoo     时间: 2008-9-15 19:15
如果想找错误可以自己加点判断
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] "行有错误"
}}

作者: youaoyi     时间: 2008-9-15 20:43
奇怪了,好几次都修改成这种结果,就是不能将桌面的文件拖进去。

给%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
作者: HAT     时间: 2008-9-15 20:55

@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

作者: HAT     时间: 2008-9-15 21:28

@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

作者: youaoyi     时间: 2008-9-15 21:34
ok 了    谢谢 HAT 老大出手