Board logo

标题: 如何用脚本读取下面格式的文本文件?[已结,多谢各位。] [打印本页]

作者: gyfhgyfh     时间: 2007-1-3 11:51    标题: 如何用脚本读取下面格式的文本文件?[已结,多谢各位。]

如何用脚本读取下面格式的文本文件,

并取出

FileName=
Path=

后面的字符串输出到 my.txt

-----------------------------------------------------------------------------------------

[XXXXXXXX...]
FileName=***...
Path=.../

[XXXXXXXX...]
FileName=***...
Path=***.../.../

[XXXXXXXX...]
FileName=***...
Path=***.../.../...

-------------------------------------------------------------------------------------------

[ Last edited by gyfhgyfh on 2007-1-10 at 07:29 AM ]
作者: jmz573515     时间: 2007-1-3 21:02
用VBS写的,把你要提取的文件命名为a.txt之后把下面的内容另存为ss.vbs,双击运行,注意要和a.txt文件在同一个目录下。
set fso=createobject("scripting.filesystemobject")
set file=fso.opentextfile("a.txt",1)
do while file.AtEndOfStream <> True
n=file.readline
if left(n,9)="FileName=" then m=m&right(n,len(n)-9)&vbcrlf
if left(n,5)="Path=" then m=m&right(n,len(n)-5)&vbcrlf
loop
file.close
set file=fso.createtextfile("my.txt",true)
file.write m
file.close
msgbox "提取内容成功!请查看my.txt文件。",48+4096,"操作完成"

作者: ccwan     时间: 2007-1-3 21:22

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

作者: gyfhgyfh     时间: 2007-1-3 22:23
非常好,感谢两位。

来个更复杂的,即字符出现的位置不是固定的:


如何用脚本读取下面格式的文本文件,

并取出

FileName=
Path=

后面的字符串输出到 my.txt

-----------------------------------------------------------------------------------------

[XXXXXXXX...]
XXXXX...=***...
XXXX...=.../
XXX...=...
...



[XXXXXXXX...]
XXX...=...
FileName=***...
XXX...=...
Path=.../
...


[XXXXXXXX...]
...
FileName=***...
...


[XXXXXXXX...]
FileName=***...
...
Path=***.../.../...
...

-------------------------------------------------------------------------------------------

[ Last edited by gyfhgyfh on 2007-1-3 at 10:49 PM ]
作者: jmz573515     时间: 2007-1-3 22:54
用上面的代码一样可以完成。
作者: ccwan     时间: 2007-1-3 23:00
代码如下
for /f "tokens=1,2 delims==" %%i in (test.txt) do (
if "%%i"=="FileName" (>>my.txt echo. %%j)
if "%%i"=="Path" (>>my.txt echo. %%j)
)

作者: ccwan     时间: 2007-1-3 23:04
其实去掉echo后的.就够用了。^_^
作者: gyfhgyfh     时间: 2007-1-3 23:10
非常好,非常好。

现在让我们一起来继续深入,把提取到的内容按以下格式进行连接并输出:

(Path) + (FileName)
作者: ccwan     时间: 2007-1-3 23:13
说清楚些
作者: gyfhgyfh     时间: 2007-1-3 23:17
输出

[XXXXXXXX...]
XXX...=...
FileName=abc
XXX...=...
Path=c:\
...



里面的 (Path=.../ ) +  (FileName=***...)

即:c:\abc

[ Last edited by gyfhgyfh on 2007-1-3 at 11:18 PM ]
作者: ccwan     时间: 2007-1-3 23:28
只有一段吗?
[XXXXXXXX...]
XXX...=...
FileName=***...
XXX...=...
Path=.../
...
作者: gyfhgyfh     时间: 2007-1-3 23:31
-----------------------------------------------------------------------------------------

[XXXXXXXX...]
XXXXX...=***...
XXXX...=.../
XXX...=...
...



[XXXXXXXX...]
XXX...=...
FileName=***...
XXX...=...
Path=.../
...


[XXXXXXXX...]
...
FileName=***...
...


[XXXXXXXX...]
FileName=***...
...
Path=***.../.../...
...

-------------------------------------------------------------------------------------------
字符位置不固定。
作者: ccwan     时间: 2007-1-3 23:37
FileName和Path数量不等要如何对应?请讲清楚。
作者: gyfhgyfh     时间: 2007-1-3 23:45
先简单点吧,提取后的 my.txt 里面的内容格式已经是:

