Board logo

标题: [文本处理] [已解决]请教批处理如何提取这个文本? [打印本页]

作者: a262615704    时间: 2011-10-9 06:30     标题: [已解决]请教批处理如何提取这个文本?

本帖最后由 a262615704 于 2011-10-9 21:53 编辑

info.txt保存了三块磁盘信息,内容如下:
Disk: 1 (149.05GB) M:[WDC WD1600AAJS-22PSA0] S:[WD-WCAP91806016]
    1.1: (  10.01GB) [G:\] Active Volume NTFS l:[GO7]
    1.2: (  18.94GB) [D:\] Volume NTFS l:[PAGE]
    1.3: ( 100.09GB) [E:\] Volume NTFS l:[DATA]
    1.4: (     10GB) [F:\] Volume NTFS l:[WIN7]
    1.5: (     10GB) [C:\] Volume NTFS l:[WINXP]
         (   2.49MB) Unused Space
Disk: 2 (7.50GB) M:[Ut165 USB Flash Disk 0.00]
    2.1: (   7.49GB) [I:\] Active Volume NTFS l:[时尚蛤蟆]
         (   6.33MB) Unused Space
Disk: 3 (3.89GB) M:[Ut165 USB Flash Disk 0.00]
    2.1: (   3.88GB) [j:\] Active Volume NTFS l:[时尚]
         (   6.33MB) Unused Space


请教如何用批处理显示如下:
磁盘数量:3
磁盘1的容量:149.05GB
磁盘2的容量:7.50GB
磁盘3的容量:3.89GB

非常感谢!!!
作者: 冷玉公子    时间: 2011-10-9 09:15

  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. Set Volue=0
  3. For /F "tokens=1-10 delims=:() " %%A In (Info.txt) Do (
  4. IF /i "%%A" == "Disk" (
  5. Set /A Volue+=1
  6. Set Info!Volue!=磁盘%%B的容量是%%C
  7. )
  8. )
  9. Echo 磁盘总数是%Volue%
  10. For /L %%A In (1,1,%Volue%) Do (
  11. Echo !Info%%A!
  12. )
  13. Pause>Nul
复制代码
你这个题,应该会得到很多种思路的。
我这个只是其中一种.
如果不是要求先显示出 磁盘数量的话 将会更简单.
作者: awk    时间: 2011-10-9 09:47

  1. gawk -F[()] "/Disk:/{n+=1;a[n]=$2}END{print \"磁盘数量:\"n;for(i=1;i<=n;i++)print \"磁盘\"i\"的容量:\"a[i]}" info.txt | more
复制代码

作者: 601997526    时间: 2011-10-9 09:47

  1. @echo off
  2. for /f "tokens=2 delims=:()" %%i in ('findstr "^Disk:" info.txt') do set disk=%%i
  3. echo 磁盘数量:%disk%
  4. for /f "tokens=2,3 delims=:()" %%i in ('findstr "^Disk:" info.txt') do echo.磁盘%%i的容量:%%j
  5. pause
复制代码

作者: awk    时间: 2011-10-9 10:44

  1. gawk -F"[() ]" "/Disk:/{n=$2;a[n]=$4}END{print \"磁盘数量:\"n;for(i=1;i<=n;i++)print \"磁盘\"i\"的容量:\"a[i]}" info.txt | more
复制代码

作者: FOR    时间: 2011-10-9 11:00

回复 5# awk


请问 -F[()]   这里[]起什么作用?我测试如果不要则无法用()分隔
作者: awk    时间: 2011-10-9 11:40

回复 6# FOR


类似于批处理for命令里面的delims=()
你懂的
作者: FOR    时间: 2011-10-9 12:01

回复 7# awk

指定多个分隔符的时候必须用 [] 括起来吗?
这个和 delims=() 还是有区别的
比如:abcd()1234
作者: Hello123World    时间: 2011-10-9 12:02

  1. @echo off&Setlocal EnableDelayedExpansion
  2. For /f "tokens=1,2 delims=()" %%i in ('Findstr /i "disk" 1.txt') do (
  3. Set /a n+=1
  4. Echo %%i 容量 %%j
  5. )
  6. echo 合计磁盘数:!n!
  7. pause
复制代码

作者: awk    时间: 2011-10-9 13:43

回复 8# FOR


你所知道的区别主要有哪些?
作者: a262615704    时间: 2011-10-9 15:52

回复 2# 冷玉公子


   请问我把依据出现”Disk: “做为判断磁盘总数,代码如何实现,因为有可能会出现”Disk“在其它地方。谢谢
作者: awk    时间: 2011-10-9 16:07

回复 11# a262615704
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-3 delims=() " %%a in (info.txt) do (
  4.     if "%%a" == "Disk:" (
  5.         set /a value+=1
  6.         set info!value!=磁盘%%b的容量是%%c
  7.     )
  8. )
  9. echo 磁盘总数是%value%
  10. for /l %%a in (1,1,%value%) do (
  11.     echo !info%%a!
  12. )
  13. pause
复制代码

作者: a262615704    时间: 2011-10-9 16:26

回复 12# awk


   请问如何把磁盘顺序和容量大小分别赋值给变量,方便后面做为比较容量大小?
想要得到的结果显示如下:
磁盘A,容易为X
磁盘B,容易为Y
磁盘C,容量为Z
磁盘A的容量最大
作者: FOR    时间: 2011-10-9 16:40

回复 10# awk

abcd()1234
用 delims=()  1234为第二列
用 gawk -F [()] 1234 为第三列
作者: CrLf    时间: 2011-10-9 17:28

本帖最后由 CrLf 于 2011-10-9 17:29 编辑

如此特殊的文本,为什么没人用 eol...
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "eol= tokens=2 delims=()" %%a in (info.txt) do (
  3.    set /a n+=1
  4.    set disk!n!=%%a
  5. )
  6. echo 磁盘数量:%n%
  7. for /l %%a in (1 1 %n%) do echo 磁盘%%a的容量是!disk%%a!
  8. pause
复制代码

作者: awk    时间: 2011-10-9 18:25

回复 14# FOR


是的,这一点初学者很容易混淆。
还有一点区别就是-F可以用字符串做列分隔符,但是delims不行。
作者: FOR    时间: 2011-10-10 03:07

回复 16# awk

多谢你的指点,实在很想学 gawk 可是奈何电脑不争气,你的这个代码我下午测试还是正常,现在又不行了,郁闷。
现在出问题都不知道到底是写错了还是 gawk 程序问题
  1. gawk -F\" "{print $1}" a.txt
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2