2016-11-14 7 views
0

Итак, я делаю выставление счетов за офис врачей, и мы хотели бы проверить, что сделанные вами прививки от гриппа фактически выставляются. Прямо сейчас, мой AHK проверяет весь их график на такие ключи, как ICD-10 Code Z23, а затем проверяет наличие «гриппа». Если он найдет оба из них, он добавит номер медицинского номера пациентов к соответствующему текстовому файлу возраста либо 65+, либо ниже 65. Есть также бумажные листы с 10 слотами, которые мы записываем MRN вручную, чтобы дважды проверить. Я хочу создать скрипт, который будет сравнивать три файла, файл смешанных MRN (как 65+, так и < 65), и если MRN найден в смешанном файле, он должен удалить эту строку. (Я сделал кучу поиска по этой теме, но все рекомендуют использовать библиотеку, что только замедлит мою программу.) Если строка не найдена, ее следует оставить в главном файле для моего обзора , Я не могу понять, как удалить строки, не говоря уже о конкретной строке. Пока, чтобы проверять файлы друг против друга, у меня это есть. Вместо удаления строк я добавляю неиспользуемые числа в четвертый текстовый файл, но в конечном итоге удаление будет лучше.AHK: Сравнение двух файлов Txt

FILENUM = 1 
FILENU = 1 
^L:: 
Loop 
    { 
    FileReadLine, MRN, E:\AHK & AHKS\flushot.txt, %LINENUM% 
    If ErrorLevel 
     { 
     break 
     } 
    Else 
     { 
     Loop 
      { 
      FileReadLine, MRNc, E:\AHK & AHKS\Billed65+Flushots.txt, LINENU 
      StringTrimRight, MRNc, 11 
      If (MRN != MRNc) 
       { 
       LINENU++ 
       Match = 0 
       } 
      If (MRN == MRNc) 
       Match = 1 
      If ErrorLevel and Match = 0 
       { 
       FileAppend, MRN, E:\AHK & AHKS\Unbilledtester.txt 
       LINENU = 1 
       } 
      If (Match = 1) 
       GoTo Lab2 

      } 
     Lab2: 
     Loop 
      { 
      FileReadLine, MRNc, E:\AHK & AHKS\BilledAdultFlushots.txt, LINENU 
      StringTrimRight, MRNc, 11 
      If (MRN != MRNc) 
       { 
       LINENU++ 
       Match = 0 
       } 
      If (MRN == MRNc) 
       Match = 1 
      If ErrorLevel and Match = 0 
       FileAppend, MRN, E:\AHK & AHKS\Unbilledtester.txt 
      If (Match = 1) 
       GoTo Lab2 

      } 
     LINENUM++ 

     } 
    } 

ОБНОВЛЕНИЕ !!!!!!!

Хорошо, поэтому я схватил ваш код, и я пытался запустить обратную проверку. Вы проверяете ассоциативные массивы текстовых файлов для взрослых и старших flushot для MRNS в файле flushot.txt, а затем, если они не найдены, они добавляются к неисполненным. Ниже приведены несколько моих попыток обратить вспять это и проверить для MRN в Adult and Senior в файле flushot.txt, и если они не найдены, добавьте его в файл с именем notrecorded.txt, чтобы я знал, что люди получили flushots и MA, которые не регистрировал его (поставщиком первичной медицинской помощи).

