Matthias: Performance bei Textzerlegung

Beitrag lesen

Hallo,

ich habe eine Klasse gebaut, die eine BatchInput-Datei verarbeitet, bevor diese ins SAP eingespielt wird.

Die Datei wird zeilenweise gelesen, die einzelnen Bereiche aus der Zeile herausgeschnitten und in eine Tabelle eingetragen.

Danach findet ein Abgleich zwischen der gerade befüllten Tabelle und einer Stammtabelle statt, bei der verschiedene Kriterien abgeglichen werden.

Der Bearbeiter bekommt Abweichungen angezeigt, kann diese korrigieren bzw. die neuer Werte in die Stammtabelle übernehmen, und erhält am Ende wieder eine valide formatierte BatchInput-Datei zurück.

Funktioinert auch alles wunderbar.

Bei einer Datei mit 2.459 Zeilen dauert das Zerlegen und in die Tabelle schreiben zwischen 6 und 7 Sekunden. Und das ist noch eine der kleineren Dateien, 'normale' liegen bei um die 5.000 Zeilen.

Meine Frage ist, ob jemand einen Tip hat, wie ich die Verarbeitung performanter gestalten kann.

Hier mein Code:

  
$query  = "TRUNCATE TABLE  "  
         ."  table_name ";  
$result = sqlsrv_query( $this->DB_Connector, $query );  
echo $this->db_error( $result , $query );  
  
$datei_daten = file( $this->datei_path.$this->datei_name );  
  
foreach ( $datei_daten as $nr => $zeile )  
{  
  $A =               substr( $zeile ,   '0' ,  '8' );  
  $B =        ltrim( substr( $zeile ,   '8' , '10' ) , '0' );  
  $C =        ltrim( substr( $zeile ,  '18' , '12' ) , '0' );  
  $D =        ltrim( substr( $zeile ,  '30' , '10' ) , '0' );  
  $E =        ltrim( substr( $zeile ,  '40' , '12' ) , '0' );  
  $F =        ltrim( substr( $zeile ,  '52' , '10' ) , '0' );  
  $G = strtr( ltrim( substr( $zeile ,  '62' , '15' ) , '0' ) , ',' , '.' );  
  $H =         trim( substr( $zeile ,  '77' , ' 1' )       );  
  $I =        rtrim( substr( $zeile ,  '79' ,  '9' ) , ' ' );  
  $J =         trim( substr( $zeile ,  '88' , '10' )       );  
  $K =         trim( substr( $zeile ,  '99' , '20' )       );  
  $L =         trim( substr( $zeile , '120' ,  '8' )       );  
  $M =         trim( substr( $zeile , '128' , '20' )       );  
  
  $query  = "INSERT INTO  "  
           ."  table_name "  
           ."  (          "  
           ."    id,      "  
           ."    FieldA,  "  
           ."    FieldB,  "  
           [...]  
           ."    FieldM   "  
           ."  )          "  
           ."VALUES       "  
           ."  (          "  
           ."    '$nr',   "  
           ."    '$A',    "  
           ."    '$B',    "  
           [...]  
           ."    '$M'     "  
           ."  )          ";  
  $result = sqlsrv_query( $this->DB_Connector, $query );  
  echo $this->db_error( $result , $query );  
}  

Bin für jeden Tip dankbar.

Gruß