Board logo

标题: 提取文件逐行內容,進行運算 問題! 麻煩高手解答.! [打印本页]

作者: piziliu2004     时间: 2006-6-7 09:31    标题: 提取文件逐行內容,進行運算 問題! 麻煩高手解答.!

如何提取一下文件中的 每一行中的 一欄字符並進行如下算法.
(函shu down time 的行累加,) 減去 (函 boot star time的行累加)
如54883+54891+55849-54877-54887-55843=?

for /f "delims=! tokens=2" %%i in (1.txt)  do(??????????)
以下是文件.1.txt!
boot star time 2006-06-06 星期二 15:14:37.57 record! 54877
shut down time 2006-06-06 星期二 15:14:43.27 record! 54883
boot star time 2006-06-06 星期二 15:14:47.66 record! 54887
shut down time 2006-06-06 星期二 15:14:51.36 record! 54891
boot star time 2006-06-06 星期二 15:30:43.18 record! 55843
shut down time 2006-06-06 星期二 15:30:49.99 record! 55849
作者: doscc     时间: 2006-6-7 12:12    标题: 试试看! 在xp下试验成功!

boot star time 是单行
shut down time 是双行
那下面代码就可实现楼主的要求.
@echo off
set n=0
set sum=0
for /f "delims=! tokens=2" %%i in (1.txt)  do (
call :s %%i
)
echo %sum%
goto :EOF

:s
set /A n+=1
if "%n%"=="1" (set /A sum-=%1)else set /A sum+=%1 & set n=0
goto :EOF
[ Last edited by doscc on 2006-6-7 at 12:15 ]
作者: piziliu2004     时间: 2006-6-7 17:13
謝謝.!
又學到一點東西.!
GOTO:EOF就是返回到哪個FOR語句吧.!
%1就是繼承FOR語句的%i把!.

如果我想實現兩個for語句的牽套.實現吧如題的for /f "delims=! tokens=2" %%i in (1.txt)  do(......)
分別定義給set1~set6這幾個變量.!例如(set1=54877 ,set2=54883
set3=54887......)

本人想看看兩個for語句的變量是怎麼傳遞的.!
謝謝
作者: bagpipe     时间: 2006-6-7 17:30
应该可以更加简洁,如下代码:
@echo off&setlocal enabledelayedexpansion
set /a l=0
for /f "tokens=2 delims=!" %%i in (1.txt) do (
set /a l=%%i+!l!
)
echo %l%
作者: piziliu2004     时间: 2006-6-7 17:42
re : bagpipe
set /a l=%%i+!l! 是將六個數累加.!與我的題議不符合.!
作者: bagpipe     时间: 2006-6-8 10:23
@echo off&setlocal enabledelayedexpansion
set /a l=0
for /f "tokens=2 delims=!" %%i in (1.txt) do (
set /a n+=1
if !n!==1 (
set /a l=!l!-%%i
) else (
set /a l=!l!+%%i&set n=0
)
)
echo %l%
流泪而走.........
作者: piziliu2004     时间: 2006-6-8 11:26
謝了.!
作者: willsort     时间: 2006-6-8 11:59
Re piziliu2004(3楼):

      实际上你的命题没有必要也很难用嵌套循环来实现,而循环之间的变量传递也不是很复杂,基本上可以说,在内层循环中可以直接应用外层循环的变量,只要它没有被内层循环的变量所覆盖,这取决于变量的命名。比如:

     for /l %%i in (1,1,5) do for %%j in (a,b,c,d) do echo.Counter:%%i%%j

     至于你提到的将文件内容逐行获取到环境变量,感觉没有太大意义,因为通常我们都是在获取某一行内容后即时进行各种处理后输出。不过仍然给出示例代码以供参考。
@echo off & setlocal EnableDelayedExpansion
for /f "tokens=8" %%i in (1.txt) do (
    set /a c+=1
    set set!c!=%%i
)
set set

作者: piziliu2004     时间: 2006-6-8 13:44
謝謝willsort
版主.
小弟想問幾個問題
1: .set set 是顯示當前所有設定的變量麼?.那位什麼我rem  掉"set set"會設定變量失敗呢?

2: 還有位什麼我在set set!c!=%%i後插入"echo %set!c!%"顯示失敗呢?
作者: 不得不爱     时间: 2006-6-8 14:07
1:  set set 会显示%set%的值!
2:set set!c!=%%i後不能有其他命令,否则都会成为变量!
作者: piziliu2004     时间: 2006-6-8 14:40
還是有點迷糊.
1:  set set 会显示%set%的值!  那麼僅僅顯示%set%而已為什麼掉"set set"整個批處理會沒辦法實現設置變量的功能呢?.

2:set set!c!=%%i後不能有其他命令,否则都会成为变量!是為什麼?
難道是!c!的問題?.

3:順便問一下.!c!為什麼不能用%c%代替呢?
作者: 不得不爱     时间: 2006-6-8 14:55
没有SET SET 只不过不显示set1 set2.......的植!
作者: piziliu2004     时间: 2006-6-8 15:12
re:qwe1234567
版主 謝謝.! 是我誤解了.
我是這麼判斷的. rem set set--> 批處理執行完返回命令行後  ,--> 我執行"set"卻看不到set1~setn這些變量.
經過驗證原來我不去掉set set. 我執行set我同樣看不到set1~setn這些變量.