FlushotsBilled() 
{ 
Root_Dir   := "E:\AHK & AHKS" 
fName_Input   := "flushot.txt" 
fName_Backup  := "flushot_old.txt" 
fName_Output  := "unbilled.txt" 
fName_Billed_Adult := "billedAdultFlushots.txt" 
fName_Billed_Senior := "billed65+Flushots.txt" 
fName_Billed_NR  := "notrecorded.txt" 
fName_Mixed  := "mixrecord.txt" 

SetWorkingDir %Root_Dir% 
FileDelete, %fName_Output% 

AdultFlu := {} 
SeniorFlu := {} 
GivenFluA := {} 
GivenFluB := {} 
Mixed  := {} 

Loop, Read, %fName_Mixed% 
    Mixed[A_LoopReadLine] := True 

Loop, Read, %fName_Billed_Adult% 
    { 
    ;Loop, Parse, A_LoopReadLine, `t 
    ; AdultFlu[A_LoopField] := True 
    AdultFlu[A_LoopReadLine] := True 
     If !Mixed[A_LoopReadLine] 
      FileAppend, %A_LoopReadLine%`n, %fName_Mixed% 
    } 

Loop, Read, %fName_Billed_Senior% 
    { 
    ;Loop, Parse, A_LoopReadLine, `t 
    ; SeniorFlu[A_LoopField] := True 
    SeniorFlu[A_LoopReadLine] := True 
     If !Mixed[A_LoopReadLine] 
      FileAppend, %A_LoopReadLine%`n, %fName_Mixed% 
    } 

Loop, Read, %fName_Input% ;check flushot.txt for 
    If !AdultFlu[SubStr(A_LoopReadLine, 1, InStr(A_LoopReadLine,"`t"))] && !SeniorFlu[SubStr(A_LoopReadLine, 1, InStr(A_LoopReadLine,"`t"))] 
    ;If !AdultFlu[A_LoopReadLine] && !SeniorFlu[A_LoopReadLine] ;flushot is checking the associated arrays 
     FileAppend, %A_LoopReadLine%`n, %fName_Output% ;if not found, stick it into unbilled. 

Loop, Read, %fName_Input% 
    GivenFluA[A_LoopReadLine] := True 



/* Loop, Read, %fName_Billed_Senior% 
    If !Mixed[A_LoopReadLine] 
     FileAppend, %A_LoopReadLine%`n, %fName_Mixed% 

Loop, Read, %fName_Billed_Adult% 
    If !Mixed[A_LoopReadLine] 
     FileAppend, %A_LoopReadLine%`n, %fName_Mixed% 

Loop, Read, %fName_Mixed% 
    Mixed[A_LoopReadLine] := True 
*/ 
Loop, Read, %fName_Mixed% 
    If !GivenFluA[SubStr(A_LoopReadLine, 1, InStr(A_LoopReadLine,"`t"))] ;a_Loopreadline is a line in mixed. it is looking through flushot.txt for that line, if it's there, it's givenflua's index 
     Loop, Read, %fName_Billed_NR% 
      If !GivenFluA[A_LoopReadLine] 
       FileAppend, %A_LoopReadLine%`n 




/* 
Loop, Read, %fName_Input% ;read flushot 
    If Mixed[A_LoopReadLine] Contains A_LoopReadLine ;check to see if each line in flushot is in mixed 
     GivenFluA[Mixed[A_LoopReadLine]] := True ;Mixed[A_LoopReadLine] 

Loop, Read, %fName_Billed_NR% 
    If !GivenFluA[A_LoopReadLine] 
     FileAppend GivenFluA[%A_LoopReadLine%], %fName_Billed_NR% 
*/ 

;if readline is in mixed, but not in flushot, check to see if it's in notrecorded, if not, append it 

/* 
Loop, Read, %fName_Mixed% ;open up the mixed record 
    IfNotInString, A_LoopReadLine, GivenFluA[A_LoopReadLine] ;see if inside each line, we can find the lines from flushot.txt, if not 
     ;GivenFluB[GivenFluA[A_LoopReadLine]] := True ;if not we give the line from inside flushot to another associative array 
     GivenFluB[A_LoopReadLine] := True ;lets try this, put the value 

Loop, Read, %fName_Mixed% 
    IfInString, A_LoopReadLine, GivenFluA[A_LoopReadLine] 
     GivenFluB[A_LoopReadLine] 

Loop, Read, %fName_Billed_NR% ;open up not recorded 
    IfNotInString, A_LoopReadLine, GivenFluB[A_LoopReadLine] ;see if inside each line we can find that line from 
     FileAppend, %A_LoopReadLine%`n, %fName_Billed_NR% 
*/ 
} 
+0

Просто попробуйте еще раз (я делаю это потому, что ты умный, и вы помогли мне и раньше, здесь надеется) @ Джим-U – DarknessCalling

ответ

0

Я думаю, что вы были на правильном пути, создав выходной файл, а не удаляя строки. Текстовые файлы обычно обрабатываются как потоки, а не файлы данных фиксированной длины. Удаление строк является ошибкой и неэффективно; вам придется каким-то образом сжать файл.

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

Программа

^L:: medical_run() 

medical_run() 
{ 
    root_dir   := "E:\AHK & AHKS" 
    fname_input   := "flushot.txt" 
    fname_backup  := "flushot_old.txt" 
    fname_temp_output := "Unbilledtester.txt" 
    fname_billed_adult := "billedAdultFlushots.txt" 
    fname_billed_senior := "billed65+Flushots.txt" 

    SetWorkingDir %root_dir% 
    FileDelete %fname_output% 

    adults := {} 
    seniors := {} 
    unmatched := {} 

    loop READ, %fname_billed_adult% 
    adults[A_LoopReadLine] := true 

    loop READ, %fname_billed_senior% 
    seniors[A_LoopReadLine] := true 

    loop READ, %fname_input% 
    if !adults[A_LoopReadLine] && !seniors[A_LoopReadLine] 
     unmatched[A_LoopReadLine] := true 

    for code,dummy in unmatched 
    FileAppend %code%`n, %fname_output% 

    FileMove %fname_input%, %fname_backup% 
    FileMove %fname_temp_output%, %fname_input% 
} 

billedAdultFlushots.txt

101 
102 
103 
104 

billed65 + Flushots.txt

205 
206 
207 
208 

flushot.txt ДО

301 
101 
103 
302 
205 
301 
207 
103 
303 
301 

flushot.txt ПОСЛЕ

301 
302 
303 
+0

Файлы не очень большой теперь, и смешанный файл будет удален после каждого запуска этого кода. Честно говоря, он, вероятно, никогда не достигнет более 50. Остальные два, однако, будут сохранены как постоянная запись выставленных флюксовок и даты их введения. Что касается размеров двух других, разве мы не могли бы использовать какой-то захват куска? Есть ли способ узнать, сколько строк в файле, и захватить куски за раз, без программы freaking, если последний кусок является «неправильным» размером? Я знаком с массивами, но я не знаю, что такое ассоциативный массив. – DarknessCalling

+0

Что касается этих двух последних строк, я не видел эту команду раньше, но на основе вывода вы удаляете весь flushot.txt в конце и сбросить содержимое unbilledtester.txt в него? – DarknessCalling

+0

Также, последний вопрос, извините, если тройное комментирование плохо, но я заметил, что у вас есть тенденция использовать функции, просто вставляя код в саму горячую клавишу, является ли это предпочтение или дает какое-то повышение производительности? (Я понимаю, что это более умный способ кодирования, потому что все будет работать независимо, если это будет сделано, и мне пришлось преобразовать большой кусок моего кода в функцию, потому что его повторяли слишком много и занимали слишком много места.) – DarknessCalling

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