2017-01-11 3 views
0

Ich versuche, Daten aus einer Textdatei zu erhalten und die Daten an die Datenbank zu übergeben. Die Sache ist, jedes Mal, wenn ich die Ansicht neu lade, werden die Daten gesendet und das bedeutet, dass ich doppelte Daten erhalte, gibt es eine Möglichkeit, dies zu verhindern? Vielleicht die Datei abschneiden oder die Zeilennummer der letzten verarbeiteten Zeile speichern?Doppelte Daten beim erneuten Laden der Ansicht

Auch die Art und Weise, wie die Textdateien generiert werden, ist, dass ich jeden Tag eine neue Textdatei mit dem Datum auf den Namen der Datei bekomme, vielleicht ein anderer Ansatz, den ich dachte, war eine neue Datenbanktabelle zu erstellen, wo ich markieren würde jede Datei, die ich als "verarbeitet" verarbeite, so dass die Funktion nicht mehr als einmal dieselbe Datei verarbeitet.

Hier ist ein Beispiel für die Textdatei:

1618 0002 9 9 505 04129284134 4141191269 4141191269 56984 4  002 001 4 

1606 0000 9     1159 4169191388 4169191388  4  012  0 

1607 0009 7 9 505 04129284134   1245   1245 56984 4   

1619 0000 9 6    1172 2129922686 2129922686  4  013  0 

1606 0000 9     1159 4169191388 4169191388  4  012  0 

1607 0009 7 9 505 04129284134   1245   1245 56984 4   

1619 0000 7 6 521   1188#   1172   1172  0   001 4 

1606 0000 9     1159 4169191388 4169191388  4  012  0 

1607 0009 7 9 505 04129284134   1245   1245 56984 4   

Und hier ist die Funktion, die ich auf meine Routen Datei bin mit:

Route::get('calls', function() { 
    foreach (file(public_path() . "/calls.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) { 
     $calls     = new Calls(); 
     $calls->time   = trim(substr($line, 0, 4)); 
     $calls->duration  = trim(substr($line, 5, 4)); 
     $calls->cond_code  = trim(substr($line, 10, 1)); 
     $calls->code_dial  = trim(substr($line, 15, 1)); 
     $calls->code_used  = trim(substr($line, 18, 3)); 
     $calls->dialed_num  = trim(substr($line, 24, 11)); 
     $calls->calling_num = trim(substr($line, 39, 11)); 
     $calls->clg_num_in_tac = trim(substr($line, 53, 11)); 
     $calls->auth_code  = trim(substr($line, 64, 5)); 
     $calls->frl   = trim(substr($line, 70, 1)); 
     $calls->ixc_code  = trim(substr($line, 77, 3)); 
     $calls->in_crt_id  = trim(substr($line, 85, 3)); 
     $calls->save(); 
    } 
    return View::make('test') 
     ->with('calls', Calls::all()); 

}); 
+0

Ist das eine TXT-Datei oder eine Tab-getrennte csv? – Jeff

+0

Die Bearbeitung Ihrer Formularanforderung über die "Get" -Route ist eine schlechte Übung. Schau dir meine Lösung unten an und schau, ob es dir passt. – Gayan

+0

@Jeff es ist eine Textdatei mit Spalten fester Breite. –

Antwort

0

Das Problem bei der Umsetzung ist.

Mit der aktuellen Implementierung müssten Sie jede Eingabe mit den Datenbankeinträgen abgleichen, wenn Sie Dubletten einschränken müssten.

Aber es ist ein sehr schlechtes Design und stark discurraged.

Was Sie stattdessen tun, ist ein file input Feld in Ihrem Formular und POST das Formular hinzufügen. Behandle dann das Formular so.

Route::post('calls', function() { 
    // your code goes here... 
}); 

Sobald Sie fertig sind, können Sie auf eine andere Route umleiten.

+0

Die Sache ist, ich benutze kein Formular. Ich hole die Datei aus einem Verzeichnis, analysiere die Information darin und zeige dann die Daten in einer Tabelle an. –

Verwandte Themen