2013-08-06 5 views
1

Как удалить повторяющиеся строки строки при чтении .txt-файла с помощью Fortran? Это мой код в настоящее время, и я возглавляю по-настоящему неправильный путь. В настоящее время я пытаюсь удерживать первую константу строки, а затем сравниваю ее с строками после нее.Удалить повторяющиеся строки в текстовом файле

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 CLOSE (23) 299 CLOSE (24) CLOSE (25)

END PROGRAM REM_DUP 
+0

В зависимости от размера файла 'Ctrl + k' в текстовом редакторе может быть быстрее ... –

+0

Его большой размер файла. Это также является частью более крупного кода, поэтому включение функций удаления дубликатов будет идеальным. – user1436056

+2

Нужно ли это делать в fortran? Если вы находитесь в среде unix, утилиты 'sort' и' uniq' могут достичь этого очень быстро. – Yossarian

ответ

2

Следующая может быть чудовищно медленно, но он должен работать.

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) 

Надеюсь, комментариев достаточно, чтобы их понять.

+0

извините, но перематывать и перечитывать весь файл для каждой строки, действительно ?? – agentp

+0

Есть ли у кого-нибудь рекомендации? Извините, но код занимает слишком много времени, так как мой исходный файл равен 100 Мбайт +. Он останавливается на четверть пути (угадывание из-за проблем с памятью, но не совсем уверенное). – user1436056

+0

100MB не большой. Прочитайте весь файл, сохраняющий ключ сортировки как символ массива * 20 (maxlines), отсортируйте массив полей ключа, затем вернитесь и обработайте файл. Однако убедитесь, что вы поняли мою заметку выше о пустом заполнении, прежде чем тратить больше времени, пытаясь сделать это в fortran. – agentp

Смежные вопросы