Text analysieren und in DB schreiben

xxxTargetxxx

Grünschnabel
Hi Community,
erstmal danke, an alle, die mir weiterhelfen können!

Habe eine Textdatei, die ich in eine SQL Datenbank einlesen möchte um einen besseren Zugriff zu erhalten. Habe nur ein Problem mit dem Analysieren der Datei. Nach folgendem Schema ist die Datei gespeichert:

PHP:
 1. Zeile: H......... //wird nicht benötigt
 2. Zeile: Txx.xx.xx     00000     2001Text1      2002Text2
 3. Zeile: Txx.xx.xx     00000     2003Text3      1004Haupttext4
 4. Zeile: H......... //wird nicht benötigt
 5. Zeile: Tyy.yy.yy     00000     3001Text1      3002Text2
 6. Zeile: Tyy.yy.yy     00000     3003Text3      3004Text4
 7. Zeile: Tyy.yy.yy     00000     3005Text5      3006Text6
 8. Zeile: Tyy.yy.yy     00000     1007Haupttext7 0000
 9. Zeile: H......... //wird nicht benötigt
10. Zeile: Tzz.zz.zz     00000     1001Haupttext1 0000
11. Zeile: H......... //wird nicht benötigt
12. Zeile: Txx.yy.zz     00000     3001Text1      3002Text2
13. Zeile: Txx.yy.zz     00000     3003Text3      1004Haupttext4
usw.


Zur Erklärung, die Zeilen werden immer mit H oder T eingeleitet. H ist sogesehen die Überschrift und T der Datensatz, den ich benötige. Die T Zeilen können aber bis zu n-mal vorkommen (siehe 4 Beispiele) und es ist immer ein Haupttext eingeleitet in der letzten T Zeile mit dem Präfix 100X (wobei X die vortlaufende Nummer aus 300X oder 200X ist)

Das Ziel ist es die Daten so zu speichern:
PHP:
Feld ID    Feld bezeichnung1   Feld bezeichnung2
xx.xx.xx     Haupttext4         Text1 + Text2 + Text3
yy.yy.yy     Haupttext7         Text1 + Text2 + Text3 + Text4 + Text5 + Text6
zz.zz.zz     Haupttext1
xx.yy.zz     Haupttext4         Text1 + Text2 + Text3

Hab mir gestern und heute Nacht schon den Kopf zerbrochen, aber mir fehlen hier einfach zu viele logische Denkansätze. Bisher habe ich hiermit etwas ohner Erfolg versucht

PHP:
$fp = fopen("datei.txt","r");

$i = 0;
$j = 0;

while ( $zeile = fgets($fp,1000) ) { 
	$array = file($fp);
	while ($zeichen = fgetc($fp)) {
		if ($zeichen == "H") {
			$i = 0;
			}
		elseif ($zeichen == "T") {
			echo $array[$j]."<br>";
			$i++; 
			}
		}
	$j++;
	}
 
Hi.
Hättest du "SQL" noch ein bisschen spezifiziert (MySQL, MSSQL, SQLite), hätte ich dir auch noch die Funktion geschrieben, die das Array, also die Ausgabe der folgenden Funktion, einlädt. Tja, Pech gehabt.
PHP:
<?php
function komischerParser($datei){
  $zeilen = file($datei);
  $info   = array();
  $last   = array();

  foreach($zeilen as $i => $zeile){
    if($zeile[0] == "H")
      continue;
    
    list(/* ... */, /* ... */, $links, $rechts) = explode(";", preg_replace("/[ ]+/", ";", str_replace(array("\r", "\n"), "", $zeile), 3), 4);
    
    if($links[0] != 1 && $links[0] != 0)
      $last[] = $links;
    
    if($rechts[0] != 1 && $rechts[0] != 0)
      $last[] = $rechts;
    
    if($links[0] == 1){
      $info[substr($zeile, 1, 8)][0] = $links;
      $info[substr($zeile, 1, 8)][1] = $last;
      $last = null;
    }else if($rechts[0] == 1){
      $info[substr($zeile, 1, 8)][0] = $rechts;
      $info[substr($zeile, 1, 8)][1] = $last;
      $last = null;
    }
  }

  return $info;
}
?>
Gibt bei einem Aufruf dein Beispiel folgendermaßen aus (print_r()):
Code:
Array
(
    [xx.xx.xx] => Array
        (
            [0] => 1004Haupttext4
            [1] => Array
                (
                    [0] => 2001Text1
                    [1] => 2002Text2
                    [2] => 2003Text3
                )

        )

    [yy.yy.yy] => Array
        (
            [0] => 1007Haupttext7
            [1] => Array
                (
                    [0] => 3001Text1
                    [1] => 3002Text2
                    [2] => 3003Text3
                    [3] => 3004Text4
                    [4] => 3005Text5
                    [5] => 3006Text6
                )

        )

    [zz.zz.zz] => Array
        (
            [0] => 1001Haupttext1
            [1] =>
        )

    [xx.yy.zz] => Array
        (
            [0] => 1004Haupttext4
            [1] => Array
                (
                    [0] => 3001Text1
                    [1] => 3002Text2
                    [2] => 3003Text3
                )

        )

)
Wenn du selbst damit nicht weiterkommst, dann schreib, was für ein SQL-Datenbankverwaltungssystem du benutzt! :p
 
Guten Morgen,

ich hab eine MYSQL 5 Datenbank.

Von mir noch eine Frage, durch den explode Befehl werden die Sonderzeichen /, + und ; ersetzt, oder sehe ich das falsch?
Was ich vll vergessen habe und evetuell auch wichtig ist, dass die Datei immer eine feste breite hat und der Text Sonderzeichen hat, bis auf das Semikolon.

Würde dich bitten mir den SQL Befehl noch zu schreiben. Bekomm in der Variable immer array zurück. Vll. kann ich dann einen Code auch besser verstehen!!
Danke schonmal
 
Von mir noch eine Frage, durch den explode Befehl werden die Sonderzeichen /, + und ; ersetzt, oder sehe ich das falsch?
Wenn du zu faul bist, dir nur die Referenz anzuschauen, dann bin ich zu faul, dir ein entsprechendes Skript zu machen.
 
Entschuldigung, so war es nicht gemeint, habe die Beschreibung zum Befehl Explode gelesen (Durch explode lasst sich eine Zeichenkette anhand eines Trennzeichens in Teile aufspalten), dennoch tut es mir leid, dass mein Verständnis bis dorthin nicht greift!

Möchte nicht, dass es als betteln aufgefasst wird, bin aber in der Hinsicht zu dumm, dass ich es selber verstehen und realisieren kann! Wenn man mir es erklären könnte, bin ich bemüht es selber zu versuchen - finde aber leider keinen Ansatz!

Wäre die sehr verbunden, wenn du mir dennoch helfen kannst! Bemühe mich immer sehr mit gidf.de nach Lösungen zu suchen - aber hier hab ich leider nichts gefunden...
 
Zurück