首页 > 解决方案 > 我可以通过 fortran 中的匹配列连接两个文件吗?

问题描述

我是使用 fortran 的新手。我可以通过匹配列以某种方式连接两个数据文件吗?

我正在尝试加入两个数据文件。第一个有 100.000 条记录,每行代表一个人。第二个文件有 400.000 条记录,其中第一个文件中的人可以出现多次。两个文件中的第一列都有每个人的唯一 ID

我想按第一列加入文件,并将文件 1 中的信息添加到文件 2...所以新文件将有 400.000 行,其中包含来自 datafile1 的每个人的添加信息。

这是我尝试编写的代码:

integer, parameter :: nosaed=411684!saedingar 411684

integer, parameter :: noeinst=105161 !gripir 105161

integer, dimension(1:nosaed) :: einsts, saeding, frjot

integer, dimension(1:noeinst) :: einstg, bu, faeding, forgun, burdur1, burdur2, burdur3, burdur4

integer :: i, j

character (len=21):: pth

 pth="home/thordis/frjosemi"

open (unit=10, file=pth//"saedingar.txt", status="old")

open (unit=11, file=pth//"gripalisti.txt", status="old")

open (unit=12, file=pth//"gagnasafn.txt", status="new")


do j = 1, noeinst
  read (11,1011) einstg(j), bu(j), faeding(j), forgun(j), burdur1(j), burdur2(j), burdur3(j), burdur4(j)

  1011 format (i15,2x,i6,2x,i8,2x,i8,2x,i8,2x,i8,2x,i8,2x,i8)

do i = 1, nosaed

  read (10,1010) einsts(i), saeding(i), frjot(i)

  1010 format (i15,1x,i8,1x,i3)


if (einsts == einstg) then

  write (12,1012) einsts, saeding, frjot, bu, faeding, forgun, &

                burdur1, burdur2, burdur3, burdur4

  1012 format (i15,1x,i8,1x,i3,1x,i6,1x,i8,1x,i8,1x,i8,1x,i8,1x,i8,1x,i8)

        endif


enddo
enddo

当我尝试编译它时,会收到以下消息:

if (einsts == einstg) then
    1        2
Error: Shapes for operands at (1) and (2) are not conformable

这是因为数据文件的长度不同吗?有可能做我在 Fortran 中尝试做的事情吗?

标签: filejoinfortran

解决方案


该表达式einsts==einstg试图按元素比较两个数组,但数组的长度不同,所以这不起作用。相反,您想比较相关元素,使用einsts(i)==einstg(j).

我应该指出一件事:您目前正在阅读saedingar.txt 105161时代。这可能会很慢。相反,我建议读取文件一次,然后多次循环数据,例如:

integer, parameter :: nosaed=411684 !saedingar 411684

integer, parameter :: noeinst=105161 !gripir 105161

integer, dimension(1:nosaed) :: einsts, saeding, frjot

integer, dimension(1:noeinst) :: einstg, bu, faeding, forgun, burdur1, burdur2, burdur3, burdur4

integer :: i, j

character (len=21):: pth

pth="home/thordis/frjosemi"

open (unit=10, file=pth//"saedingar.txt", status="old")
do i = 1, nosaed
  read (10,1010) einsts(i), saeding(i), frjot(i)

  1010 format (i15,1x,i8,1x,i3)
enddo

open (unit=11, file=pth//"gripalisti.txt", status="old")
do j = 1, noeinst
  read (11,1011) einstg(j), bu(j), faeding(j), forgun(j), burdur1(j), burdur2(j), burdur3(j), burdur4(j)

  1011 format (i15,2x,i6,2x,i8,2x,i8,2x,i8,2x,i8,2x,i8,2x,i8)
enddo

open (unit=12, file=pth//"gagnasafn.txt", status="new")
do j = 1, noeinst
  do i = 1, nosaed
    if (einsts(i) == einstg(j)) then
      write (12,1012) einsts(i), saeding(i), frjot(i), &
          & bu(j), faeding(j), forgun(j), burdur1(j), burdur2(j), burdur3(j), burdur4(j)

      1012 format (i15,1x,i8,1x,i3,1x,i6,1x,i8,1x,i8,1x,i8,1x,i8,1x,i8,1x,i8)
    endif
  enddo
enddo

推荐阅读