返回列表 发帖

【练习-033】计算并重写xls文件

出题目的:
       通过解题熟练掌握数值计算的技巧以及重写文件的技巧
加分原则:
       1、完美代码加分15分
       2、思路独特基分5分
       2、代码高效基分4分
       3、代码简洁基分3分
       4、代码通用基分2分
       5、无临时文件基分1分
题目如下:
       有一test.xls文件,原文件及内容如下

链接: https://pan.baidu.com/s/12E6O0w67T1_0MPO-mS2lTQ?pwd=bsk7

      要求通过批处理计算表中各人的工资总和(结果保留两位小数,填写在total后的空格里),并改写test.xls如下图

相关说明:
       1、本题说难不难说容易却不是那么简单,在数值计算上有很多要考虑的问题,大家细心应答了。
       2、暂请版主们不要贴代码,但可以跟贴做提示和指导。
***共同提高***

可否先把小数点向后推几位先变成整数,对整数计算完之后再转换为小数呢?~
心绪平和,眼藏静谧。

TOP

回二楼这样的方法不是不行,但不通用,如不知道小数后有几位数呢?
***共同提高***

TOP

提示:用delims来处理小数。

[ 本帖最后由 batman 于 2008-12-13 22:49 编辑 ]
***共同提高***

TOP

刚看到了batman贴在4楼的答案.
然后试了一下,输出答案跟题目中图2的不一样.

稍微修改了一下,可以做到显示一样的.



刚又试了一下,正确的代码贴到这里,也会变成错的.
里面有三个地方需要把空格换成TAB键.

[ 本帖最后由 semiuel 于 2008-12-13 23:18 编辑 ]

TOP

回5楼:是的,论坛程序处理不了tab,会将tab默认为空格,原来在cn-dos也是这样的,
不知道为什么一直解决不了这个问题。同时提示大家写入xls文件时各列之间应用tab格
开。。。
***共同提高***

TOP

@echo off&setlocal enabledelayedexpansion
for /f "skip=1 tokens=1,2,3 delims=        " %%a in (test.xls) do (
  if not defined flag >test.xls echo job        money
  set flag=1
  if "%%b"=="total" (
    >>test.xls echo %%a:%%b        !total:~0,-2!.!total:~-2!
    set total=0) else (
    >>test.xls echo %%b        %%c
    call :count %%c
  )
)
pause
set flag=&set total=&set money=
exit
:count
set money=%1
if "%money:~-3,1%"=="." (set money=%money:.=%) else (
  if "%money:~-2,1%"=="." (set money=%money:.=%0) else (
    set money=%money%00
  )
)
set /a total=%total%+%money%
goto :eofCOPY
注:delims是以TAB来分开提取的,echo句中也是TAB来分开的

[ 本帖最后由 shqf 于 2008-12-14 10:36 编辑 ]
1

评分人数

    • batman: 在通用和简洁上还可提高PB + 10

TOP

楼上的兄弟还请注意代码的书写规范,分清层次,切不可写在一堆,同时代码还可简化。

[ 本帖最后由 batman 于 2008-12-14 10:45 编辑 ]
***共同提高***

TOP

@echo off&setlocal enabledelayedexpansion
for /f "skip=1 tokens=1,2,3 delims= " %%a in (test.xls) do (
  if not defined flag >test.xls echo job money
  set flag=1
  if "%%b"=="total" (
    >>test.xls echo %%a:%%b !total:~0,-5!.!total:~-5!
    set total=0) else (
    >>test.xls echo %%b %%c
    call :count %%c
    set /a total=!total!+!money!
  )
)
test.xls
exit
:count
for /f "tokens=1,2 delims=." %%i in ("%1") do (
  set money=%%j00000
  set money=!money:~0,5!
  set money=%%i!money!
)
goto :eofCOPY
小数计算部分略作改善,5位小数内可行。其他地方不知如何再精简了。

