标题: 应网友broodwu写的一个批处理
[打印本页]
作者: chenhui530
时间: 2005-3-15 00:00
标题: 应网友broodwu写的一个批处理
如何读取文件内的特定文字,并重定向到另一个文件?
操作系统是win2000,可以使用任何外部环境程序,想实现以下功能:
在一个文件里面,有以下很多的数据,也有其他无用的字符。
其中" Dipole moment (Debye):"是区别于其他字符的字符。其实最后两个字符"

:"已经足够区别其他的字符了
目的想把 " Dipole moment (Debye):" 下面的一行数据(也就是" X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 6.4598")
重定向到另一个文件,应该怎么写批处理?请不吝指教,谢谢。
如果能够把x y z三个数值提出来,重定向成 "-6.0875 1.8518 1.1246"最好,如果不行的话,一整行也可以,再次感谢。
以下是文件out的内容
Dipole moment (Debye):
X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 6.4598
批处理如下:
for /f "skip=1 tokens=1,2,3,4,5,6" %%a in (1.txt) do set a=%%a%%b && set b=%%c%%d && set c=%%e%%F
echo %a%
echo %b%
echo %c%
作者: bush
时间: 2005-3-15 00:00
好像不行!
作者: broodwu
时间: 2005-3-15 00:00
先对你表示感谢。 我试验了,好像不行,因为 Dipole moment (Debye): 这一行的前后可能有其他字符,所以需要查到这个特征字符,再把该行的下一行导入到另一个文件里面。我觉得要用到lmod这个程序才比较好做,希望各位高手能够拔刀相助。再次感谢 chenhui530 out文件部分内容应该如下Sum of Mulliken charges= 0.00000
Electronic spatial extent (au): <R**2>= 1554.1028
Charge= 0.0000 electrons
Dipole moment (Debye):
X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 6.4598 GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad
Internal Forces: Max 0.045440870 RMS 0.014163473
Step number 1 out of a maximum of 75
All quantities printed in internal units (Hartrees-Bohrs-Radians)
作者: chenhui530
时间: 2005-3-15 00:00
你条件只告诉我Dipole moment (Debye):
X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 6.4598这个的嘛
作者: chenhui530
时间: 2005-3-15 00:00
终于还是不使用第三方工具搞定了麻烦是有点麻烦了不知道哪位仁兄还有更好的方法吗for /f "delims=" %%a in (1.txt) do echo %%a>>2.txt
fc 1.txt 2.txt>3.txt
for /f "eol=* delims=" %%a in (3.txt) do echo %%a>>4.txt
for /f "skip=3 delims=GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad" %%b in (4.txt) do echo %%b>>5.txt
for /f "tokens=1,2,3,4,5,6" %%a in (5.txt) do set a=%%a%%b && set b=%%c%%d && set c=%%e%%f
echo %a%
echo %b%
echo %c%
pause
for /l %%a in (1,1,5) do del /q %%a.txt
作者: broodwu
时间: 2005-3-16 00:00
好象都是不可以啊。不过要多谢你。可能我还是没有说清楚问题。因为Dipole moment (Debye):
X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 6.4598这些字符前后都有字符,而且字符内容和字符的多少都是不确定的,x y z也有多组,我觉得最好就是用 找特征字符的方法做。我用c语言作了一个程序,达到了这个功能。a.txt 是要处理的文件,运行go.exe之后,会产生结果文件b.txt
[此贴子已经被作者于2005-3-16 9:18:30编辑过]
作者: chenhui530
时间: 2005-3-16 00:00
你怎么老是这样你要把条件说清楚啊?不说清楚别人怎么给你解决啊?
作者: broodwu
时间: 2005-3-16 00:00
打开附件
上面这个附件是源代码和程序,a.txt文件是要处理的文件。
我觉得用批处理可能会更加简洁地解决这个问题,所以还是希望有人能写出批处理程序来,谢谢。
作者: chenhui530
时间: 2005-3-16 00:00
for /f "skip=21 delims=" %%a in (a.txt) do echo %%a>>1.txt
for /f "skip=4 delims=" %%a in (1.txt) do echo %%a>>2.txt
fc 1.txt 2.txt>3.txt
for /f "eol=* delims=" %%a in (3.txt) do echo %%a>>4.txt
for /f "skip=7 delims=GradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGradGrad" %%b in (4.txt) do echo %%b>>5.txt
for /f "eol=E delims=" %%a in (5.txt) do echo %%a>>6.txt
for /f "tokens=1,2,3,4,5,6" %%a in (6.txt) do set a=%%a%%b && set b=%%c%%d && set c=%%e%%f
echo %a%
echo %b%
echo %c%
pause
for /l %%a in (1,1,6) do del /q %%a.txt
作者: broodwu
时间: 2005-3-16 00:00
还是不行啊,chenhui530的批处理我试了一下,只能把第一组数据的保留下来。当有多组数据就只能取到第一组数据,而且格式稍微变化一下就没办法了。我想应该用查找特征字符的办法来完成这个功能。比如查找到 (Debye): 这8个字符,那么下面一行自然就是需要的东西了(只截取其中的x,y,z的值)。而且有多组数据时也能够输出多组数据。比如下面这个a.txt文件,
~~~~~~~~~~~~~~~~~
sfjhjhof Mulliken charges= 0.00000
Electronic spatial extent (au): <R**2>= 1554.1028
Dipole moment (Debye):
X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 598 GradGradGraGradGradGradGradGrad
Internal Forces: Max 0.045440870 RMS 0.014163473
Step number 1 out of a maximum of 75
All units (Hartrees-Bohrs-Radians)
$FgSum of Mulliken charges= 0.00000
Electronic spatial extent (au): <R**2>= 1554.1028
Charge= 0.0000 electrons
Dipole moment (Debye):
X= -6.0877 Y= 1.8251 Z= 1.12987 Tot= 6.45433598
Sum of Mulliken charges= 0.00000
Electronic spatial extent (au): <R**2>= 1554.1028
Charge= 0.0000 electrons
Dipole moment (Debye):
X= -7.0857 Y= 5.82818 Z= 1.3046 Tot= 6.4598
GradGradGr
Internal Forces: Max 0.045440870 RMS 0.014163473
Steper 1 out of a maximum of 75
All quantities printed in internal units (Hartrees-Bohrs-Radians)
~~~~~~~~~~~~~~~~~
就应该输出下面这样一组数据,
-6.0857 1.8518 1.1246
-6.0877 1.8251 1.12987
-7.0857 5.82818 1.3046
或者下面一组数据也可以
X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 6.4598
X= -6.0877 Y= 1.8251 Z= 1.12987 Tot= 6.45433598
X= -7.0857 Y= 5.82818 Z= 1.3046 Tot= 6.4598
作者: broodwu
时间: 2005-3-16 00:00
我找到一个最简单的办法了 ,因为在要处理的a.txt文件中,需要的数据里面肯定有x= y= z=这些字符,只需要一个命令就可以找到这些字符
find /i "x=" a.txt>b.txt
find /i "y=" b.txt>c.txt
find /i "z=" c.txt>d.txt
这样d.txt就是需要的数据了
[此贴子已经被作者于2005-3-16 15:48:42编辑过]
作者: chenhui530
时间: 2005-3-16 00:00
你每次给出答案你就变一次我真的是怕了哦我给出的答案在你给我的系统都是能完成的我都测试过了的
作者: chenhui530
时间: 2005-3-16 00:00
我真是怕了你了我每次给出答案你就更改数据!我是真怕了你!但是我每次给出的答案都是对的!我都经过测试的!
作者: chenhui530
时间: 2005-3-16 00:00
Quote: |
以下是引用broodwu在2005-3-16 15:26:43的发言:
还是不行啊,chenhui530的批处理我试了一下,只能把第一组数据的保留下来。当有多组数据就只能取到第一组数据,而且格式稍微变化一下就没办法了。我想应该用查找特征字符的办法来完成这个功能。比如查找到 (Debye): 这8个字符,那么下面一行自然就是需要的东西了(只截取其中的x,y,z的值)。而且有多组数据时也能够输出多组数据。比如下面这个a.txt文件,
~~~~~~~~~~~~~~~~~
sfjhjhof Mulliken charges= 0.00000
Electronic spatial extent (au): <R**2>= 1554.1028
Dipole moment (Debye):
X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 598 GradGradGraGradGradGradGradGrad
Internal Forces: Max 0.045440870 RMS 0.014163473
Step number 1 out of a maximum of 75
All units (Hartrees-Bohrs-Radians)
$FgSum of Mulliken charges= 0.00000
Electronic spatial extent (au): <R**2>= 1554.1028
Charge= 0.0000 electrons
Dipole moment (Debye):
X= -6.0877 Y= 1.8251 Z= 1.12987 Tot= 6.45433598
Sum of Mulliken charges= 0.00000
Electronic spatial extent (au): <R**2>= 1554.1028
Charge= 0.0000 electrons
Dipole moment (Debye):
X= -7.0857 Y= 5.82818 Z= 1.3046 Tot= 6.4598
GradGradGr
Internal Forces: Max 0.045440870 RMS 0.014163473
Steper 1 out of a maximum of 75
All quantities printed in internal units (Hartrees-Bohrs-Radians)
~~~~~~~~~~~~~~~~~
就应该输出下面这样一组数据,
-6.0857 1.8518 1.1246
-6.0877 1.8251 1.12987
-7.0857 5.82818 1.3046
或者下面一组数据也可以
X= -6.0857 Y= 1.8518 Z= 1.1246 Tot= 6.4598
X= -6.0877 Y= 1.8251 Z= 1.12987 Tot= 6.45433598
X= -7.0857 Y= 5.82818 Z= 1.3046 Tot= 6.4598 |
|
其实要得到这样的数据也不是很难!只是我现在不想再写了!等下你又变了我是等于白写
作者: broodwu
时间: 2005-3-16 00:00
@find /i "x=" a.txt>a
@find /i "x=" a>b
@find /i "x=" b>c
@for /f "skip=2 tokens=2,4,6 delims= " %%i in (c) do @echo %%i %%j %%k>>b.txt
@del a&@del b&@del c
这样就可以达到要求了
作者: Climbing
时间: 2005-3-16 00:00
@echo off
set src=%1
if %src%#==# set src=a.txt
if not exist %src% goto _err
type %src% | find /i "x=" > tmp.txt
for /f "tokens=2,4,6 delims= " %%i in (tmp.txt) do echo %%i %%j %%k >>b.txt
if exist tmp.txt del /f /q tmp.txt
if exist b.txt type b.txt
goto _quit
:_err
echo Error: I cannot find %src%.
echo Usage: %0 [FileToOperate]
pause:_quit
set src=