2016-11-14 4 views
0

Also mache ich Abrechnung für eine Arztpraxis, und wir überprüfen gerne, dass die Grippeimpfungen, die wir geben, tatsächlich in Rechnung gestellt werden. Im Moment überprüft meine AHK ihre gesamte Tabelle nach Schlüsseln wie dem ICD-10 Code Z23 und prüft dann auf "Influenza". Wenn beide gefunden werden, wird die Nummer des medizinischen Aktenzeichens des Patienten der altersgerechten Textdatei hinzugefügt, entweder 65+ oder unter 65. Es gibt auch Papierblätter mit 10 Schlitzen, in denen wir die MRNs manuell aufzeichnen, um sie zu überprüfen. Ich möchte ein Skript erstellen, das drei Dateien vergleicht, eine Datei gemischter MRNs (65+ und < 65), und wenn die MRN in der gemischten Datei gefunden wird, sollte diese Zeile entfernt werden. (Ich habe eine Menge über das Thema gegoogelt, aber alle empfehlen, eine Bibliothek zu verwenden, was mein Programm nur verlangsamen würde.) Wenn die Zeile nicht gefunden wird, sollte sie in der Hauptdatei für meine Überprüfung bleiben . Ich kann nicht herausfinden, wie man Zeilen entfernt, geschweige denn eine bestimmte Zeile. Bis jetzt, um die Dateien gegeneinander zu überprüfen, habe ich das. Anstatt Linien zu entfernen, füge ich die nicht abgerechneten Zahlen zu einer vierten Textdatei hinzu, aber letztendlich wäre das Entfernen besser.AHK: Vergleichen zweier Txt-Dateien

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++ 

     } 
    } 

UPDATE !!!!!!!

In Ordnung, also nahm ich Ihren Code, und ich habe versucht, einen Reverse-Check auszuführen. Sie überprüfen die assoziativen Arrays der Flushot-Textdateien für Erwachsene und Senioren für die MRNS in flushot.txt. Wenn sie nicht gefunden werden, werden sie zu den nicht abgerechneten hinzugefügt. Im Folgenden sind einige meiner Versuche, das umzukehren, und überprüfen Sie für die MRNs in Adult und Senior in flushot.txt, und wenn nicht gefunden, um es zu einer Datei namens notrecorded.txt hinzufügen, damit ich weiß, was Leute flushhots und der MA wer hat es nicht aufgezeichnet (von Primary Care Provider).

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

einfach noch einmal zu versuchen (ich das tue, weil du klug bist, und half mir vor, hier hofft) @ Jim-U – DarknessCalling

Antwort

0

Ich denke, Sie waren auf dem richtigen Weg, indem Sie eine Ausgabedatei erstellen, anstatt Zeilen zu löschen. Textdateien werden normalerweise als Datenströme und nicht als Dateien mit fester Datensatzlänge behandelt. Das Löschen von Zeilen ist fehleranfällig und nicht effizient. Sie müssten die Datei irgendwie komprimieren.

Wie groß sind Ihre Dateien? Wenn es nur ein paar tausend Patienten gibt, würde ich einfach alles in assoziative Arrays laden, so dass wir Keyed Lookups verwenden können.

Programm

^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 VOR

301 
101 
103 
302 
205 
301 
207 
103 
303 
301 

flushot.txt NACH

301 
302 
303 
+0

Die Dateien sind nicht sehr groß Jetzt, und die gemischte Datei wird nach jedem Ausführen dieses Codes gelöscht. Es wird wahrscheinlich nie mehr als 50 werden, ehrlich. Die anderen beiden werden jedoch als permanente Aufzeichnung der in Rechnung gestellten Flushshots und ihrer Injektionsdaten aufbewahrt. Was die Größe der anderen beiden anbelangt, könnten wir nicht eine Art Chunk Grab verwenden? Gibt es eine Möglichkeit, herauszufinden, wie viele Zeilen in einer Datei enthalten sind, und Blöcke gleichzeitig zu erfassen, ohne dass das Programm ausflippt, wenn der letzte Block die "falsche" Größe hat? Ich bin vertraut mit Arrays, aber ich weiß nicht, was ein assoziatives Array ist. – DarknessCalling

+0

In Bezug auf die letzten beiden Zeilen habe ich diesen Befehl vorher noch nicht gesehen, aber basierend auf der Ausgabe löschst du den gesamten Flashshot.txt am Ende und den Inhalt von unbilledtester.txt in den Inhalt? – DarknessCalling

+0

Auch eine letzte Frage, tut mir leid, wenn Dreifachkommentar ist schlecht, aber ich habe bemerkt, dass Sie die Tendenz haben, Funktionen über nur den Code in den Hotkey selbst setzen, ist diese Vorliebe oder gibt es eine Art Leistungssteigerung? (Mir ist klar, dass es eine klügere Methode zum Programmieren ist, weil dann alles unabhängig arbeitet und ich einen großen Teil meines Codes in eine Funktion umwandeln musste, weil sie zu oft wiederholt wurde und zu viel Platz benötigte.) – DarknessCalling

Verwandte Themen