需求

现在有一个文件格式如图

ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
001 89.84 8.87 1.29 -0.0 0.0 68.99 0.0 0.0 4.67 1.48 0.0 0.0 14.69 0.0 0.0 0.0 0.01
002 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.99 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.01
003 0.0 0.0 0.0 0.0 99.99 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.01

需要把它的内容读出来,从第二行开始 (跳过第一行)     每一行用第一列作新文件名,把这一行的内容写进入。

代码实现

@echo off&setlocal EnableDelayedExpansion
color 0a
echo %date% %time%
echo  now......
set a=1
for /f "skip=1 tokens=1,* delims=	" %%i in (pop.txt) do (

     set "str=%%i.txt"
     echo !str!
     echo %%i	%%j  >  !str!
        set /a a+=1
    )

set /a a-=1
echo rename finish,rename count:%a%。
pause

新建成bat放入跟pop.txt同一个文件夹中点击运行

运行结果

运行结果如图

成功写入了文件。

查看文件内容

成功实现。

代码解析

除了一些时间和计数变量之外,关键实现的代码是这一句

for /f "skip=1 tokens=1,* delims= " %%i in (pop.txt) do ()

/f 代表的是读取的是一个文本文件,这样就会去读它的内容。

skip是跳过1行,从第二行开始

tokens表示取1列给%%i,*号表示取第一列之外的其他内容,这里第一列会给变量%%i,因为i后面的字母j,所以*号的内容会自动给%%j。

delims表示分隔符,我这里是tab分割的,反正直接粘贴文本中的复制进来就行了。

set "str=%%i.txt"
     echo !str!
     echo %%i %%j  >  !str!

这一段 用第一列构造文件名   然后把内容写入文件。

更多相似例子参考

假如文件a.txt中有如下内容:
第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

输出结果
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

分割列

delims 用来告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键
比如,还是上面的文件,我们执行下面的命令:
for /f "delims= " %%i in (a.txt) do echo %%i
显示的结果是:
第1行第1列
第2行第1列
第3行第1列

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

取第几列

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列”

扩展--每个文件保留第一行

@echo  off&setlocal enabledelayedexpansion
color 0a
echo %date% %time%
echo  now......
set a=0
for /f "tokens=1,* delims=	" %%i in (pop.source) do (

     If !a!==0 (
	  echo %%i	%%j
	  set title=%%i	%%j
	  set /a a+=1
	  echo !title!
	  ) else (

      set "str=%%i.source"
      echo !str!
	  echo !title!  >  !str!
      echo %%i	%%j  >>  !str!
        set /a a+=1
		)
    )

set /a a-=1
echo rename finish,rename count:%a%。
pause

注意

@echo  off&setlocal enabledelayedexpansion 设置成延迟变量 和 判断时用 !a!很重要。

而不是用 %a%来作判断。!a!才能反应变动。

CMD批处理把txt文本中的每行写入一个新文件,第一列作文件名的更多相关文章

  1. 按行读取.txt文件,并按行写入到新文件中

    package com.test.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...

  2. 拷贝txt文本中的某行的数据到excel中

    package com.hope.day01;import java.io.*;import java.util.ArrayList;public class HelloWorld {    publ ...

  3. 使用SQLsever批量查询TXT文本中的值

    测试文档如下,需要查到case_no值为以下时,对应的单据信息分别是什么. 步骤如下: 在txt文本中 Ctrl+H,输入如下,点击“全部替换” 在word文本中,复制以上信息到word文本中,目的是 ...

  4. java:利用java的输入/输出流将一个文件的每一行+行号复制到一个新文件中去

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  5. WordPress后台的文章、分类,媒体,页面,评论,链接等所有信息中显示ID并将ID设置为第一列

    WordPress后台默认是不显示文章.分类等信息ID的,查看起来非常不方便,不知道Wp团队出于什么原因默认不显示这个但可以使用Simply Show IDs插件来实现 不使用插件,其他网友的实现: ...

  6. Shell脚本中引用、调用另一个脚本文件的2种方法

    Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm

  7. 有意思的RTL函数RegisterClass(在持久化中,你生成的一个新类的对象,系统并不知道他是如何来的,因此需要你注册)good

    例子1:Delphi中使用纯正的面向对象方法(这个例子最直接) Delphi的VCL技术使很多程序员能够非常快速的入门:程序员门只要简单的拖动再加上少量的几个Pascal语句,呵呵,一个可以运行得非常 ...

  8. Qt txt文本中获取字符串的问题

    QT对txt文本进行读写一般是采用QFile和QTextStream结合使用,在此不细说,主要说一下读取txt文本的注意事项.因为txt文本中有中文也有英文还有数字,要准确获得需要的字串可就要多一个心 ...

  9. [转]bat批处理实现TXT文本合并

    本文转自:http://quanhuaming.blog.163.com/blog/static/1405693672010210101124905/ 有朋友问是否有可以合并TXT文本文件的软件,于是 ...

随机推荐

  1. Discuz论坛搜索下拉框插件openSug

    Discuz!只需安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让您的Discuz搜索更便捷! 下载:https://www.opensug.org/faq/.../opensug.d ...

  2. python函数的返回值

    返回值:return1.没有返回值    #不写return    #只写return:结束一个函数    #return None2.有一个返回值    #可以返回任何数据类型    #只要返回就可 ...

  3. django之多表查询

    一.创建模型 在Models创建如下模型: from django.db import models # Create your models here. # 用了OneToOneField和Fore ...

  4. c#vs连接SQL sever数据库入门操作

    对于需要连接数据库的项目,可以参考的简单初级代码.实现打开数据库,读入数据功能 using System; using System.Collections.Generic; using System ...

  5. 「LibreOJ#515」贪心只能过样例 (暴力+bitset)

    可以发现,答案最大值只有106,于是想到用暴力维护 可以用bitset合并方案可以优化复杂度, Code #include <cstdio> #include <bitset> ...

  6. Spring 中的文件上传与下载控制

    先创建根应用上下文配置,WebDemo/src/main/java/com/seliote/webdemo/config/RootContextConfig.java package com.seli ...

  7. 1.使用pycharm搭建开发调试环境【转】

    感谢 feigamesnb 第一步:安装python2.7环境 去https://www.python.org/downloads/下载windows版本的python,选择2.7版本,按提示安装,并 ...

  8. javascript对象转为字符串

    function getStringTime(time){ //年 year = time.getFullYear(); //月 month = time.getMonth() if(String(m ...

  9. PowerPC为什么会没落,我自己的反思学习总结

    PowerPC为什么会没落? Intel通过酷睿,拉大优势,使得苹果抛弃PowerPC   PowerPC当年异常强大,曾经是Xbox的处理器,是Mac的处理器,占据了服务器的半壁江山:当时刚刚接触C ...

  10. SpringBoot学习:IDEA中快速搭建springboot项目

    项目下载地址:http://download.csdn.net/detail/aqsunkai/9805821 (一)IDEA中创建maven web项目 创建好项目后设置项目的编译路径: (二)引入 ...