标题: [求助]如何将文本的指定列累加并在出错时提示问题行?
[打印本页]
作者: youaoyi
时间: 2008-9-5 16:14
标题: [求助]如何将文本的指定列累加并在出错时提示问题行?
如何将文本中指定列的数值累加求得合计数?
(在合计时如果报错,希望能够提示哪一行出错了。)
需要合计的数值在不同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 ]
作者: huahua0919
时间: 2008-9-5 19:40
@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 ]
作者: youaoyi
时间: 2008-9-5 21:24
计算正确,但是输入的列好像不对,
样本2,需要求和的数值在在第7列,但是需要输入6才能正确计算,
样本3,需要求和的数值在第4列,但是需要输入3才能正确计算。
作者: huahua0919
时间: 2008-9-5 22:17
修改过了,你在试试
并且优化如果文件名含空格会出错的情况
[ Last edited by huahua0919 on 2008-9-5 at 10:25 PM ]
作者: HAT
时间: 2008-9-5 22:24
作者: youaoyi
时间: 2008-9-6 00:25
合计计算时常常因为原TXT文件本身有问题而报错
如果报错 如何显示"合计失败,请检查第XXX行数据。"这段字符?
[ Last edited by youaoyi on 2008-9-6 at 09:55 AM ]
作者: HAT
时间: 2008-9-6 00:38
作者: youaoyi
时间: 2008-9-6 01:11
原文本本身有问题报错时提示:
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 ]
作者: HAT
时间: 2008-9-6 01:19
本来是一行数据的,为何被分割成了两行?你不能事先把文本检查并处理?
用16进制编辑器打开看看那个多余的换行是不是特殊字符?
作者: youaoyi
时间: 2008-9-6 09:49
如果能查到是哪里出了错,就可以事先处理了。
比较麻烦的是几十万上百万条数据,不知道在哪一行出了问题。
其实在此之前我已经使用 change 1.txt /from "&H0D5C0D0A" /to "&H5F"
替换了一次断行的错误,另外还有什么错误,查找不到了 ......
如果上述程式能在合计失败时显示出是在哪行出现了问题,就完美了。
[ Last edited by youaoyi on 2008-9-6 at 09:50 AM ]
作者: HAT
时间: 2008-9-6 10:31
作者: shqf
时间: 2008-9-6 10:46
@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 ]
作者: shqf
时间: 2008-9-6 11:15
出错了后,要重新合计,数据多,费时。如一文件中错较多,更烦。考虑专门用一程序,先对文件进行查错。如文中单价都带小数部分,则以小数点为特征进行查找特定的列,以确定是否为单价。
作者: youaoyi
时间: 2008-9-6 11:30
完全的附件小的也有几十兆,附件发不上来,
把上面的样本粘贴到TXT文本也是一样会报错的。
如果2楼和12楼的批处理与原文件都放在同一目录下,都可以正常计算。
实际操作是我把批处理放在桌面上,待处理的文本放在D盘的“测试文件夹”目录下。
这样操作的话,则两个批处理都会报错。
作者: HAT
时间: 2008-9-6 11:31
作者: shqf
时间: 2008-9-6 11:47
版主说得对,由于批处理不支持小数,我是将整数部分和小数部分分别合计,最后再合并的,并对小数部分可能是08等形式进行了处理,不知是否考虑全了?这样对大量数据处理的速度是否慢得不行?
楼主,你输入文件名时带上绝对路径,就不会有问题了。
[ Last edited by shqf on 2008-9-6 at 11:51 AM ]
作者: youaoyi
时间: 2008-9-6 11:54
2楼与12楼的两个批处理在测试时,都是将文本拖拽入窗口的,所以路径都是完整的。
作者: HAT
时间: 2008-9-6 12:04
1、版主没有在这个帖子里出现吧?
2、是不是还要考虑批处理计算的上限呢?
作者: shqf
时间: 2008-9-6 12:34
看楼上的帖子多了,我以为你是版主呢。
多谢提醒,我的程序中果真有处考虑不周,现已改。
最大可处理的数好象要达21亿左右吧,楼主的合计值要是超过这个就不行了。