----------------------------------------------------------------
FileName=...
Path=...
FileName=...
Path=...
FileName=...
Path=...
...
----------------------------------------------------------------




如何将 my.txt 输出 Path=...FileName=...  即

----------------------------------------------------------------
c:\abc
...
----------------------------------------------------------------
作者: namejm     时间: 2007-1-3 23:52
  呵呵,这个简单,每两行合并为一行就是了。
作者: namejm     时间: 2007-1-4 00:07
  为了让你看到效果,做个演示代码:
@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

作者: jmz573515     时间: 2007-1-4 00:22
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,"操作完成"
作者: gyfhgyfh     时间: 2007-1-4 00:40
多谢各位,终于明白了。


祝大家新年快乐!!!

作者: ccwan     时间: 2007-1-4 04:36
test.txt内容如下:
[XXXXXXXX...]
XXXXX...=***...
XXXX...=.../
XXX...=...
...



[XXXXXXXX...]
XXX...=...
FileName=123
XXX...=...
Path=c:\
...


[XXXXXXXX...]
...
FileName=456
...
Path=d:\

[XXXXXXXX...]
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="

作者: ccwan     时间: 2007-1-4 04:39
运行结果
my.txt内容如下:
c:\123
d:\456
e:\789

作者: gyfhgyfh     时间: 2007-1-4 05:16
多谢 ccwan ,这次给出的脚本已经非常完善了。

脚本的功能真是强大!

再次感谢各位。
作者: gyfhgyfh     时间: 2007-1-5 02:21
这个该如何解决???

提取 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 ]
作者: jmz573515     时间: 2007-1-5 03:00

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,"操作完成"

作者: jmz573515     时间: 2007-1-5 03:06
没有明白你说的“然后通过比较不同的 list.txt 提取出最新的文件列表”是什么意思?
作者: namejm     时间: 2007-1-5 03:18
  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 ]
作者: gyfhgyfh     时间: 2007-1-5 03:33
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
作者: namejm     时间: 2007-1-5 03:54
  用 FC 来比较文本,会输出很多无用的干扰信息,要想提取到有用的信息将十分烦琐,不推荐用它来做比较。

  还是那个问题:不同的list.txt中,每条记录都是一一对应的、只是时间有所不同吗?如果是这样的话,那就十分好办了。
作者: gyfhgyfh     时间: 2007-1-5 05:16


  Quote:
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 ]
作者: namejm     时间: 2007-1-5 05:49
  给你一段演示代码,用于显示两个文件的对应行不同的行内容,效率比较低下:
@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
)

作者: gyfhgyfh     时间: 2007-1-5 06:07
非常感谢 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 ]
作者: gyfhgyfh     时间: 2007-1-5 09:22
如何把最终输出的 list.txt 每行后面的空格和日期删除掉???

----------------------------------------------------------
c:\my\ab.exe 2007.10.26
d:\cde.com 2007.1.1
c:\f.bat 2007.1.3
----------------------------------------------------------
  ↓
----------------------------------------------------------
c:\my\ab.exe
d:\cde.com
c:\f.bat
----------------------------------------------------------
作者: gyfhgyfh     时间: 2007-1-5 09:43
不好意思,刚刚发现可以评分.各位辛苦了.解禁后再加.
作者: namejm     时间: 2007-1-5 09:52
  如果路径中不含 & 这个符号的话,就会很好处理,但是,如果含有它的话,则会比较困难。以下演示代码借用了我头两天发的一段代码(点 这里 查看),能兼容路径中含有的、除了百分号之外的其他特殊符号:
@echo off
for /f "delims=" %%i in (list.txt) do call :pickup "%%i"
pause
goto :eof

:pickup
set "route=%~1"
call :antitone "%route%"
call :intercept "%str%"
call :antitone "%route%"
echo "%str%"
goto :eof

:antitone
set str=
set "var=%~1"
:loop1
if not "%var:~0,1%"=="" set "str=%str%%var:~-1%"
set "var=%var:~0,-1%"
if not "%var%"=="" goto loop1
goto :eof

:intercept
for /f "tokens=1*" %%i in (%1) do set "route=%%j"
goto :eof

作者: zhaoxf     时间: 2007-1-5 10:32
看了大家的回复,很是佩服.;)

[ Last edited by zhaoxf on 2007-1-5 at 11:19 AM ]