Fortran Coder

查看: 43137|回复: 20
打印 上一主题 下一主题

[文件读写] fortran抽取csv文件中某几列,写成新文件(新手求教)

[复制链接]

25

帖子

8

主题

0

精华

熟手

F 币
164 元
贡献
104 点
跳转到指定楼层
楼主
发表于 2017-4-8 16:55:31 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
用fortran读取csv文件,文件如下(部分截图):一共792305行,113列,现要将其中名为alloc_key,whea,whea_h,whea_l, whea_i,whea_s等6列的全部数据抽取出,写入另一个文件里

我写了以下程序:
[Fortran] 纯文本查看 复制代码
program wheat_area
      implicit none
      integer m,i
         integer,allocatable::alloc_key(:)
         real,allocatable::whea(:), whea_h(:),whea_l(:)
         real,allocatable::whea_i(:),whea_s(:)
         open(10,file="/home/iga_qtong/fortran_xcao/gae_c/spam_p.csv")
         open(11,file="/home/iga_qtong/fortran_xcao/gae_c/whout.csv")
         m=792305
         allocate(alloc_key(m),whea(m),whea_h(m))
         allocate(whea_l(m),whea_i(m),whea_s(m))
         do i=1,1
           read(10,*)
         end do
         do i=1,m
           read(10,*)
           write(11,*) (alloc_key(i),whea(i),whea_h(i),whea_l(i),&
                         whea_i(i),whea_s(i))
       end do
      close(10)
      close(11)
      end program wheat_area


完全新手,有很多问题要请教
请问:
1、是否可以只读要抽取数据的几列的表头
2、write续行符使用有问题
3、请高手帮助指出程序的问题
分享到:  微信微信
收藏收藏2 点赞点赞 点踩点踩

14

帖子

1

主题

0

精华

入门

Gone with the wind~

F 币
66 元
贡献
31 点

规矩勋章

21#
发表于 2022-4-18 09:28:05 | 只看该作者
青衣巷 发表于 2022-4-14 17:10
没关系的,Fortran不区分单双引号。
只要间隔开就行了。
比如你用 " 开头,里面就要用 ',例如 "I ' m fc ...

懂了,谢谢指教

81

帖子

0

主题

0

精华

专家

F 币
471 元
贡献
232 点

规矩勋章新人勋章元老勋章

QQ
20#
发表于 2022-4-14 17:10:33 | 只看该作者
Rookie 发表于 2022-4-14 16:50
请问第19和28行的 write语句括号中的  format  部分,所用的单引号、双引号,刚好反过来了。这是什么原因 ...

没关系的,Fortran不区分单双引号。
只要间隔开就行了。
比如你用 " 开头,里面就要用 ',例如 "I ' m fcode"
而用 ' 开头,里面就要用 " ,例如 ' I "m fcode '
彼岸,有永恒的守候...

14

帖子

1

主题

0

精华

入门

Gone with the wind~

F 币
66 元
贡献
31 点

规矩勋章

19#
发表于 2022-4-14 16:50:16 | 只看该作者
li913 发表于 2017-4-8 18:23
write的问题,去掉最外层括号就好。[mw_shl_code=fortran,true]program test
  implicit none  
integer,pa ...

请问第19和28行的 write语句括号中的  format  部分,所用的单引号、双引号,刚好反过来了。这是什么原因呢?

1

帖子

0

主题

0

精华

新人

F 币
12 元
贡献
4 点
18#
发表于 2017-12-17 10:15:51 | 只看该作者
fcode 发表于 2017-4-10 17:20
少了一个引号,请直接复制粘贴我的代码。

按照上面的代码复制了,但是因为原文件有些数据是空缺的,生成的文件空缺的地方自动补充了,请问您有什么解决办法嘛~
[Fortran] 纯文本查看 复制代码
program test
  implicit none  
