中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]如何将文本的指定列累加并在出错时提示问题行?
<<   [1] [2]  >>   >
作者:
标题: [求助]如何将文本的指定列累加并在出错时提示问题行? 上一主题 | 下一主题
youaoyi
初级用户





积分 154
发帖 67
注册 2007-10-31
状态 离线
『楼 主』:  [求助]如何将文本的指定列累加并在出错时提示问题行?

如何将文本中指定列的数值累加求得合计数? (在合计时如果报错,希望能够提示哪一行出错了。) 需要合计的数值在不同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 ]


2008-9-5 16:14
查看资料  发短消息  网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 2 楼』:  

@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 f=Fso.GetFile("%file%")
>>temp.vbs echo set fs=Fso.opentextfile^(f.ShortName,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
[ Last edited by huahua0919 on 2008-9-5 at 10:24 PM ]


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





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

计算正确,但是输入的列好像不对, 样本2,需要求和的数值在在第7列,但是需要输入6才能正确计算, 样本3,需要求和的数值在第4列,但是需要输入3才能正确计算。


2008-9-5 21:24
查看资料  发短消息  网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 4 楼』:  

修改过了,你在试试 并且优化如果文件名含空格会出错的情况 [ Last edited by huahua0919 on 2008-9-5 at 10:25 PM ]


2008-9-5 22:17
查看资料  发送邮件  访问主页  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





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

自己去看看split的帮助就知道为什么了




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





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

合计计算时常常因为原TXT文件本身有问题而报错 如果报错 如何显示"合计失败,请检查第XXX行数据。"这段字符? [ Last edited by youaoyi on 2008-9-6 at 09:55 AM ]


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





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

能把让2楼代码报错的文本内容贴出来看看么?




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





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

原文本本身有问题报错时提示: 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 ]


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





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

本来是一行数据的,为何被分割成了两行?你不能事先把文本检查并处理? 用16进制编辑器打开看看那个多余的换行是不是特殊字符?




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





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

如果能查到是哪里出了错,就可以事先处理了。 比较麻烦的是几十万上百万条数据,不知道在哪一行出了问题。 其实在此之前我已经使用 change 1.txt /from "&H0D5C0D0A" /to "&H5F" 替换了一次断行的错误,另外还有什么错误,查找不到了 ...... 如果上述程式能在合计失败时显示出是在哪行出现了问题,就完美了。 [ Last edited by youaoyi on 2008-9-6 at 09:50 AM ]


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





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

能否以附件的方式把出错的文件传上来看看?




2008-9-6 10:31
查看资料  发短消息  网志   编辑帖子  回复  引用回复
shqf
初级用户





积分 35
发帖 18
注册 2008-8-10
状态 离线
『第 12 楼』:  

@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 ]


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





积分 35
发帖 18
注册 2008-8-10
状态 离线
『第 13 楼』:  

出错了后,要重新合计,数据多,费时。如一文件中错较多,更烦。考虑专门用一程序,先对文件进行查错。如文中单价都带小数部分,则以小数点为特征进行查找特定的列,以确定是否为单价。


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





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

完全的附件小的也有几十兆,附件发不上来, 把上面的样本粘贴到TXT文本也是一样会报错的。 如果2楼和12楼的批处理与原文件都放在同一目录下,都可以正常计算。 实际操作是我把批处理放在桌面上,待处理的文本放在D盘的“测试文件夹”目录下。 这样操作的话,则两个批处理都会报错。


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





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

用BAT进行计算的话,问题可能更多。




2008-9-6 11:31
查看资料  发短消息  网志   编辑帖子  回复  引用回复
<<   [1] [2]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: