中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-09 18:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 续求:修改代码支持报错信息 查看 947 回复 10
楼 主 续求:修改代码支持报错信息 发表于 2008-09-06 22:16 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
原问题:如何将文本中指定列的数值累加求得合计数?

huahua0919 朋友提供的代码附后,可以满足需求并且计算速度也很快。

但在实测中发现在某列数据计算出现问题时无法查找原因所在,

比如下面的样本,第五行和第十三行,合计第七列时会导致报错,

如果文本中数据量很大,极难查找问题到底出现在哪一行。

特再次求助:修改代码使遇到错误时,能显示出是哪行出现了错误。

样本.txt
1|0757 | 合同 | 其它 | 殷晏 | 200837015029392 | 4000.0 |
2|0752 | 合同 | 经济原因 | 葛宝 | 200000026251 | 10232.35 |
3|2810 | 合同 | 经济原因 | 王传 | 2002810000013079 | 479.0 |
4|2810 | 合同 | 经济原因 | 王传 | 20028000013079 | 479.0 |
5|2810 | 合同 | 经济原因 | 王传 | 200231000013079dashan |
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 | 四湖 |


=======================================
huahua0919 朋友提供的代码, 经 HAT 帮忙现修改如下:

@echo off
@title 求某列数据的合计数
echo.
echo.
set /p file= 请将要处理的文本拖放到这里:
echo.
echo 请输入您准备合计计算的数值位于第几列。
echo.
set /p lie= 待合计的数据在文本中所处的列为:
set /a lie-=1
set file=%file:"=%
echo.
cls
echo.
echo.
echo.
echo 正在计算,请稍候......
echo.
echo.
echo.
echo.
cd.>temp.vbs
>temp.vbs echo dim sum
>>temp.vbs echo sum=0
>>temp.vbs echo set Fso=createobject^("scripting.filesystemobject"^)
>>temp.vbs echo set fs=Fso.opentextfile^("%file%",1^)
>>temp.vbs echo Do While fs.atEndOfLine ^<^> true
>>temp.vbs echo x=split^(fs.readline,"|"^)
>>temp.vbs echo sum=sum+x^(%lie%^)
>>temp.vbs echo loop
>>temp.vbs echo wscript.echo " 所选列数据合计为:"^&Formatnumber(sum,2)
cscript//nologo temp.vbs
echo.
@del temp.vbs>nul2>nul
echo.
echo.
pause


[ Last edited by youaoyi on 2008-9-13 at 10:57 PM ]
2 发表于 2008-09-06 22:32 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
@echo off&setlocal enabledelayedexpansion
set /p file=请将要处理的文本拖放到这里:
echo.&set /p lie= 待合计的数据所处的列为:
set /a lie-=1
set file=%file:"=%
cd.>temp.vbs
>temp.vbs echo dim sum
>>temp.vbs echo sum=0
>>temp.vbs echo set Fso=createobject^("scripting.filesystemobject"^)
>>temp.vbs echo set fs=Fso.opentextfile^("%file%",1^)
>>temp.vbs echo Do While fs.atEndOfLine ^<^> true
>>temp.vbs echo x=split^(fs.readline,"|"^)
>>temp.vbs echo sum=sum+x^(%lie%^)
>>temp.vbs echo loop
>>temp.vbs echo wscript.echo sum
cscript//nologo temp.vbs
pause
3 发表于 2008-09-06 22:42 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
。。。为什么不直接VBS汗。
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
4 发表于 2008-09-06 22:46 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
因为VBS自己一窍不通,为了这个问题大汗淋漓研究了一天都没解决.....

还有很多其它方面的工作都是在一个批处理中完成的。

多谢 HAT 帮忙,现又发现一个麻烦的问题,继续求助 :

[ Last edited by youaoyi on 2008-9-13 at 10:46 PM ]
5 发表于 2008-09-13 22:48 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
huahua0919 朋友提供的代码, 经 HAT 帮忙现修改成一楼的样子。

实测中发现在某列数据计算出现问题时无法查找原因所在,

比如一楼的样本,第五行和第十三行,在合计第七列数据时会导致报错,

如果文本中数据量很大,极难查找问题到底出现在哪一行。

特再次求助:修改代码使遇到错误时,能显示出是哪行出现了错误。

[ Last edited by youaoyi on 2008-9-13 at 10:50 PM ]
6 发表于 2008-09-14 12:47 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
isnumeric
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
7 再次修改 发表于 2008-09-14 13:32 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
sum = 0
If WSH.Arguments.Count < 1 Then
MsgBox
"缺少统计文本!",vbCritical,"错误"
WSH.Quit
End If
vbFile = WSH.Arguments(0)
col = InputBox("请输入要统计的列:","输入列号",7) - 1
If col = "" Then WSH.Quit
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFso.OpenTextFile(vbFile,1)
Do Until objFile.AtEndOfStream
n = n + 1
x = Split(objFile.ReadLine,"|")
If col > UBound(x) Then
ExsitErr = True
ErrLine = ErrLine & n & ","
Else
If IsNumeric
(x(col)) Then
If Not
ExsitErr Then sum = sum + x(col)
Else
ExsitErr = True
ErrLine = ErrLine & n & ","
End If
End If
Loop
If
ExsitErr Then
ErrLine = Left(ErrLine,Len(ErrLine) - 1)
MsgBox "" & ErrLine & "行有错误数据请修正!",vbInformation,"错误"
Else
MsgBox
"所选列数据合计为:" & FormatNumber(sum,2)
End If
Set
objFile = Nothing
Set
objFso = Nothing

[ Last edited by slore on 2008-9-14 at 02:05 PM ]
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
moniuming +8 2008-09-14 14:27
BC +2 2008-09-14 17:47
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
8 发表于 2008-09-14 14:17 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
佩服 ! 截止至目前 , 在大家的帮助下,

此类文本处理的相关问题 已解决 90% 以上。

在此深表感谢!
9 发表于 2008-09-14 15:16 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
剩下的10%呢?
10 发表于 2008-09-14 17:36 ·  中国 山东 济宁 联通
初级用户
★★
积分 154
发帖 67
注册 2007-10-31 13:18
18年会员
UID 101283
性别 男
状态 离线
谢谢HAT关心,剩下的10% 多是由于人为输入的乱码(比如半个汉字)造成的。

http://www.cn-dos.net/forum/viewthread.php?tid=42703&fpage=1&highlight=%2Byouaoyi

这个帖子中的问题如果能做到应该能解决,不过暂时还没有解决办法。
11 发表于 2008-09-14 17:47 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
VBS可以逐个检查字符,不过你那么大的文本估计也很慢。
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
论坛跳转: