中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-09 18:00
47,811 主题排行 / 349,896 发帖 / 今日 1 篇 / 48,254 会员排行
DOS批处理 & 脚本技术(批处理室) » [求助]如何将文本的指定列累加并在出错时提示问题行?
可打印版本  1,995 / 18
第1楼 youaoyi 发表于 2008-09-05 16:14
初级用户 发帖 67 积分 154
[求助]如何将文本的指定列累加并在出错时提示问题行?
如何将文本中指定列的数值累加求得合计数?

(在合计时如果报错,希望能够提示哪一行出错了。)

需要合计的数值在不同TXT文本中处在不同的列,
因此要允许用户指定,设定象“set /p lie=”的输入。

比如样本1,需要求和的数值在最后一列;
样本2,需要求和的数值在在第7列;
样本3,需要求和的数值在第4列.....等等


样本1.txt
1|200757|单方合同|其它|殷顺|45665|4000.0|
2|200752|合同|经济原因|宝举|3454534534|10232.35|
3|202810|合同|经济原因|传龙|56546|479.0|
4|202810|单方合同|经济原因|传龙|2222|479.0|
5|202810|合同|其它原因|传龙|4343|23.72|
6|202810|合同|经济原因|传龙|5454667|23.72|


样本2.txt
1|200757|单方合同|其它|殷顺|45665|4000.0|其它|殷顺|200757|单方合同
2|200752|合同|经济原因|宝举|3454534534|10232.35|其它|殷顺|200757|单方合同
3|202810|合同|经济原因|传龙|56546|479.0|其它|殷顺|200757|单方合同
4|202810|单方合同|经济原因|传龙|2222|479.0|其它|殷顺|200757|单方合同
5|202810|合同|其它原因|传龙|4343|23.72|其它|殷顺|200757|单方合同
6|202810|合同|经济原因|传龙|5454667|23.72|其它|殷顺|200757|单方合同


样本3.txt
1|200757|45665|4000.0|其它|殷顺|200757|单方合同
2|200752|3454534534|10232.35|其它|殷顺|200757|单方合同
3|202810|56546|479.0|其它|殷顺|200757|单方合同
4|202810|2222|479.0|其它|殷顺|200757|单方合同
5|202810|4343|23.72|其它|殷顺|200757|单方合同



@echo off&setlocal enabledelayedexpansion
set /p file=请将要处理的文本拖放到这里:
echo.&set /p lie= 待合计的数据所处的列为:

.....
.....
.....


[ Last edited by youaoyi on 2008-9-6 at 10:00 AM ]
第2楼 huahua0919 发表于 2008-09-05 19:40
银牌会员 发帖 780 积分 1,608


[ Last edited by huahua0919 on 2008-9-5 at 10:24 PM ]
第3楼 youaoyi 发表于 2008-09-05 21:24
初级用户 发帖 67 积分 154
计算正确,但是输入的列好像不对,

样本2,需要求和的数值在在第7列,但是需要输入6才能正确计算,

样本3,需要求和的数值在第4列,但是需要输入3才能正确计算。
第4楼 huahua0919 发表于 2008-09-05 22:17
银牌会员 发帖 780 积分 1,608
修改过了,你在试试
并且优化如果文件名含空格会出错的情况

[ Last edited by huahua0919 on 2008-9-5 at 10:25 PM ]
第5楼 HAT 发表于 2008-09-05 22:24
版主 发帖 5,017 积分 9,023
自己去看看split的帮助就知道为什么了
第6楼 youaoyi 发表于 2008-09-06 00:25
初级用户 发帖 67 积分 154
合计计算时常常因为原TXT文件本身有问题而报错

如果报错 如何显示"合计失败,请检查第XXX行数据。"这段字符?

[ Last edited by youaoyi on 2008-9-6 at 09:55 AM ]
第7楼 HAT 发表于 2008-09-06 00:38
版主 发帖 5,017 积分 9,023
能把让2楼代码报错的文本内容贴出来看看么?
第8楼 youaoyi 发表于 2008-09-06 01:11
初级用户 发帖 67 积分 154
原文本本身有问题报错时提示:
temp.vbs<5,1> Microsoft VBScript 运行时错误:文件未找到
或者:
temp.vbs<8,1> Microsoft VBScript 运行时错误:类型不匹配:'x<...>'


产生错误的原因是有些文本本身有问题,本来是一行数据的,被分割成了两行,
导致改行数据没有所选列的数据。遇到这种情况需要提示哪行数据有问题。

比如下面这段样本,累加第4列数据时就会报错:

1|200757|45665|4000.0|其它|殷顺|200757|单方合同
2|200752|3454534534|
10232.35|其它|殷顺|200757|单方合同
3|202810|56546|479.0|其它|殷顺|200757|单方合同
4|202810|2222|479.0|其它|殷顺|200757|单方合同
5|202810|4343|23.72|其它|殷顺|200757|单方合同

[ Last edited by youaoyi on 2008-9-6 at 09:54 AM ]
第9楼 HAT 发表于 2008-09-06 01:19
版主 发帖 5,017 积分 9,023
本来是一行数据的,为何被分割成了两行?你不能事先把文本检查并处理?
用16进制编辑器打开看看那个多余的换行是不是特殊字符?
第10楼 youaoyi 发表于 2008-09-06 09:49
初级用户 发帖 67 积分 154
如果能查到是哪里出了错,就可以事先处理了。

比较麻烦的是几十万上百万条数据,不知道在哪一行出了问题。

其实在此之前我已经使用 change 1.txt /from "&H0D5C0D0A" /to "&H5F"

替换了一次断行的错误,另外还有什么错误,查找不到了 ......

如果上述程式能在合计失败时显示出是在哪行出现了问题,就完美了。

[ Last edited by youaoyi on 2008-9-6 at 09:50 AM ]
第11楼 HAT 发表于 2008-09-06 10:31
版主 发帖 5,017 积分 9,023
能否以附件的方式把出错的文件传上来看看?
第12楼 shqf 发表于 2008-09-06 10:46
初级用户 发帖 18 积分 35
@echo off&setlocal enabledelayedexpansion
set z=0&set x=0&set n=0
set /p file=输入要处理的文件名:
set /p col=输入列:
echo 正在对第%col%列数值进行合计……
for /f "usebackq tokens=%col% delims=|" %%i in ("%file%") do (
set /a n+=1
for /f "tokens=1,2 delims=." %%a in ("%%i") do (
if "%%a"=="" call :countfail
if "%%b"=="" call :countfail
set bb=%%b
if "!bb:~1,1!" equ "" set bb=!bb!0
if "!bb:~0,1!" equ "0" set bb=!bb:~1,1!
set /a z=!z!+%%a
set /a x=!x!+!bb!
)
)
set x1=%x:~0,-2%
set x2=%x:~-2,2%
set /a totle=%z%+%x1%
echo 第%col%列数值合计为%totle%.%x2%
pause
goto :eof

:countfail
echo 合计失败,请检查第%n%行原始数据。
pause
exit

[ Last edited by shqf on 2008-9-6 at 12:24 PM ]
第13楼 shqf 发表于 2008-09-06 11:15
初级用户 发帖 18 积分 35
出错了后,要重新合计,数据多,费时。如一文件中错较多,更烦。考虑专门用一程序,先对文件进行查错。如文中单价都带小数部分,则以小数点为特征进行查找特定的列,以确定是否为单价。
第14楼 youaoyi 发表于 2008-09-06 11:30
初级用户 发帖 67 积分 154
完全的附件小的也有几十兆,附件发不上来,
把上面的样本粘贴到TXT文本也是一样会报错的。

如果2楼和12楼的批处理与原文件都放在同一目录下,都可以正常计算。
实际操作是我把批处理放在桌面上,待处理的文本放在D盘的“测试文件夹”目录下。
这样操作的话,则两个批处理都会报错。
第15楼 HAT 发表于 2008-09-06 11:31
版主 发帖 5,017 积分 9,023
用BAT进行计算的话,问题可能更多。
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023