中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-22 19:51
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何用脚本读取下面格式的文本文件?[已结,多谢各位。] 查看 4,928 回复 33
16 发表于 2007-01-04 00:07 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  为了让你看到效果,做个演示代码:

@echo off
for /f "tokens=2 delims==" %%i in (my.txt) do call :link "%%i"
pause
goto :eof

:link
set str=%1
set "str=%str:~1,-1%"
set /a num+=1
set "str=%str%%var%"
set "var=%str%"
if %num% equ 2 (
echo "%str%"
set num=0
set str=
set var=
)
goto :eof
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
gyfhgyfh +1 2008-01-07 13:38
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
17 发表于 2007-01-04 00:22 ·  中国 辽宁 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
19年会员
UID 73417
性别 男
状态 离线
set fso=createobject("scripting.filesystemobject")
set file=fso.opentextfile("a.txt",1)
do while file.AtEndOfStream <> True
m="%%%%%%%%%%%%%%%%%"
n=file.readline
if left(n,9)="FileName=" then a=right(n,len(n)-9)&vbcrlf
if left(n,5)="Path=" then m=right(n,len(n)-5)&a
if m<>"%%%%%%%%%%%%%%%%%" then mm=mm&m
m="%%%%%%%%%%%%%%%%%"
loop
file.close
set file=fso.createtextfile("my.txt",true)
file.write mm
file.close
msgbox "提取内容成功!请查看my.txt文件。",48+4096,"操作完成"
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
gyfhgyfh +2 2007-01-06 22:47
18 发表于 2007-01-04 00:40 ·  中国 广西 南宁 联通
初级用户
积分 54
发帖 25
注册 2006-09-29 02:15
19年会员
UID 63991
状态 离线
多谢各位,终于明白了。


祝大家新年快乐!!!
19 发表于 2007-01-04 04:36 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
test.txt内容如下:

XXXXX...=***...
XXXX...=.../
XXX...=...
...




XXX...=...
FileName=123
XXX...=...
Path=c:\
...



...
FileName=456
...
Path=d:\


FileName=789
...
Path=e:\
...



my.bat代码如下:

@echo off
for /f "tokens=1,2 delims==" %%i in (test.txt) do (
if "%%i"=="FileName" (>>a.txt echo %%j)
if "%%i"=="Path" (>>a.txt echo %%j)
)

setlocal enabledelayedexpansion
for /f "delims=: tokens=1*" %%i in ('findstr /n .* a.txt') do set num=%%i && set "%%i=%%j"
set str=
for /l %%i in (1,1,%num%) do (
if defined str (>>my.txt echo,!%%i!!str!&& set "str="
) else (
set "str=!%%i!"
)
)
>>my.txt echo,!str!&& set "str="
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
gyfhgyfh +2 2008-01-07 13:38
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
20 发表于 2007-01-04 04:39 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
运行结果
my.txt内容如下:
c:\123
d:\456
e:\789
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
21 发表于 2007-01-04 05:16 ·  中国 广西 南宁 联通
初级用户
积分 54
发帖 25
注册 2006-09-29 02:15
19年会员
UID 63991
状态 离线
多谢 ccwan ,这次给出的脚本已经非常完善了。

脚本的功能真是强大!

再次感谢各位。
22 发表于 2007-01-05 02:21 ·  中国 广西 南宁 联通
初级用户
积分 54
发帖 25
注册 2006-09-29 02:15
19年会员
UID 63991
状态 离线
这个该如何解决???

提取 text.txt
----------------------------------------------
ab.exe
2006.10.26
c:\my\
cde.com
2007.1.1
d:\
f.bat
2007.1.3
c:\
...
-----------------------------------------------



输出为 list.txt
----------------------------------------------
c:\my\ab.exe 2006.10.26
d:\cde.com 2007.1.1
c:\f.bat 2007.1.3
...
-----------------------------------------------




然后通过比较不同的 list.txt 提取出最新的文件列表
--------------------------------------------------------
c:\my\ab.exe 2006.10.26
d:\cde.com 2007.1.1
c:\f.bat 2007.1.3
...
--------------------------------------------------------

--------------------------------------------------------
c:\my\ab.exe 2007.10.26
d:\cde.com 2007.1.1
c:\f.bat 2007.1.3
...
--------------------------------------------------------



--------------------------------------------------------
c:\my\ab.exe 2007.10.26
...
--------------------------------------------------------

[ Last edited by gyfhgyfh on 2007-1-5 at 02:38 AM ]
23 发表于 2007-01-05 03:00 ·  中国 辽宁 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
19年会员
UID 73417
性别 男
状态 离线