integer,parameter::nCol = 949
  integer i, j
  character(10000) str(nCol)
  character(*),parameter:: strHead(9)=['date','hour','type','1142A','1143A','1144A','1145A', '1146A','1147A']
  logical L(nCol)
  open(10,file='E:\shuju\zhandian\20140513-20141231\china_sites_20141201.csv')
  open(11,file='E:\shuju\china_sites_20141201.csv')
  !读取表头
  read(10,*) str 
  !判断需要读取的列
  L = .false.
  do i = 1,nCol
    str(i) = adjustl( str(i) )
    if( any(trim(str(i))==strHead) ) then
      L(i) = .true.
      write(11,"(a,',')",advance='no') trim( str(i) ) !输出新表头
    end if
  end do
  write(11,*)
  do
    read(10,*,iostat=j) str
    if(j/=0) exit
    do i =1, nCol
      if(.NOT.L(i)) cycle
      write(11,'(a,",")',advance='no') trim( str(i) )
    end do
    write(11,*)
  end do
end program test



捕获.PNG (20.74 KB, 下载次数: 466)

捕获.PNG

捕获1.PNG (18.17 KB, 下载次数: 522)

捕获1.PNG

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

17#
发表于 2017-10-9 09:54:02 | 只看该作者
山水 发表于 2017-10-7 11:06
[mw_shl_code=fortran,true]program test
implicit none  
integer,parameter::nCol = 36

请放弃 PowerStation 这种古老的编译器。

5

帖子

1

主题

0

精华

入门

F 币
65 元
贡献
30 点
16#
发表于 2017-10-7 11:06:01 | 只看该作者
[Fortran] 纯文本查看 复制代码
program test
implicit none  
integer,parameter::nCol = 36
  integer i, j
  character(80) str(nCol)
  
 character(32),parameter::  strHead(1)=['Province']
 !strHead(23)=['Province','City','Stationname','Longitude','Latitude','Publishtime', 'AQI','SO2','NO2','CO','O3','PM10', &
 !'PM2_5','SO2_24H_AVG','NO2_24H_AVG','CO_24H_AVG','O3_24H_AVG','PM10_24H_AVG','PM2_5_24H_AVG','O3_8H','O3_8H_24H','PrimaryPollutant','Quality']

  logical L(nCol)

  open(11,file='F:\GraduateStudent\Data-Data\sichuanpollution.csv')
  open(10,file='F:\GraduateStudent\Data-Data\sichuanpollution1.csv')
  !读取表头
  read(10,*) str 
  !判断需要读取的列
  L = .false.
  do i = 1, nCol
    str(i) = adjustl( str(i) )
    if( any(trim(str(i))==strHead) ) then
      L(i) = .true.
      write(11,"(a,',')",advance='no') trim( str(i) ) !输出新表头
    end if
  end do
  write(11,*)
  do
    read(10,*,iostat=j) str
    if(j/=0) exit
    do i =1, nCol
      if(.NOT.L(i)) cycle
      write(11,'(a,",")',advance='no') trim( str(i) )
    end do
    write(11,*)
  end do
end program test

我复制粘贴后按照自己需要的修改了一下,不管是定义1个变量还是3个甚至更多变量,都会出现这样一个错误:error FOR3852: syntax error detected between = and ['Province'],想问一下是什么原因呢

25

帖子

8

主题

0

精华

熟手

F 币
164 元
贡献
104 点
15#
 楼主| 发表于 2017-4-11 09:18:07 | 只看该作者
pasuka 发表于 2017-4-10 22:11
*.f格式最大列数不超过80,把文件后缀名改成*.f90

活学活用,急用先学并不代表本站的视频教程和彭国伦的 ...

谢谢,非常感谢

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

14#
发表于 2017-4-11 07:53:37 | 只看该作者
太长了可以续行

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

13#
发表于 2017-4-10 22:11:05 | 只看该作者
桂圆莲子汤 发表于 2017-4-10 21:51
对不起,之前把空格去掉了,我自己没注意,不好意思,可是这次我是真的复制过去的,还是一样的错误,但是 ...

*.f格式最大列数不超过80,把文件后缀名改成*.f90

活学活用,急用先学并不代表本站的视频教程和彭国伦的书无关紧要啊
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-25 01:31

Powered by Tencent X3.4

© 2013-2024 Tencent

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