中国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] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: