用批处理批量读取文本文件的内容



用批处理批量读取文本文件的内容
用批处理批量读取文本文件的内容


文章转自: 忆林子


今天中午感觉有点累,所以就睡了一会,睡醒时已经是4点半了,然后就开起了电脑。刚上QQ没多久,就一个人加我了,他遇到问题了。以下是他的文件
他有好几10个文本,每个文本里的内容结构如下
安徽百货购物店名录

合延综合门市部
地址:安徽省东至县香隅镇合延村
电话:0566*******
邮编:247100

合镇综合门市部
地址:安徽省东至县香隅镇香隅村
电话:0566*******
邮编:247100

大楼百货门市部
地址:安徽省东至县昭潭镇
电话:0566*******
邮编:247100
其中第一行为子分类吧,之后就是4行一组数据。他现在想把所有文本的第一行换成那个文本的文件名
但是文件又很多,所以不想一个一个去打开。
他刚发我的时候是用截图的形式,我刚开始看到的时候以为这个冒号是半角的,并且它这里又有空行。如果这两个不是共存的话,那处理起来会方便点,但是偏偏他给我的是共存的情况。
在批处理中这两个是很特殊的如果用for结合findstr的话,可以取得空行,但是却会丢失冒号
用for结合more命令可以取得所有内容,但是就是偏偏会丢失空行
后面他它文本发我之后,我仔细一看,他的冒号是全角的,我想那我就可以用findstr来处理了,但是经过我确认之后他又说是全半角混合。所以我只 能用more命令来处理了,但是那样的话,空格就得我手动在批处理循环的过程添加。这样的话,我想过取模操作,但是在批处理中我还没用过,至少之前还没去 研究过怎么取模,所以这个计划也不行了。仔细一看,他发我的文件的空行并不是真正的空行,而是有空格填充的,所以这样就可以正常用more来处理了。
好了,关键点解决之后就是写代码了。
1、把所有要处理的文本的文件名列出来发送到一个临时文件时(lst.lst)
2、用for命令来读取那个lst.lst的列表文件
用ren命令把文本重命名为 文件名.bak
echo 命令把文件名发送到 文件名(即文本的第一行标题)
在循环中再用for来读取列表中的单个文件名所指向的文本名.bak,使用skip来跳过第一行
在for的结果中判断是不是为空行 是:输出四个空格 不是:输出原来的内容
全部读取完之后,用del 把文件名.bak删除
3、最后用del命令把lst.lst这个临时列表文件删除
虽然效果是达到了,但是我觉得这个批处理还是有问题,比较它并没有处理冒号跟空行
并且就为了把第一行修改而要把整个文件的内容读取

出来,这样效率上是个问题。
用VBS脚本来处理的话,效率上会比批处理高一点,但是这样的操作觉得还是不合常规。
但是在工作中为了实现效果,也管不了那么多了。曾经想过用vbs来写一个读取文件的,但是用vbs修改起来不像批处理这么灵活,所以也就放弃了。就 先用这个批处理将就着吧,希望他的文件没有特殊情况,要不然我这个批处理也无法解决他的问题。不过目前我跟他确认之后他说效果是满意的。
下面把最主要的批处理放上来吧。
@ECHO OFF
COLOR 0a
CALL :delTempFiles
dir *.txt /a /b>>lst.lst
FOR /F "tokens=*" %%a IN (
'more lst.lst'
) DO (
ren "%%a" "%%a.bak"
echo 正在处理 %%a
echo %%~na>>"%%a"
FOR /F "tokens=* skip=1" %%A IN (
'more "%%a.bak"'
) DO (
if /i "%%A"=="" (
echo. >>"%%a"
) else (
echo %%A>>"%%a"
)
)
del "%%a.bak" /q 1>nul 2>nul
)
CALL :delTempFiles
PAUSE
EXIT
:delTempFiles
del "lst.lst" /q 1>nul 2>nul
GOTO :EOF


吃完饭回来之后,突然想到了变相取模的方法,也不算取模了,反正就是实现了那个效果,^_^,这样就不用考虑它的空行了,因为它这里的数据是有规律 的嘛,都是4行一组数据,所以可以用这个方法了。以下的方法中使用了SETLOCAL命令来启用变量延迟。要不然也无法实现效果,另外要注意的就是用了这 个命令之后在循环体等语句块中要取变量的值的话,不能再用 %了,要用 !了,以下把代码粘贴上来,大家可以用文本比较软件来看看有哪些是不一样的。
@ECHO OFF
COLOR 0a
CALL :delTempFiles
dir *.txt /a /b>>lst.lst
FOR /F "tokens=*" %%a IN (
'more lst.lst'
) DO (
ren "%%a" "%%a.bak"
echo 正在处理 %%a
echo %%~na>>"%%a"
echo. >>"%%a"
SETLOCAL ENABLEDELAYEDEXPANSION
set counter=-1
FOR /F "tokens=* skip=2" %%A IN (
'more "%%a.bak"'
) DO (
set /a counter=!counter!+1
if /i "!counter!"=="4" (
echo. >>"%%a"
set counter=-1
) else (
echo %%A>>"%%a"
)
)
ENDLOCAL
del "%%a.bak" /q 1>nul 2>nul
)
CALL :delTempFiles
PAUSE
EXIT :delTempFiles
del "lst.lst" /q 1>nul 2>nul
GOTO :EOF


Powered by 无名小鬼 https://www.360docs.net/doc/2f5462765.html,

相关主题
相关文档
最新文档