set fso=createobject("scripting.filesystemobject")
set file=fso.opentextfile("a.txt",1)
m=1
do while file.AtEndOfStream <> True
n=file.readline
if m=1 then
a=n
m=m+1
elseif m=2 then
a=a&" "&n
m=m+1
elseif m=3 then
a=n&a
m=1
s=s&a&vbcrlf
a=""
end if
loop
file.close
set file=fso.createtextfile("my.txt",true)
file.write s
file.close
msgbox "提取内容成功!请查看my.txt文件。",48+4096,"操作完成"
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
gyfhgyfh +2 2007-01-10 07:27
24 发表于 2007-01-05 03:06 ·  中国 辽宁 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
19年会员
UID 73417
性别 男
状态 离线
没有明白你说的“然后通过比较不同的 list.txt 提取出最新的文件列表”是什么意思?
25 发表于 2007-01-05 03:18 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  jmz573515 兄的代码不错。

  若要用批处理来提取test.txt的内容,在16楼的演示代码上稍作修改即可。因为考虑到路径中有可能含有特殊字符,比如空格、&、!等符号,所以生成 list.txt 的时候,把路径用引号括起来了:

@echo off
cd.>list.txt
set num=0
for /f "delims=" %%i in (test.txt) do call :link "%%i"
start list.txt
goto :eof

:link
set str=%1
set "str=%str:~1,-1%"
set /a num+=1
if %num% equ 2 (
set "time_=%str%"
) else (
call set "str=%%str%%%var%"
set "var=%str%"
)
if %num% equ 3 (
echo "%str% %time_%">>list.txt
set num=0
set str=
set time_=
)
goto :eof

  至于比较两个文件的内容,则比较复杂,暂时还没想到怎样才能提取到最新的记录——如果两个list.txt中的记录是一一对应的、只是时间有所不同,则比较好办一点。

[ Last edited by namejm on 2007-1-4 at 02:19 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
gyfhgyfh +2 2007-01-06 22:48
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
26 发表于 2007-01-05 03:33 ·  中国 广西 南宁 联通
初级用户
积分 54
发帖 25
注册 2006-09-29 02:15
19年会员
UID 63991
状态 离线
A.txt
---------------------------------
c:\my\ab.exe 2006.10.26
d:\cde.com 2007.1.1
c:\f.bat 2007.1.3
---------------------------------



B.txt
---------------------------------
c:\my\ab.exe 2007.10.26
d:\cde.com 2007.1.1
c:\f.bat 2007.1.3
---------------------------------


fc A.txt B.txt > my.txt
---------------------------------
正在比较文件 A.txt 和 B.TXT
***** A.txt
c:\my\ab.exe 2006.10.26
d:\cde.com 2007.1.1
***** B.TXT
c:\my\ab.exe 2007.10.26
d:\cde.com 2007.1.1
*****
---------------------------------

如何只提取时间最近的
c:\my\ab.exe 2007.10.26
27 发表于 2007-01-05 03:54 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  用 FC 来比较文本,会输出很多无用的干扰信息,要想提取到有用的信息将十分烦琐,不推荐用它来做比较。

  还是那个问题:不同的list.txt中,每条记录都是一一对应的、只是时间有所不同吗?如果是这样的话,那就十分好办了。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
28 发表于 2007-01-05 05:16 ·  中国 广西 南宁 联通
初级用户
积分 54
发帖 25
注册 2006-09-29 02:15
19年会员
UID 63991
状态 离线
Originally posted by namejm at 2007-1-5 03:54:
  用 FC 来比较文本,会输出很多无用的干扰信息,要想提取到有用的信息将十分烦琐,不推荐用它来做比较。

  不同的list.txt中,每条记录都是一一对应的、只是时间有所不同吗?如果是这样的话,那就十分好办了。



正如您所说,

不同的list.txt中,每条记录都是一一对应的.只是时间有所不同。

该如何解决???


listA.txt
---------------------------------
c:\my\ab.exe 2006.10.26
d:\cde.com 2007.1.1
c:\f.bat 2007.1.3
---------------------------------



listB.txt
---------------------------------
c:\my\ab.exe 2007.10.26
d:\cde.com 2007.1.1
c:\f.bat 2007.1.3
---------------------------------





  

[ Last edited by gyfhgyfh on 2007-1-5 at 05:28 AM ]
29 发表于 2007-01-05 05:49 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  给你一段演示代码,用于显示两个文件的对应行不同的行内容,效率比较低下:

@echo off
set num=0
for /f "delims=" %%i in ('findstr .* listA.txt') do call :comp_ "%%i"
pause
goto :eof

:comp_
for /f "delims=" %%i in ('more +%num% listB.txt') do (
if not "%%i"==%1 echo %1 与 "%%i" 不同
set /a num+=1
goto :eof
)
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
gyfhgyfh +1 2008-01-07 13:39
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
30 发表于 2007-01-05 06:07 ·  中国 广西 南宁 联通
初级用户
积分 54
发帖 25
注册 2006-09-29 02:15
19年会员
UID 63991
状态 离线
非常感谢 namejm jmz573515 ccwan 的帮助。谢谢。



@echo off
set num=0
for /f "delims=" %%i in ('findstr .* old.txt ') do call :comp_ "%%i"
goto :eof

:comp_
for /f "delims=" %%i in ('more +%num% new.txt ') do (
if not "%%i"==%1 echo %%i> list.txt
set /a num+=1
goto :eof
)



[ Last edited by gyfhgyfh on 2007-1-5 at 06:11 AM ]
论坛跳转: