爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8233|回复: 16

[求助] 【已解决,感谢言深深!!!】求批量提取txt文件中数据并按格式保存到新的txt中

[复制链接]

新浪微博达人勋

发表于 2012-11-16 12:40:07 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 倔强的葱头 于 2012-11-16 19:11 编辑

本人菜鸟,最近整理数据数据是由于数据量太大,想用程序实现,论坛各位高手劝我还是从头学起,但这个事比较急,我这是临时抱佛脚,请大家帮帮忙了。
下面我举个简单的例子说明下:
    1、我现有197101.txt,197102.txt,......197212.txt,2年每年12个月共24个文件(实际上是40年,480个文件);
    2、每个文件的格式如下(4行3列,每个txt的前两列相同,只有第三列不同):
     197101.txt:  lon1  lat1  a1   197102.txt:  lon1  lat1  a2     ........   197212.txt:  lon1  lat1  a24
                          lon2  lat2  b1                       lon2  lat2  b2     .......                         lon2  lat2  b24
                          lon3  lat3  c1                       lon3  lat3  c2      .......                        lon3  lat3  c24
                          lon4  lat4  d1                       lon4  lat4  d2      ........                       lon4  lat4  d24

    3、想得到的result.txt:1971  lon1  lat1   a1  a2 ....a12
                                         1971  lon2  lat2   b1  b2....b12
                                         1971  lon3  lat3   c1  c2....c12  
                                         1971  lon4  lat4   d1  d2....d12
                                         1972  lon1  lat1   a13  a14....a24
                                         1972  lon2  lat2   b13  b14....b24
                                         1972  lon3  lat3   c13  c14....c24
                                         1972  lon4  lat4   d13  d14....d24


4、我接触fortran时间不长,现在只会提取单个文件的第一列,至于如何提取多个文件的不同列实在是能力之外,还请大家帮助一下,多谢!(如果表达的不清楚,我附上例子,请指教)



test.rar

2.27 KB, 下载次数: 18, 下载积分: 金钱 -5

例子文件及结果

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-11-16 12:43:27 | 显示全部楼层
program main

        implicit none

        integer :: i,j,k,NumFile
        integer :: MaxNumFile=100,MaxNumRow=10000
        character(len=50)  :: FileName(100)  
        character(len=80)  :: FilePath                        
        character(len=4)   :: FlagChar
        real :: a(100000)

        open(1,file="filelist.txt")
        NumFile=0
        do i=1,MaxNumFile
                read(1,'(A)',end=10) FileName(i)
                FileName(i)=trim(FileName(i))
                NumFile=NumFile+1
        end do
10        close(1)

        open(10,file="result.txt")

        do i=1,NumFile
                FilePath=FileName(i)
                open(2,file=FilePath)
                do j=1,MaxNumRow
                        read(2,*,end=20) a(j)
                        write(10,*) a(j)
                end do
20                close(2)
        end do

        close(10)

end program main

这是我费劲脑汁弄得,但是只能取第一列,达不到我要求啊。。。。求指点啊!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-11-16 13:11:21 | 显示全部楼层

回帖奖励 +1 金钱

本帖最后由 言深深 于 2012-11-16 13:12 编辑

刚刚把面泡上就看到你的题目,银子蛮多,想着挣上 吧。
一般都是让自己编的,程序不难的
不说了,给钱吧
下面的是结果:

    1971       1       5       9      13      13      13      13      13      13      13      13      13      13      13
    1971       2       6      10      14      14      14      14      14      14      14      14      14      14      14
    1971       3       7      11      15      15      15      15      15      15      15      15      15      15      15
    1971       4       8      12      16      16      16      16      16      16      16      16      16      16      16
    1972       1       5       9      13      13      13      13      13      13      13      13      13      13      13
    1972       2       6      10      14      14      14      14      14      14      14      14      14      14      14
    1972       3       7      11      15      15      15      15      15      15      15      15      15      15      15
    1972       4       8      12      16      16      16      16      16      16      16      16      16      16      16

程序代码:
parameter(m=4,n=3)
character*8 year,mon
real x(1971:1972,12,m,n)

do i=1971,1972
write(year,"(i4)") i
do j=1,12
if(j.le.9)then
        write(mon,"(i1)") j
        open(1,file=trim(year)//"0"//trim(mon)//".txt")
else
        write(mon,"(i2)") j
        open(1,file=trim(year)//trim(mon)//".txt")
endif
        do k=1,m
        read(1,*)(x(i,j,k,l),l=1,n)
        enddo
        close(1)
enddo
enddo

open(2,file="test结果.txt")
do i=1971,1972
do k=1,m
write(2,"(15i8.1)") i,int(x(i,1,k,1)),int(x(i,1,k,2)),(int(x(i,j,k,3)),j=1,12)
enddo
enddo
close(2)

end

给你加了一个接口,估计你的数据不止四行三列吧?自己改m和n值就可以了
附件是程序和执行文件 test.f90 (527 Bytes, 下载次数: 31)

评分

参与人数 1金钱 +2 收起 理由
倔强的葱头 + 2 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-11-16 13:22:58 | 显示全部楼层
问题解决了,希望你修改一下帖子【已解决】,并且将你的奖励关闭吧。········

评分

参与人数 1金钱 +2 收起 理由
倔强的葱头 + 2 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-11-16 13:27:07 | 显示全部楼层

麻烦你了,你说得对,的确不是4行3列,实际上是98738行,3列,而且是1971-2010年,共480个txt,我刚把你的程序改了下,但是有错误是什么啊?
parameter(m=98738,n=3)
character*8 year,mon
real x(1971:2010,12,m,n)

do i=1971,2010
write(year,"(i4)") i
do j=1,12
if(j.le.9)then
        write(mon,"(i1)") j
        open(1,file=trim(year)//"0"//trim(mon)//".txt")
else
        write(mon,"(i2)") j
        open(1,file=trim(year)//trim(mon)//".txt")
endif
        do k=1,m
        read(1,*)(x(i,j,k,l),l=1,n)
        enddo
        close(1)
enddo
enddo

open(2,file="test结果.txt")
do i=1971,2010
do k=1,m
write(2,"(15i8.1)") i,int(x(i,1,k,1)),int(x(i,1,k,2)),(int(x(i,j,k,3)),j=1,12)
enddo
enddo
close(2)

end

错误提示:
1111222.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-11-16 13:32:44 | 显示全部楼层
倔强的葱头 发表于 2012-11-16 13:27
麻烦你了,你说得对,的确不是4行3列,实际上是98738行,3列,而且是1971-2010年,共480个txt,我刚把你的 ...

你打开你的“197101.txt”文件看一下,你的文件有问题,出现沾在一起的数据··,可以在read后面添加print*,i,i可能不能达到m就结束了,因为程序要求每一行读取n个,一共m行,但是有的行数据粘连,导致那一行数据不足n个···最后程序仍然在运行,但是文件里面没有数据可读了

评分

参与人数 1金钱 +2 收起 理由
倔强的葱头 + 2 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-11-16 13:41:09 | 显示全部楼层
言深深 发表于 2012-11-16 13:32
你打开你的“197101.txt”文件看一下,你的文件有问题,出现沾在一起的数据··,可以在read后面添加prin ...

对,使这个问题,另外,数据中有小数,怎么结果中全部都成了整数?该如何修改
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-11-16 13:44:47 | 显示全部楼层
倔强的葱头 发表于 2012-11-16 13:41
对,使这个问题,另外,数据中有小数,怎么结果中全部都成了整数?该如何修改

程序是根据你的test写的,所以我在write那边加了一句强制转换,int(x),去掉这个,然后把前面输出类型改一下,write(*,"(i8,14f10.2)")即可,注意*是你输出的文件名,缺省表示屏幕输出

评分

参与人数 1金钱 +2 收起 理由
倔强的葱头 + 2 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-11-16 14:00:46 | 显示全部楼层
言深深 发表于 2012-11-16 13:44
程序是根据你的test写的,所以我在write那边加了一句强制转换,int(x),去掉这个,然后把前面输出类型改一 ...

我改成如下:open(2,file="test结果.txt")
do i=1971,2010
do k=1,m
write(2,"(i8,14f10.2)")i,(i,1,k,1),i(i,1,k,2),((i,j,k,3),j=1,12)
enddo
enddo



显示错误:
F:\DATA\0.1\test\pre\test.f90(25) : Error: Syntax error, found ')' when expecting one of: ,
write(2,"(i8,14f10.2)")i,(i,1,k,1),i(i,1,k,2),((i,j,k,3),j=1,12)
---------------------------------^
F:\DATA\0.1\test\pre\test.f90(25) : Error: Syntax error, found END-OF-STATEMENT when expecting one of: ,
write(2,"(i8,14f10.2)")i,(i,1,k,1),i(i,1,k,2),((i,j,k,3),j=1,12)
----------------------------------------------------------------^

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-11-16 14:31:25 | 显示全部楼层
言深深 发表于 2012-11-16 13:44
程序是根据你的test写的,所以我在write那边加了一句强制转换,int(x),去掉这个,然后把前面输出类型改一 ...

我知道我哪里错了,write(2,"(i8,14f10.2)")i,(x(i,1,k,1)),(x(i,1,k,2)),(x(i,j,k,3),j=1,12)
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表