1: 為什麼看不到設定的set1~n變量. 是批處理setlocal EnableDelayedExpansion再作怪麼?

2: 如果我想讓批處理結束後. 返回dos命令下執行set仍然可以看到我設置的變量怎麼實現呢?
作者: willsort     时间: 2006-6-8 20:40

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:删除主题:《21098 - 如果我想實現兩個for語句的嵌套傳遞變量.實現如題 》
说明:原主题与现主题部分内容重复
处罚:扣除因发表该主题而奖励的6点积分,扣除主题违规惩罚性2点积分
───────────────── 版务记录 ─────────────────


Re piziliu2004:

      !c!是变量延迟扩展的用法,在本论坛已有多次解释,建议你先搜索一下,另外可以参考 cmd /? 的命令行帮助信息。

      set1~n失效确实是setlocal的原因,具体细节,请参考setlocal /?以及Windows的帮助和支持中心的相关信息。

      通常,我们不需要将批处理内的变量修改在批处理结束以后仍然保留,尤其是多个变量的情况,如果你有这方面的需要,则说明程序的结构设计存在一定的缺陷。当然,将变量修改保持到批处理以外是可以的,最简单的方法是不使用setlocal命令,如果必须要使用它,比如用它开启变量延迟扩展特性,则需要使用另外一个技巧。

      这个技巧我很少用到,只有在难以避免使用setlocal且必须保存变量供给外部程序引用时才会使用。方法是使用利用率很低的endlocal命令。例如,在程序结束前想要保留变量envar的修改可以在程序末尾插入以下语句。
      endlocal & set envar=%envar%

      对于8楼的代码,则相对更为复杂一些,因为需要保留多个动态名的变量。可以使用以下的代码。
@echo off & setlocal EnableDelayedExpansion
if exist _setvar.bat del _setvar.bat
for /f "tokens=8" %%i in (1.txt) do (
    set /a c+=1
    echo set set!c!=%%i>>_setvar.bat
)
endlocal & if exist _setvar.bat (call _setvar.bat & del _setvar.bat)
set set
[ Last edited by willsort on 2006-6-8 at 20:44 ]
作者: wang6610     时间: 2006-6-10 15:28
收藏!!!
作者: piziliu2004     时间: 2006-6-12 11:24
謝謝.!
willsort
版主
作者: wydos     时间: 2006-6-12 12:44    标题: 提取txt文件的第一行內容给此文件重命名!问题 !麻煩高手解

如何提取txt文件的第一行內容,并用此行内容给此文件重命名?
可不可以一次处理多个文件?
作者: 3742668     时间: 2006-6-12 17:51


  Quote:
如何提取txt文件的第一行內容,并用此行内容给此文件重命名?
可不可以一次处理多个文件?

以下代码基本上能满足你的要求:
@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%i in (%*) do (
                    set /p filename=<%%i
                    ren %%i "!filename!%%~xi"
                   )
endlocal

作者: wydos     时间: 2006-6-12 21:30
先谢谢版主了!
但好象不行!
能不能解释一下每行代码的作用,谢谢!!!
作者: wydos     时间: 2006-6-12 21:52
我把"%*"改为"*.txt" 就可以了,但对于带有空格文件名的文件不起作用,希望版主能不能改进一下。
还有,我还是不理解代码的意思,版主能不能再解释一下?
谢谢!!
作者: namejm     时间: 2006-6-12 22:35
  如果文件名带有空格,和路径带有空格的解决办法是一样的,加引号就可以了。
作者: 3742668     时间: 2006-6-13 11:44


  Quote:
先谢谢版主了!
但好象不行!
能不能解释一下每行代码的作用,谢谢!!!
我把"%*"改为"*.txt" 就可以了,但对于带有空格文件名的文件不起作用,希望版主能不能改进一下。 ...

运行时需要带参数,在我这测试可以处理带空格的情况。set /p filename=<%%i用来读取文本的第一行内容。几条命令都很简单,你参照 帮助与支持 应该能自己看明白的。你可以在sendto目录下建立该批处理的快捷方式,这样就可以直接用鼠标选定批量改名了。
作者: wydos     时间: 2006-6-13 19:25
今天研究了一下,基本上弄懂了。
不过还是有点疑问,想请教版主。就是“%*”是不是指“*.*"?你说的参数也是不是指“*.*"?若我要修改txt,就可输入:”1 *.txt",我理解得对不对?
还有for语句的“do (  )"用法我还是第一次见到(就是do后面带个”()“),帮助与支持 上面好象都没介绍,能不介绍一下他的用法 。
作者: bagpipe     时间: 2006-6-14 09:59
%*请查看一下CALL /?帮助,这个是表示批处理所有的参数,我想楼上测试的时候也是不清楚这个而错的
作者: wydos     时间: 2006-6-14 14:19
谢谢 24 楼!
今天凑巧在CALL /?帮助中看见,终于明白了!!!
但是for语句的“do (  )"用法,哪里有介绍,24 楼能不能解答一下,谢谢!!!