TOP

此题难道就这么难吗?技术组的也没看见几个来接招的!贴出本人的解,大家测试时请将标注为[TAB]的地方改为制表符:

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1-3" %%a in ('type test.xls') do (
     if not defined flag (
       echo %%b[TAB]%%c>test.xls&set "flag=a"
       ) else (
       if "%%c" neq "" (
         for /f "tokens=1,2 delims=." %%i in ("%%c") do (
              set "a=%%i"&set "b=%%j00"&set "+=+"
              if "!a:~,1!" equ "-" set "+=-"
              set /a num1!+!=!a:-=!,num2!+!=1!b:~,2!%%100
              if !num2! geq 100 set /a num2-=100,num1+=1
              if !num2! lss 0 set /a num2+=100,num1-=1
              if !num2! lss 10 set "num2=0!num2!"
         )
         echo %%b[TAB]%%c>>test.xls
         ) else (
         echo %%a:%%b[TAB]!num1!.!num2!>>test.xls&set /a num1=0,num2=0
      )
    )
) COPY



[ 本帖最后由 batman 于 2008-12-16 17:24 编辑 ]
***共同提高***

TOP

来一个不通用的,先化为整数~
@Echo Off & setlocal EnableDelayedExpansion
Echo Job        Money>tmp.xls
For /F "skip=1 tokens=1,2*" %%a in (test.xls) do (
      If "%%c" neq "" (
          set "sep="
          Echo %%b[tab]%%c
          set "num=%%c000" & set "num=!num:.=!"
          If "!num:~,1!" equ "-" (set "sep=-" &set "num=!num:-=!")
          set "num=!sep!!num:~,4!"
          set /a _%%a += num
          ) else (
          Echo %%a:total[tab]!_%%a:~0,-2!.!_%%a:~2!
     )
)>>tmp.xlsCOPY

[ 本帖最后由 pusofalse 于 2008-12-15 00:06 编辑 ]
1

评分人数

    • batman: 代码还是够简洁的PB + 5
心绪平和,眼藏静谧。

TOP

本人认为在数值加减计算上用delims=.将数值分为两个部分来计算比较合适,但在数值乘除计算上还是将数值先化为整数来计算再化为小数较为合适。
***共同提高***

TOP

二位版主的代码还真简洁,又一次学习了。

TOP

学习了 先计算位数  这样小数可以不考虑其位数
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=        " %%a in ('type test.xls') do (
  if not defined flag (
    echo %%b                %%c>test.xls&set "flag=a"
     ) else (
       if "%%c"=="" (
       for /l %%d in (1 1 !n!) do set mn=!mn!0
         for %%d in (!var1!) do (
             set/a t+=1
             set var2=%%d!mn!
             call set var2=%%var2:~,!n!%%
             >>test.xls call echo %%.!t!%%
             call set/a num+=%%_!t!%%!var2!
             )
       call set num=%%num:~,-!n!%%.%%num:~-!n!%%
       >>test.xls echo %%a:%%b        !num!
    for %%i in (n m var1 num mn t) do set %%i=
  ) else (
    for /f "tokens=1* delims=." %%i in ("%%c") do (
       set /a m+=1
         set "_!m!=%%i"
           set ".!m!=%%b                %%c"
           if not "%%j"=="" (
           set var1=!var1! %%j
           for /f "delims=:" %%l in ('^(echo %%j^&echo.^)^|findstr /o ".*"') do set/a s=%%l-3
           if !s! gtr !n! set/a n=s
         ) else set var1=!var1! 0
       )
     )
   )
)COPY
1

评分人数

TOP

原帖由 terse 于 2008-12-15 23:17 发表
学习了 先计算位数  这样小数可以不考虑其位数
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=        " %%a in ('type test.xls') do (
  if not defined flag (
    echo %%b         ...

trese兄是不是写得复杂了点。。。。
***共同提高***

TOP

返回列表