Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File io 删除文本文件中的重复行_File Io_Fortran - Fatal编程技术网

File io 删除文本文件中的重复行

File io 删除文本文件中的重复行,file-io,fortran,File Io,Fortran,如何在使用Fortran读取.txt文件时删除重复的字符串行? 这是我目前的代码,我走错了方向。目前,我正在尝试保持第一行常量,然后将其与后面的行进行比较 PROGRAM REM_DUP IMPLICIT NONE CHARACTER(632) :: ROW3, ROW4 INTEGER :: I OPEN(UNIT=23, FILE="APM_FORMATTED.TXT", ACTION="READ", STATUS="OLD") OPEN(UNIT=25, FILE="APM_DUPLIC

如何在使用Fortran读取.txt文件时删除重复的字符串行? 这是我目前的代码,我走错了方向。目前,我正在尝试保持第一行常量,然后将其与后面的行进行比较

PROGRAM REM_DUP
IMPLICIT NONE
CHARACTER(632) :: ROW3, ROW4
INTEGER :: I

OPEN(UNIT=23, FILE="APM_FORMATTED.TXT", ACTION="READ", STATUS="OLD")
OPEN(UNIT=25, FILE="APM_DUPLICATES.TXT", ACTION="WRITE", STATUS="NEW")

DO
READ(23,'(A632)', END=199) ROW3
I=1
OPEN(UNIT=24, FILE="APM_FORMATTED1.TXT", ACTION="READWRITE", ACCESS="APPEND", STATUS="OLD")
    DO
    READ(24,'(A632)', END=299) ROW4
        IF(ROW3(33:52).EQ.ROW4(33:52)) THEN
        I=I+1
            IF (I.GE.3) THEN
            WRITE(25,'(A632)') ROW3
            ENDIF
        ELSE 
        WRITE(24, '(A632)') ROW3
        ENDIF
    ENDDO
    CLOSE(24)
ENDDO
199关闭(23) 299关闭(24) 关闭(25)


下面的步骤可能非常慢,但应该可以

i=1
READ(23,'(A632)') row3
WRITE(24,'(A632)') row3 ! assume first read was unique (pretty good assumption)
DO
   READ(23,'(A632)',IOSTAT=ierr) row3
! a successful read returns ierr=0; end-of-file returns -1
   IF(ierr/=0) EXIT
! make sure we are reading from the top of the file
   REWIND(24)
   flag=.false.
! loop through file 24 for comparing
   DO k=1,i
      READ(24,'(A632)') row4
! if the line is repeated, write row3 to bad file (?) & set flag as true
      IF(row3(33:52)==row4(33:52)) THEN
         WRITE(25,'(A632)') row3
         flag = .true.
      ENDIF
   ENDDO
! if row3 is not repeated it, add to file 24 & increment i
   IF(.not.flag) THEN
      WRITE(24,'(A632)') row3
      i=i+1
   ENDIF
ENDDO
CLOSE(24); CLOSE(23); CLOSE(25)

希望这些注释足够理解。

根据文件大小,文本编辑器中的
Ctrl+k
可能会更快…这是一个较大的文件大小。这也是一个更大的代码的一部分,所以包括重复删除功能将是理想的。它必须在fortran中完成吗?如果您在unix环境中,实用程序
sort
uniq
可以很快实现这一点。每个输入行是否正好是632个字符?如果不是,则将每行填充到632。。您可以使用write(unit),(a)’trim(out),但是您也会松开任何现有的空白填充。@Yossarian注意到,他只检查一个子字符串,所以sort不会这样做(除非子字符串可以通过--key拉出)。对不起,但是倒带并重新读取每行的整个文件,真的吗?其他人有什么建议吗?很抱歉,由于我的原始文件是100MB+,代码运行时间太长。它停止了四分之一的过程(因为内存问题而猜测,但不能完全确定)。100MB不是很大。读取将排序键存储为数组字符*20(maxlines)的整个文件,对键字段数组进行排序,然后返回并处理该文件。但是,在用fortran浪费更多时间之前,请确保您理解我上面关于空白填充的说明。@george:(a)OP的想法是将每一行与前一行进行比较,并且(b)我明确指出,这可能是一个非常慢的解决方案。如果您必须做f77(家庭作业?)您有十几个问题。倒带不是其中之一
i=1
READ(23,'(A632)') row3
WRITE(24,'(A632)') row3 ! assume first read was unique (pretty good assumption)
DO
   READ(23,'(A632)',IOSTAT=ierr) row3
! a successful read returns ierr=0; end-of-file returns -1
   IF(ierr/=0) EXIT
! make sure we are reading from the top of the file
   REWIND(24)
   flag=.false.
! loop through file 24 for comparing
   DO k=1,i
      READ(24,'(A632)') row4
! if the line is repeated, write row3 to bad file (?) & set flag as true
      IF(row3(33:52)==row4(33:52)) THEN
         WRITE(25,'(A632)') row3
         flag = .true.
      ENDIF
   ENDDO
! if row3 is not repeated it, add to file 24 & increment i
   IF(.not.flag) THEN
      WRITE(24,'(A632)') row3
      i=i+1
   ENDIF
ENDDO
CLOSE(24); CLOSE(23); CLOSE(25)