在Fortran77中删除重复的行

巴斯克斯

我有一个文件,该文件是119列(用空格分隔)和约50000行(行)的表。我想删除重复的条目,即那些具有所有相同列的行(119)。我草绘了这段代码:

      PROGRAM deldup

      IMPLICIT NONE

      DOUBLE PRECISION PAR(119),PAR2(119)
      INTEGER I,J,K,LINE,TREP
      CHARACTER filename*40

c Get the input file name
      CALL getarg(1,filename)

c File where the results will be stored.
      OPEN(29, FILE="result.dat", STATUS='UNKNOWN')

c Current line number
      LINE=0
c counting repeated points
      TREP=0

 101  LINE=LINE+1
      OPEN(27, FILE=filename, STATUS='OLD')

c     Verifying that we are not in the first line... and we read the
c     corresponding one
      IF (LINE.NE.1) THEN 
         DO K=1,LINE-1
            READ(27,11,ERR=103,END=9999)
         END DO
      ENDIF
      READ(27,11,ERR=103,END=9999) (PAR(I),I=1,119)

c     Start comparing line by line looking for matches. If a match is
c     found , close the
c     file and open it again to read the next line. If the end of file is
c     reached and not iqual rows found, write the line in "results.dat"

 102  READ(27, 11,END=104, ERR=102) (PAR2(I),I=1,119)
      DO J=1,119
         IF ( PAR(J).NE.PAR2(J) ) THEN
            GOTO 102
         ELSEIF (J.EQ.119) THEN
            TREP=TREP+1
            GOTO 103
         ENDIF
      END DO

 104  WRITE(29,11) (PAR(I),I=1,119)

 103  CLOSE(27)
      GOTO 101

 9999 WRITE(*,*) "DONE!,", TREP, "duplicated points found!"
      CLOSE(27)
      CLOSE(28)
      CLOSE(29)

 11   FORMAT(200E14.6)
      END

实际上有效,这只是超级慢。为什么?我可以使用任何图书馆吗?对不起,很抱歉,我对Fortran77完全陌生。

亚历山大·沃格特

对于每一行,您打开和关闭原始文件的速度非常慢!为了加快速度,您可以使用rewind

但是,主要问题是算法的复杂性:O(n^2)[将每一行与其他每一行进行比较]。首先,我将保留一个唯一行的列表,然后与该列表进行比较。如果已经列出了新行,则将其丢弃-如果没有,则为新的唯一行。这样O(n*m)(希望)将复杂度降低为m << n(m是唯一行的数量)。对行进行排序可能会加快比较速度。

下一个注意事项是从I / O转移到内存!将完整文件读入数组,或者至少将唯一行列表保留在内存中。一个50,000x119的双精度数组需要约45MB的RAM,所以我认为这应该是可行的;-)在最后一步中将结果写回。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从Fortran77中的字符串中删除换行符?

来自分类Dev

Fortran77 程序中输出数组维数的减少

来自分类Dev

用 Julia 编译 Fortran77

来自分类Dev

openmp长指令列表fortran77的语法

来自分类Dev

openmp长指令列表fortran77的语法

来自分类Dev

为什么Python和Fortran77为此分数返回不同的值?

来自分类Dev

使用fortran77将输出写入txt文件,没有列宽限制

来自分类Dev

如何使用来自文件的输入来运行fortran77程序?

来自分类Dev

Fortran77 write(0,*)DLL命令未刷新到R GUI控制台

来自分类Dev

在C ++中删除重复的行

来自分类Dev

删除sqlite中的重复行?

来自分类Dev

删除calc中的重复行?

来自分类Dev

在PowerPivot中删除重复的行

来自分类Dev

删除Sparklyr中的重复行

来自分类Dev

在mysql中删除重复的行

来自分类Dev

在MATLAB中删除重复的行

来自分类Dev

在sqlite中删除重复的行?

来自分类Dev

从文件中删除重复的行

来自分类Dev

删除行中重复的单词

来自分类Dev

如何使用Fortran 77从带有说明和空白行的文件中读取数据?

来自分类Dev

在Fortran 77中重命名文件

来自分类Dev

从行中的值中删除重复项

来自分类Dev

如何从联接中删除重复的行(SQL)

来自分类Dev

Spark从DataFrame中删除重复的行

来自分类Dev

SQL-从表中删除重复的行

来自分类Dev

MySQL删除表中的重复行

来自分类Dev

删除Fusion Tables中的重复行

来自分类Dev

从XML文件中删除特定的重复行

来自分类Dev

从文件中删除重复的行块