Fortran进行批处理的方法剖析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Fortran中批量处理文件的方法总结

—循环读取目录下的所有符合条件的文件=====================

一、简单的介绍

在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。

对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦!

这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。

我总结的批处理方法大概可以用下面这个示意图来说明:

|

|

|将文件目录写入一个文本文件,供fortran循环读取

|————手动输入文件名

|————运行程序之前命令行工具导出文件名

|————程序运行后,未开始计算之前,生成文件名

| ————调用CMD命令生成

| ————GETFILEINFOQQ方法生成

| ————调用WIN32API生成

|

|在程序运行时动态生成文件名

|

|

对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。第二种方法主要是说明其思路。

二、方法的介绍

1、将文件目录写入一个文本文件,供fortran循环读取

1.1、手动输入文件名

这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。

1.2、运行程序之前命令行工具导出文件名

这是一个既高效又保险的方法,主要思路就是通过强大的CMD命令列出目录下的文件到一个指定的文件中,然后由fortran去循环读取该文件中的文件名信息,从而批量处理。

a、从运行工具打开你的CMD窗口;

b、转到要处理的当前目录(可省略):CD /d 路径,如:

CD /d e:\test

这样可以快速到达e:\test目录

c、使用DIR命令列出文件目录信息到指定的文件,通常使用的

Dir *.*>新文件名这个命令在这里已经不能满足要求,因为会列出一堆对于我们处理而言无用的信息,现在要使用的命令是:

DIR /b filter>newfile

注意,其中的filter为文件筛选,必须自己修改为所需的,比如你可以把它改成*.txt,这样,就会列出当前目录下的所有txt结尾的文件了。

Newfile就是你需要存放文件名的那个文件,比如可以是dir.txt,这样就成了 dir

/b*.txt>dir.txt,就会把当前目录下的所有文件都列出到dir.txt文件中,当然,由于dir.txt 也在当前目录,所以也会被算进去,这在处理的时候是需要注意的,下面几种方法中同样考虑了这个问题。你可以选择手动删掉,或者把dir.txt这个文件存到其他地方去,或者,不要和你需要的文件具有相同的后缀也行,比如:dir /b *.txt>e:\dir.txt (假设当前目录是e:\test)

如果省略了第二步中的转到当前目录的话,就需要在dir命令后输入完整的路径了,而且新生成的文件也要选择有权限建立新文件的地方存放,比如你在c:\users目录下输入:dir /b e:\test\*.txt>e:\dir.txt,这个命令和上面先转到e:\test目录下的效果是一样的。

现在你是不是比较好奇,/b 是干嘛的,其实就是只列出文件名,不要其他的附件信息,比如创建时间,文件大小等等这些对于我们批处理无关的信息。

如果你想包含某个目录下的子目录,那么,就可以这样写:

Dir /b/s filter>newfile

/s就表示包含子目录,但是,这样会有一个问题,那就是,批处理的时候必须获得正确的路径才能操作,这样得到的子目录里面的文件不会有任何标志说他是来自子目录的,因此fortran处理的时候就无法判断了,所以,如果包含了子目录,那么请用下面的命令:

Dir /a-d/b/s filter>newfile

现在去看看新生成的文件吧,怎么样,很惊喜吧!

懂了这个方法,下面一部分的第一个方法对你来说就是小菜一碟啦。

如果你使用的win7(或vista)系统,而且无法正常使用CVF编译器的话,那么第一部分到这里就算结束啦,除非,你会在其他fortran编译器中调用WIN32API。

1.3、程序运行后,未开始计算之前生成文件名

1.3.1、在程序中调用CMD命令

这个方法其实就是上一个方法的进化版,只不过变成了在程序运行的时候调用命令自动生成,这样整个过程显得少一点,只需要在程序里设置好相关的参数即可。

这个方法的关键在于SYSTEMQQ函数的使用,这是CVF编译器封装的调用CMD命令的一个函数,存在于DFLIB库中,其语法命令为:

result = SYSTEMQQ(commandline)

commandline:表示需要进行的CMD操作,字符串形式,函数中的实际长度由传入的参数决定,input类型(表示输入为参数);

Results:一个逻辑型变量(logical(4)),如果成功为true,失败为false(不解的是程序中要实现的东西都是正常的,比如仅仅传入dir命令,返回的结果仍然为F,请高手赐教)

给出一个简单的例子:

USE DFLIB

LOGICAL(4)result

result = SYSTEMQQ('copy e:\dir.txt e:\test\dir.txt')

这个命令将第一个路径中的文件复制到为第二个路径中的文件。通过这个例子再结合上面一个方法,就可以很方法便的构造出我们需要用来批处理的子函数,关键语句如下所示:

subroutine ListToFile(fPath,outPut)

character*(*),InTent(In):: fPath,outPut

character*100CMD

LOGICAL(4) res

CMD="dir/a-d/b/s "//trim(fPath)//" >"//trim(outPut)

res=SYSTEMQQ(CMD)

endsubroutine

其中传入的是文件筛选值和输出的路径,这个方法也是我在第一部分中最为推荐的一个方法了,代码简洁高效,能够输出完整的路径,可以包含子文件夹,唯一的缺点就是输出的文件个数不能直接在程序中调用(方便循环),需要在批处理的时候使用其他方法来判断文件是否读取结束。

1.3.2、使用GETFILEINFOQQ方法生成文件目录

相关文档
最新文档