windows bat系列4:for处理案例一 逐行处理&字段分割_那个少年的博客-程序员信息网

技术标签: Windows DOS  

背景

假设有文件内容如下,其以列表形式显示了不同文件夹中文件数量,要求提取清单列中最后一列的数字

                   CHECK IS THERE ANY INTERFACE FILES IN I/O DIRS                                                                                            
-------------------------------------------------------------------------------
08 JUN 18 16:40:24                                                          
                                                                               
FILES IN    ..\BNK.DATA\OFSDATA\AIO.IN.DIR:   0
FILES IN                       AIO.IN.FILE:   0
FILES IN              F.AIOCARD.CREDIT.OUT:   0
FILES IN   ..\BNK.DATA\OFSDATA\RTGS.IN.DIR:   0
FILES IN                      RTGS.IN.FILE:   0
FILES IN                     RTGS.OUT.FILE:   0
FILES IN  ..\BNK.DATA\OFSDATA\RTGS.OUT.DIR:   0
FILES IN                            OFS.IN:   0
FILES IN            SWIFT.FTP\F.DE.I.MS000:   0
FILES IN            SWIFT.FTP\F.DE.O.MS000:       93                                                                               

代码

@echo off
::setlocal
setlocal enabledelayedexpansion
rem into current path
cd %~dp0
set FILENAME=%~dp0chkio_out.txt
for /f "delims=^" %%i in (%FILENAME%) do (
 @echo %%i | findstr /B "FILES" >nul && (set str=%%i & (for /f "tokens=4 delims= " %%m in ("!str!") do (
              echo %%m)))
)
endlocal

pause

测试结果:

程序思路:

类似于此类(文件处理、字段抽取)问题,dos中提供功能强大的for语句进行处理。因而,处理思路如下:

1.      需要找到带文件个数的行,它们以FILES IN 开头,另外需要排除非FILES IN 开头的行;

2.      在1的基础上,对于每行文本,若以空格作为分割符,数字都处于第四列,因而需要想办法提取第四列内容。

程序说明:

1.      setlocal enabledelayedexpansion

设置本地为延时扩展,其实也就是:延迟变量,全称延迟环境变量扩展。下面是dos官方解释(setlocal/?)

开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。

2.      cd %~dp0

进入脚本所在目录,脚本和待处理的文件(chkio_out.txt)放在同一目录

3.      set FILENAME=%~dp0chkio_out.txt

拼接完整的待处理路径名;

4.      for /f "delims=^" %%iin (%FILENAME%) do (

@echo %%i | findstr /B"FILES" >nul && (set str=%%i & (for /f "tokens=4delims= " %%m in ("!str!") do (

             echo%%m)))

)

此双层for语句为文件处理主体,具体分析如下:

a.      外层for循环以^(换行符)作为分隔符,逐行读取文件内容;

b.      @echo %%i | findstr /B"FILES" >nul

首先echo每行内容,再采用管道过滤以FILES开头的行,findstr的参数/B表示:在一行的开始配对模式,之后将结果重定到nul(不打印到屏幕)

c.      set str=%%i & (for /f"tokens=4 delims= " %%m in ("!str!") do ( echo %%m)))

经过前一轮for处理,我们抽取出所有以FILES开头的行。此处再进行第二层处理,重新将每行内容赋予变量str(字符串),再对字符串进行字段分割:

tokens=4表示将分割产生的第四个字段传递到循环体;

delims= (注意等号后面有空格)表示以空格分割字符串

!str!      表示字符串内容,因为采用延时绑定,需要用!!取变量内容

echo %%m          最后echo出结果。

符号小结:

| 前面命令输出结果作为后面命令的输入内容
|| 前面命令执行失败的时候才执行后面的命令
& 前面命令执行后接着执行后面的命令
&& 前面命令执行成功了才执行后面的命令

总结:

这种文件处理/字段分割的例子,首先要对照文件安内容设计清晰的处理思路,DOS中FOR命令是处理此类问题的能手,读者只要自己写几个,就能孰能生巧。

附dos帮助手册:

FOR

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,
    每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,
    然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。
    以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
    您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个
    或多个指定不同解析选项的关键字。这些关键字为:

        eol=c           - 指一个行注释字符的结尾(就一个)
        skip=n          - 指在文件开始时忽略的行数。
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                          默认分隔符集。
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                          的 for 本身。这会导致额外变量名称的分配。m-n
                          格式为一个范围。通过 nth 符号指定 mth。如果
                          符号字符串中的最后一个字符星号,
                          那么额外的变量将在最后一个符号解析之后
                          分配并接受行的保留文本。
        usebackq        - 指定新语法已在下类情况中使用:
                          在作为命令执行一个后引号的字符串并且一个单
                          引号字符为文字字符串命令并允许在 file-set
                          中使用双引号扩起文件名称。
findstr
在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B         在一行的开始配对模式。
  /E         在一行的结尾配对模式。
  /L         按字使用搜索字符串。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhaogang1993/article/details/80629912

智能推荐

python写入csv不换行,python - 如何使用python pandas .to_csv附加到csv时强制换行 - 堆栈内存溢出..._鳗鱼神君的博客-程序员信息网

