dos bat批处理的魅力 批处理读取文本中的每一行 操作文件

http://blog.sina.com.cn/s/blog_872457fd0100tasi.html

批处理读取文本中的每一 行

(想了下,还是整个贴到自己空间来了)

我需要的是要读取每一条的第一列信息,如下格式

ary,Ary Hong,,aaa@163.com,,,,

我是需要用户名ary,于是如下:

@echo off

for /f "delims=," %%i in (users.txt) do ......

每一行中,各信息以“,”分隔,所以定义了 "delims=,"后,就会自动读取以“,”分隔的第一个元素了。

虽然可以读取每一行中所需要的信息,但每次执行批处理的时候都找不到记录,后来才发现时文本文件的编码在作怪,如果文件编码是ANSI,是可以读取的,如果是UniCode就无法识别了。不晓得批处理文件的所有文本处理的命令都是有这个限制的,以后得留心了。


转载自:  http://hi.baidu.com/zch11230/blog/item/125ddc8bba61fe15c8fc7aa2.html

批处理之FOR语句祥解2008-12-01 18:31

FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能!

看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令

参数:FOR有4个参数 /d   /l   /r   /f   他们的作用我在下面用例子解释
%%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他;
IN:命令的格式,照写就是了;
(相关文件或命令) :FOR要把什么东西读取然后赋值给变量,看下面的例子
do:命令的格式,照写就是了!
执行的命令:对每个变量的值要执行什么操作就写在这.

可以在CMD输入for /?看系统提供的帮助!对照一下
FOR %%variable IN (set) DO command [command-parameters]

%%variable 指定一个单一字母可替换的参数。
(set)      指定一个或一组文件。可以使用通配符。
command    指定对每个文件执行的命令。
command-parameters
             为特定命令指定参数或命令行开关。

现在开始讲每个参数的意思

/d
仅为目录
如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目

录(而不是指定目录中的文件组)执行指定的 Command。

系统帮助的格式:FOR /D %%variable IN (set) DO command
他主要用于目录搜索,不会搜索文件,看这样的例子

@echo off
for /d %%i in (*) do @echo %%i
pause

把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!
在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来

@echo off
for /d %%i in (???) do @echo %%i
pause

这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了

思考题目:

@echo off
for /d %%i in (window?) do @echo %%i
pause

保存到C盘下执行,会显示什么呢?自己看吧!
/D参数只能显示当前目录下的目录名字,这个大家要注意!

/R
递归
进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则认为是

当前目录。如果 Set 只是一个句点 (.),则只枚举目录树。
系统帮助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command

上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比

/D强大多了!
他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!

@echo off
for /r c:/ %%i in (*.exe) do @echo %%i
pause

咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部

的EXE文件都列出来了,这里的c:/就是目录了。

再来一个
@echo off
for /r %%i in (*.exe) do @echo %%i
pause

参数不一样了,这个命令前面没加那个C:/也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这

个BAT你把他防灾d:/test目录下执行,那么他就会把D:/test目录和他下面的子目录的全部EXE文件列出

来!!!

/L
迭代数值范围
使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)

。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。

如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执

行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是:

系统帮助的格式:for /L %% Variable in (Start#,Step#,End#) do Command

例如:

@echo off
for /l %%i in (1,1,5) do @echo %%i
pause

保存执行看效果,他会打印从1 2 3 4 5 这样5个数字
(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!

再看这个例子
@echo off
for /l %%i in (1,1,5) do start cmd
pause

执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,

我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!

当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535

看完这个被我赋予破坏性质的参数后,我们来看最后一个参数

/f

含有/F的for详细说明

含有/F的for有很大的用处,在批处理中使用的最多,用法如下:
格式:
FOR /F ["options"] %%i IN (file) DO command

FOR /F ["options"] %%i IN ("string") DO command

FOR /F ["options"] %%i IN ('command') DO command

这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。

file代表一个或多个文件

string 代表字符串

command代表命令

["options"] 可选

对于FOR /F %%i IN (file) DO command

file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子。

假如文件a.txt中有如下内容:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

你想显示a.txt中的内容,会用什么命令呢?当然是type,type a.txt

for也可以完成同样的命令:

for /f %%i in (a.txt) do echo %%i

还是先从括号执行,因为含有参数/f,所以for会先打开a.txt,然后读出a.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合,

{“第1行第1列 第1行第2列 第1行第3列”, //第一个元素

“第2行第1列 第2行第2列 第2行第3列”, //第二个元素

“第3行第1列 第3行第2列 第3行第3列”}   //第三个元素

集合中只有3个元素,同样用%%i依次代替每个元素,然后执行do后面的命令。

具体过程:

用%%i代替“第1行第1列 第1行第2列 第1行第3列”,执行do后面的echo %%i,显示“第1行第1列 第1行第2列第1行第3列”,

用%%i代替“第2行第1列 第2行第2列 第2行第3列”,执行echo %%i,显示“第2行第1列 第2行第2列第2行第3列”,

依次,直到每个元素都代替完为止。

为了加强理解/f的作用,请执行一下两个命令,对比即可明白:

for /f %%i in (a.txt) do echo %%i //这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中
的内容。

for %%i in (a.txt) do echo %%i //而这个只会显示a.txt这个名字,并不会读取其中的内容。

通过上面的学习,我们发现for /f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。

它们就是:delims和tokens

delims 用来告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键

比如,还是上面的文件,我们执行下面的命令:

for /f "delims= " %%i in (a.txt) do echo %%i

显示的结果是:

第1行第1列
第2行第1列
第3行第1列

为什么是这样的呢。因为这里有了delims这个参数,=后面有一个空格,意思是再将每个元素以空格分割,默认是只取分割之后的第一个元素。

执行过程是:

将第一个元素“第1行第1列 第1行第2列 第1行第3列”分成三个元素:“第1行第1列” “第1行第2列” “第1行第3列”,它默认只取第一个,即“第1行第1列”,然后执行do后面的命令,依次类推。

但是这样还是有局限的,如果我们想要每一行的第二列元素,那又如何呢?

这时候,tokens跳出来说,我能做到。

它的作用就是当你通过delims将每一行分为更小的元素时,由它来控制要取哪一个或哪几个。

还是上面的例子,执行如下命令:

for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i

执行结果:

第1行第2列
第2行第2列
第3行第2列

如果要显示第三列,那就换成tokens=3。

同时tokens支持通配符*,以及限定范围。

如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,如果还有更多的则为:tokens=2-10之类的。

此时的命令为:

for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j

怎么多出一个%%j?

这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。

并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j

执行结果为:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

对以通配符*,就是把这一行全部或者这一行的剩余部分当作一个元素了。

比如:

for /f "tokens=* delims= " %%i in (a.txt) do echo %%i

执行结果为:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

其实就跟for /f %%i in (a.txt) do echo %%i的执行结果是一样的。

再如:

for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j

执行结果为:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

用%%i代替第二列,用%%j代替剩余的所有

最后还有skip合eol,这俩个简单,skip就是要忽略文件的前多少行,而eol用来指定当一行以什么符号开始时,就忽略它。

比如:

for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i

结果为:

第3行第1列 第3行第2列 第3行第3列

用skip来告诉for跳过前两行。

如果不加tokens=*的话,执行结果为:

第3行第1列

不知道怎么回事。

再如,当a.txt内容变成:

.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

执行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i结果是:

第3行第1列 第3行第2列 第3行第3列

用eol来告诉for忽略以“.”开头的行。

同样也必须加tokens=*,否则只会显示“第3行第1列”

在For命令语句的参数F中,最难理解的就是Delims和Tokens两个选项,本文简单的做一个比较和总结。
“For /f”常用来解析文本,读取字符串。分工上,delims负责切分字符串,而tokens负责提取字符串。如果把字符串当作蛋糕,Delims像刀子,用来切蛋糕,tokens像叉子,用来取切好的蛋糕。下面我们用实例来进行理解。

把以下内容保存为文本文件“歌曲列表.txt”,注意扩展名为“.txt”:
序号、歌手名-歌曲名.后缀名
1、饶天亮-玫瑰爱人.wma
2、高一首-我不愿错过.mp3
3、黃凱芹-傷感的戀人.MP3
4、黄灿-黄玫瑰.lrc
5、黎姿-如此这般的爱情故事.mp3

代码1:显示全部内容
@echo off
for /f %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号、歌手名-歌曲名.后缀名
1、饶天亮-玫瑰爱人.wma
2、高一首-我不愿错过.mp3
3、黃凱芹-傷感的戀人.MP3
4、黄灿-黄玫瑰.lrc
5、黎姿-如此这般的爱情故事.mp3

讲解:
如果不使用参数“/f”,运行结果只显示括号里的文字字符“歌曲列表.txt”,而不能读取文本文件“歌曲列表.txt”中的内容。可见,“/f”是解析文本字符串的好工具。

一、delims
假如只要序号,不要歌手名、歌曲名和后缀名,如何办到?
代码2:默认提取第一列
@echo off
for /f "delims=、" %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号
1
2
3
4
5

讲解:
"delims=、"表示定义顿号“、”为分隔符,并用该分隔符“、”切分文本字符串。字符串就是“歌曲列表.txt”里的内容,也就是文件里的文字和标点符号。
该顿号是原文中就有的。除了顿号“、”,原文中还有减号“-”和点号“.”,因此你也可以用它们来做分隔符。

代码3:用减号“-”做分隔符
@echo off
for /f "delims=-" %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号、歌手名
1、饶天亮
2、高一首
3、黃凱芹
4、黄灿
5、黎姿

讲解:
因为,当减号“-”被用做分隔符时,每行内容被减号“-”分隔成前后两半,默认只显示前半部分,而后半部分连同分隔符减号“-”都被忽略(省略)了。

代码4:用点号“.”做分隔符
@echo off
for /f "delims=." %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号、歌手名-歌曲名
1、饶天亮-玫瑰爱人
2、高一首-我不愿错过
3、黃凱芹-傷感的戀人
4、黄灿-黄玫瑰
5、黎姿-如此这般的爱情故事

讲解:
默认情况下,单纯使用delims而不用tokens时,只显示第一个分隔符前的内容,第一个分隔符和第一个分隔符后面的内容将被忽略。

代码5:定义多个分隔符
@echo off
for /f "delims=、-." %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号
1
2
3
4
5

讲解:
原因是,当定义顿号“、”、减号“-”和点号“.”三个标点符号为分隔符后,原文被分隔成四个部分。
如第二行“1、饶天亮-玫瑰爱人.wma”将被分隔成“1”、“饶天亮”、“玫瑰爱人”和“wma” 四个部分。
从第一行到最后一行,每行的每个部分对应下来相当于一个竖列。因此,原文就有“序号”、“歌手名”、“歌曲名”、“后缀名”四列。
一般情况下,只读取第一列的内容。后面的内容需要用tokens选项提取。

二、tokens
假如只要歌手名和歌曲名,不要序号和后缀名,如何办到?
代码6:提取单列
@echo off
for /f "tokens=2 delims=、." %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果将显示:
歌手名-歌曲名
饶天亮-玫瑰爱人
高一首-我不愿错过
黃凱芹-傷感的戀人
黄灿-黄玫瑰
黎姿-如此这般的爱情故事

讲解:
用delims定义顿号“、”和点号“.”作为分隔符,将原文分成三部分。
如第六行“5、黎姿-如此这般的爱情故事.mp3”被分割成:
第一部分(第一列):5
第二部分(第二列):黎姿-如此这般的爱情故事
第三部分(第三列):mp3
“tokens=2”表示用tokens提取第二列的字符串,即“黎姿-如此这般的爱情故事”。
没有被tokens定义提取的第一列和第三列将被忽略。

假如只要序号和歌曲名,而不要歌手名和后缀名,如何办到?
代码7:提取多列
@echo off
for /f "tokens=1,3 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j
pause>nul
运行结果将显示:
序号歌曲名
1  玫瑰爱人
2  我不愿错过
3  傷感的戀人
4  黄玫瑰
5  如此这般的爱情故事

讲解:
“delims=、-.”表示定义顿号、减号和点号为分隔符。
“tokens=1,3”表示只提取第一列和第三列。
“%%i %%j”对应于“token”后面的列数。有多少列就要有多少个输出变量,并且各变量中的字母存在先后顺序。

如何只提取文字,不要标点符号?
代码8:忽略分隔符
@echo off
for /f "tokens=1,2-4 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j %%k %%l
pause>nul
运行结果:
序号歌手名 歌曲名 后缀名
1  饶天亮玫瑰爱人 wma
2  高一首我不愿错过 mp3
3  黃凱芹傷感的戀人 MP3
4  黄灿黄玫瑰 lrc
5  黎姿如此这般的爱情故事 mp3

讲解:
默认情况下,用做分隔符的标点符号将被忽略。
“tokens=1,2-4”中的“2-4”表示第二至第四列。

三、小结

“For /f”
一句话总结:解析文本,读取字符串。

Delims的语法:
FOR /F "Delims=符号集"  %%I

IN (Command1) DO
Command2
一句话总结:忽略分隔符,切分字符串。

delims的意义包括两个方面:
第一、指定原文中的标点符号作为分隔符。使得文本被划分为许多小部分,方便使用批处理命令读取和编辑。
第二、读取第一个分隔符之前的内容。忽略第一个分隔符和分隔符后面的内容,如需读取和编辑,需要使用tokens等命令。

注意分隔符和标点符号的联系和区别。
分隔符就是原文中的标点符号,可以是一个标点符号也可以是多个。但原文中的标点符号不一定是分隔符。
分隔符需要定义,即用”delims=”来指定,等于号后面跟被用来做分隔符的标点符号,该标点符号来自原文。
当有多个标点符号被定义为分隔符时,标点符号之间没有空格。当用空格做分隔符时,空格应该放在其它用作分隔符的标点符号之后。
即使不使用delims,默认情况下,批处理也将空格作为分隔符。如文件名“Program Files”中含有空格时,批处理一般只读取空格前的“Program”,剩下的“Files”被忽略了。
例:
代码9:空格默认作为分隔符
@echo off
for /f "delims=" %%a in ("伟大的中国人民万岁 万岁 万万岁") do echo %%a
pause>nul
运行结果:
伟大的中国人民万岁 万岁 万万岁
讲解:
“delims=”代表取消默认以空格作为分隔符。
批处理默认空格是分隔符,分隔符会隐藏第一个分隔符后面的所有内容。为了显示完整的信息,所以有必要取消该功能。
因此,当文件名或路径中含有空格时,需要用双引号括住。如果不使用双引号,括号内的内容将被当做文件名,如果文件名不存在,将提示“系统找不到……”。
如果不使用“delims=”,即使使用双引号,也只能显示第一个空格前面的字符串,后面的字符串将被默认忽略。

Tokens的语法:
FOR /F "tokens=x,y,m-n"  %%I   IN (Command1) DO Command2
一句话总结:提取列。

Tokens的意义就是,提取指定的列。
注意列与句的联系与区别。
文本内容由许多文字字符串组成,它们被标点符号分隔,两个标点符号之间的语句我们称为“句子”。
当标点符号被“tokens=”指定为分隔符之后,文字将被分成多个部分。对应的每行的每个部分我们称之为“列”。
一列可能是一个句子,也可能包含多个句子,视delims定义的标点符号而定。

其它方面:关于“行”的提取,前面做过一个很简单的:
@echo off
findstr /n .* 12.txt>>122.txt
set /p m=请输入要定位的行:
findstr   /b "%m%" 122.txt

dos bat批处理的魅力 批处理读取文本中的每一行 操作文件相关推荐

  1. 如何用python读取文本中指定行的内容

    如何用python读取文本中指定行的内容 搜索资料 我来答 分享 新浪微博 QQ空间 浏览 5284 次 查看全文 http://www.taodudu.cc/news/show-64036.ht ...

  2. python导入txt为dataframe-python读取文本中数据并转化为DataFrame的实例

    在技术问答中看到一个这样的问题,感觉相对比较常见,就单开一篇文章写下来. 从纯文本格式文件 "file_in"中读取数据,格式如下: 需要输出成"file_out&quo ...

  3. python输出文本和值_python读取文本中数据并转化为DataFrame的实例

    在技术问答中看到一个这样的问题,感觉相对比较常见,就单开一篇文章写下来. 从纯文本格式文件 "file_in"中读取数据,格式如下: 需要输出成"file_out&quo ...

  4. java读取文件指定内容_Java读取文本指定的某一行内容

    Java读取文本指定的某一行内容,使用的都是IO的方法,下面具体看例子: /** * @author:罗大锤 * @date: 2017年9月6日 下午2:35:43 * @version 1.0 * ...

  5. 【C++】C++读取文本中的特定一列

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 文件读入是数据处理中经常要用到的.很多数据的保存是按列保存的,例如我们常见的表格.那么 ...

  6. vba fso读utf 文本_利用FSO对象操作文件

    大家好,我们今日讲解"VBA信息获取与处理"教程中第十八个专题"FSO对象对文件及文件夹的处理"的第二节"利用FSO对象操作文件",这个专题 ...

  7. Stream流、FiLe和IO流、IO流(字节流-拷贝文件_和_字符流-读取文本中的数据写入文本文件中)9-10-11

    package com.streamdemo; import java.util.ArrayList; import java.util.List; /*** 体验Stream流** 创建一个集合,存 ...

  8. python读取文本中的内容

    1.获取路径符 pathseq = os.path.seq 2.文本中获取内容 import os import sys from collections import OrderedDictdef ...

  9. python读取word中后缀名docx的文件的表格

    1.安装所需要的解析包 pip install python-docx pip install docx 2.使用代码例子来进行演示用法 解析出word中的如下表格: def parse_docx(f ...

最新文章

  1. golang goroutine 协程原理
  2. c语言定义数组a10 指定各元素,C语言填空题.doc
  3. Liunx之nginx代理
  4. go 写入yaml_[Golang] 从零开始写Socket Server(4):将运行参数放入配置文件(XML/YAML)...
  5. 如何制作一个塔防游戏 Cocos2d x 2 0 4
  6. 【python教程入门学习】六、python中字符串的常用方法
  7. canvas的基本应用
  8. 【flink】Flink 1.12.2 源码浅析 : yarn-per-job模式解析 从脚本到主类
  9. 数据结构-堆 C与C++的实现
  10. 【校内模拟】2048
  11. 2022数字化智慧工地助力建筑施工企业数字化转型
  12. 你们要的Echart系列,今天它来了,教你一招快速上手echarts的属性设置,手把手教程系列
  13. 企业计算机网络安全威胁及措施
  14. oracle 月增长率,oracle同比增长怎么算,同比增长率怎么算?
  15. 全球及中国中线静脉插管行业研究及十四五规划分析报告
  16. CF1320E Treeland and Viruses
  17. rpa机器人java开发,RPA机器人的“三大铁律”
  18. MIT线性代数笔记二 矩阵消元
  19. 微信公众号如何有效涨粉?学会这几种技巧让你流量倍增
  20. 帆软报表动态数据源插件2.0使用教程

热门文章

  1. 用js实现点击链接跳转APP对应页面
  2. 使用知网查重检测系统的高校有哪些?
  3. LCD屏幕的面板构造
  4. java gravity_Android属性gravity与layout_gravity的区别
  5. Flink——运行的组件有哪些?分别有什么作用?
  6. 致那些自嘲码农的苦逼程序员
  7. 我的物联网项目初建团队
  8. python中函数的定义意思
  9. 文案是否有违禁词查询
  10. NMS by Representative Region: Towards Crowded Pedestrian Detection by Proposal Pairing