file - 我可以通过 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 中尝试做的事情吗?
解决方案
该表达式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
推荐阅读
- java - 检测目录/文件夹中的文件类型
- .htaccess - htaccess 要求 all 结合 cpanel 目录密码
- python-3.x - pip3 使用了错误的 python 3 版本
- javascript - TypeError: Object(...) is not a function (React.JS)
- node.js - Xvfb & Docker - 显示器突然停止工作
- javascript - 如何在一个循环中多次将一个数组连接到另一个数组?
- cucumber - Cucumber:无法获得通过/失败的“Then”步骤数
- .net-core-3.1 - 从数据库使用 Azure 身份验证并从下拉 .net core 3.1 更新时添加声明
- python - BERTopic model.find_topics(text) throwing error AttributeError: 'Transformer' object has no attribute 'do_lower_case'
- database - 从现有的 mysql 数据库生成 knex 迁移