当附加到csv时,我的第一行是从现有的最后一行而不是新行开始的。我一直在搜索,但我只是找到了在追加模式下打开csv或在写入csv时使用追加模式的基本用法。 我无法理解这里接受的答案( to_csv追加模式不会附加到下一个新行 ),因为它似乎要求在用f.write("/n") ”)写入(“/ n”)之前打开现有文件f.write("/n") 。 这个答案( 如何将pandas数据添加到现有的cs...

JavaWeb项目连接Oracle数据库_weixin_30426957的博客-程序员信息网

参考网址:http://jingyan.baidu.com/article/0320e2c1d4dd0b1b87507b38.html既然你要链接oracle数据库 ,那么首先就是先打开我们的oracle数据库了(登陆oracle后用scoot用户登录)2第二步,就是打开我们的MyEclipse开发工具3...

ZYNQ+FPGA读取SD卡BMP图片并通过HDMI显示_Qiweiii的博客-程序员信息网_fpga读取图片

代码下载https://github.com/qiweiii-git/qwi06_sdp2hdmi代码编译1.在linux下使用./makeall.sh即可自动编译vivado工程。如何使用linux自动编译工程请参考利用Linux自动编译Vivado工程2.在Windows下打开vivado,运行source run.tcl即可自动创建工程并编译。系统框图最终显示的图片代码解...

Java小白第四节------数据转换_weixin_49690251的博客-程序员信息网

• 数据转换“勿以小杯成大物”不同类型占用的内存空间不同byte < int < long低精度放入高精度永远不会溢出,并且总是成功的高精度放进低精度必然会有信息丢失1. 低精度向高精度转换隐形转化(自动转换)显性转化(强制转换)隐式转换含义:从低级类型像高及类型转化,系统将自动执行,程序员无需执行任何的操作,也可以叫做自动转换byte a = 8; // 8int b = a; // 8long c = b; // 8double d = c; // 8.0

sx1268 中文_SX1268原理图_SX1268芯片datasheet_SX1268数据手册_SX1268无线收发器模块_SX1268用户手册_一牛网..._weixin_39822493的博客-程序员信息网

今天这个篇幅我们继续来探讨下LoRa领域的相关芯片,Semtech公司推出的SX1261/62/68系列的芯片,不知道各位朋友有没有了解过这系列芯片,一开始推出市场,就是打着特殊的LoRa调制方式、低功耗跟超远距离传输的卖点。而事实上,这系列芯片的功能也确实更为强大,体积方面也有优势。现在我们就重点关于SX1262、SX1261、SX1268这三款芯片的选型指南进行分析对比。 产品简述: ...

View绘制过程详解_CharonChui的博客-程序员信息网

View绘制过程详解界面窗口的根布局是DecorView,该类继承自FrameLayout.说到View绘制,想到的就是从这里入手,而FrameLayout继承自ViewGroup。感觉绘制肯定会在ViewGroup或者View中, 但是木有找到。发现ViewGroup实现ViewParent接口,而ViewParent有一个实现类是ViewRootImpl, ViewGruop中会使用ViewR

随便推点

给我的Nokia3100_weixin_30393907的博客-程序员信息网

已经用了近四年了,开机关机键被我摁坏了,先是开机键(即顶上那个白色的橡胶东东)坏了,被指甲盖给顶穿了,于是扔掉后用钥匙什么呢,摁一下又可以开机了;后来,下面的那个灰色的开关也被硬硬地按掉了(把白色的橡胶去掉后可以看的见,那个东东被我给摁掉了),今天忘了及时充电,害得早上没能开机。解决方法: 1.重新换一个开机键。价格估计二十元吧,见:http://ks.cn.yahoo.com/q...

TCP 传递信息_weixin_30474613的博客-程序员信息网

什么是socket?Socket就是套接字。客户端与服务器之间通信用的。Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。以下是试验代码:(vs2005/xp试验通过)一个服务器端与客户端交互,实现客户端与服务器...

oracle导入日志出不来,Oracle 11.2.0.1执行数据泵导入导出操作,导入日志报ORA_破晓朝阳的博客-程序员信息网

http://resources.arcgis.com/zh-cn/content/kbase?fa=articleShowd=38470 ArcSDE版本:9.3.1和10 在Oracle11.2.0.1数据库使用数据泵(EXPDP、IMPDP)进行数据导入导出,在导入(IMPDP)过程中在导入日志文件报 ORA-39083: Object type INDEX failed to creaht...

Unity里的静态批处理和动态批处理_Real_JumpChen的博客-程序员信息网

内容会持续更新,有错误的地方欢迎指正,谢谢!前言Unity在运行时可以将一些物体进行合并,从而用一个绘制调用来渲染他们。这一操作,我们称之为“批处理”,能得到越好的渲染性能。Unity中内建的批处理机制所达到的效果要明显强于使用几何建模工具的批处理效果,因为,Unity引擎的批处理操作是在物体的可视裁剪操作之后进行的,处理的几何信息少很多。材质只有拥有相同材质的物体才可...

VS调试技巧(上)_终成一个大象的博客-程序员信息网

转载自:http://blog.jobbole.com/45249/近碰巧读了Ivan Shcherbakov写的一篇文章,《11个强大的Visual Studio调试小技巧》。这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧。我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧。(如果你是工作在托管代码下,调试器会...

第四章 标签页_weixin_33763244的博客-程序员信息网

为什么80%的码农都做不了架构师?>>> ...

推荐文章

热门文章

相关标签