String zerlegen und in Datenbank speichern
Olli1967
- php
Guten Morgen,
ich versuche gerade einen String in seine Bestandteile zu zerlegen und in die Datenbank zu schreiben. Der String sieht wie folgt aus:
Fr,12.06.2009,06,28,24,875,SPS12 ,S->,MFR1SA12LI010908568807VBBEC ********************
Fr,12.06.2009,06,28,25,062,SPS12 ,<-E,SA12MFR1LU011207220535AB02**********************
Fr,12.06.2009,06,28,25,312,SPS12 ,<-E,SA12MFR1LQ011007220646**************************
Fr,12.06.2009,06,28,25,406,SPS12 ,<-E,SA12MFR1LT011007220646**************************
Fr,12.06.2009,06,28,26,093,SPS12 ,<-E,SA12MFR1LQ011107220538**************************
Fr,12.06.2009,06,28,26,109,SPS12 ,<-E,SA12MFR1LU011007220645AB02**********************
Fr,12.06.2009,06,28,26,140,SPS12 ,S->,MFR1SA12LI011107220538****C ********************
bisher habe ich es geschafft alles was "," getrennt ist zu zerlegen und mit folgendem Script in die Datenbank zu schreiben:
<?php
error_reporting(E_ALL);
function daten_import($source)
{
$source = fopen($source, "rb");
$db = mysqli_connect("localhost","root","start","","3306") or die("Keine Verbindung zur Datenbank!");
$ergebnis=mysqli_query($db, $sql);
$i=0;
if ($source)
{
while (false !== (!feof($source)))
{
$ipteiler = fgets($source);
list($t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9) = explode(",", $ipteiler);
$ins = ("replace into telegramme.`test`
values('".$t1."','".$t2."','".$t3.":".$t4.":".$t5.":".$t6."','".$t7."','".$t8."','".$t9."');");
$i++;
echo ".";
$ergebnis=mysqli_query($db, $ins);
//$muell_loeschen=("delete from telegramme.`daten` where richtung not like 'S->' and richtung not like '<-E'");
//$ergebnis=mysqli_query($db, $muell_loeschen);
}
}
else
{
fclose($source);
return false;
}
echo "fertig! von $source wurden $i Zeilen in die Datenbank geschoben<br>";
fclose($source);
return true;
}
// Hier ist das Script durchgelaufen
$_filenames = glob('G:\xampp\htdocs\Kartonwege\Test\*.csv');
if (is_array($_filenames)) ## es würde auch reichen "if ($filenames)", aber das ist schmuddleig
{
foreach($_filenames as $source)
{
$ready = daten_import($source);
if ($ready)
{
rename("$source","$source.sav");
echo "$source wurde fehlerfrei eingelesen<br>";
}
else
{
echo "<p>$source konnte nicht fehlerfrei eingelesen werden!</p>";
}
}
}
?>
was ich jetzt nicht hin bekomme ist, den letzten String "$9" der immer genau 48 Zeichen lang ist, an bestimmten stellen weiter zu zerlegen.
Für ein wenig Hilfe würde ich mich tierisch freuen.
Gruß aus Bremen
Olaf
Hi,
was ich jetzt nicht hin bekomme ist, den letzten String "$9" der immer genau 48 Zeichen lang ist, an bestimmten stellen weiter zu zerlegen.
Für ein wenig Hilfe würde ich mich tierisch freuen.
was hast Du versucht, und woran ist es gescheitert?
Cheatah
Hi,
»» was ich jetzt nicht hin bekomme ist, den letzten String "$9" der immer genau 48 Zeichen lang ist, an bestimmten stellen weiter zu zerlegen.
»» Für ein wenig Hilfe würde ich mich tierisch freuen.was hast Du versucht, und woran ist es gescheitert?
Cheatah
Moin,
bin gerade dabei in der Materie PHP einzusteigen und kenne mich in der Sprache noch nicht so aus. Zeichenketten mit "str_replace" zerlegen bekomme ich auch hin aber Details wie in meinen Problem beschrieben da fehlt mir der Ansatz.
Olaf
bin gerade dabei in der Materie PHP einzusteigen und kenne mich in der Sprache noch nicht so aus. Zeichenketten mit "str_replace" zerlegen bekomme ich auch hin aber Details wie in meinen Problem beschrieben da fehlt mir der Ansatz.
Du solltest vieleicht sagen, was du aus dem String haben möchtest?
Stehen diese Zeichen immer an der selben Stelle oder beginnen sie mit einem bestimmten Zeichen?
»» bin gerade dabei in der Materie PHP einzusteigen und kenne mich in der Sprache noch nicht so aus. Zeichenketten mit "str_replace" zerlegen bekomme ich auch hin aber Details wie in meinen Problem beschrieben da fehlt mir der Ansatz.
Du solltest vieleicht sagen, was du aus dem String haben möchtest?
Stehen diese Zeichen immer an der selben Stelle oder beginnen sie mit einem bestimmten Zeichen?
Sie stehen schon an der selben Stelle, aber ich habe ein Telegramm was 38 Zeichen lang ist und das andere ist 48 Zeichen lang. Mittlerweile bekomme ich es hin das Telegramm mit substr zu zerlegen aber ich weiss nicht wie man 2 Functionen schaltet anhand der Stringlänge. Z.B.:
MFR1SPV3LI3707546064000001VBBEH ******
substr($var, 12, 8) ergibt 07546064
während ich für das 48er Telegramm
MFR1SA12LI010908525908VBBEC ********************
substr($var, 14, 8) 08525908 brauche.
Also bevor der substr ausgeführt wird müsste festgestellt werden wie lang das Telegramm ist.
Hi,
MFR1SPV3LI3707546064000001VBBEH ******
MFR1SA12LI010908525908VBBEC ********************
so wie es aussieht, möchtest Du alles abgesehen von den Sternchen haben. Dies kannst Du u.a. erreichen, indem Du alle Sternchen durch einen Leerstring ersetzt, oder indem Du den Teilstring vom ersten Zeichen bis vor das erste Sternchen nimmst.
Cheatah
Hi,
»» MFR1SPV3LI3707546064000001VBBEH ******
»» MFR1SA12LI010908525908VBBEC ********************so wie es aussieht, möchtest Du alles abgesehen von den Sternchen haben. Dies kannst Du u.a. erreichen, indem Du alle Sternchen durch einen Leerstring ersetzt, oder indem Du den Teilstring vom ersten Zeichen bis vor das erste Sternchen nimmst.
Cheatah
»»
hi
nein, ich brauche schon alles. Die Positionen von den Daten liegen nur an unterschiedlicher Stelle. Die ersten 10 Stellen vom 38er und 48er Telegramm sind gleich aber die Position wie z.B. VBBE liegt im 38er Telegramm an Stelle 26 während es im 48er an 22ster Stelle steht. Die Information bekomme ich mit substr ganz gut ausgelesen nur welches substr angewendet werden muss lässt sich nur anhand der Länge bestimmen. Und genau das weiß ich nicht wie man das switcht.
Gruß Olaf
Hello,
»» MFR1SPV3LI3707546064000001VBBEH ******
»» MFR1SA12LI010908525908VBBEC ********************so wie es aussieht, möchtest Du alles abgesehen von den Sternchen haben. Dies kannst Du u.a. erreichen, indem Du alle Sternchen durch einen Leerstring ersetzt, oder indem Du den Teilstring vom ersten Zeichen bis vor das erste Sternchen nimmst.
Cheatah
»»hi
nein, ich brauche schon alles. Die Positionen von den Daten liegen nur an unterschiedlicher Stelle. Die ersten 10 Stellen vom 38er und 48er Telegramm sind gleich aber die Position wie z.B. VBBE liegt im 38er Telegramm an Stelle 26 während es im 48er an 22ster Stelle steht. Die Information bekomme ich mit substr ganz gut ausgelesen nur welches substr angewendet werden muss lässt sich nur anhand der Länge bestimmen. Und genau das weiß ich nicht wie man das switcht.
siehe https://forum.selfhtml.org/?t=187732&m=1248463
und http://de3.php.net/manual/en/language.control-structures.php
Mal ganz ehrlich:
Bevor man in einer Programmiersprache anfängt zu schreiben, sollte man sich zumindest einmal die Funktions- und Befehlsreferenz durchgesehen haben, damit man weiß, was es überhaupt gibt in der Sprache. Wie es funktioniert, kann man dann auch noch nachlesen, wenn man es benutzt. Bei Funktionen mir mehr als einem Argument ist das auch für Profis noch angeraten, denn selbst so saubere Sprachen, wie Embarcaresro (Turbo-Pascal) vertauschen manchmal noch die Reihenfolge von einer Funktion zur nächsten. Bei PHP ist das Vertauschen leider Standard -> also immer besser gucken.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Sie stehen schon an der selben Stelle, aber ich habe ein Telegramm was 38 Zeichen lang ist und das andere ist 48 Zeichen lang. Mittlerweile bekomme ich es hin das Telegramm mit substr zu zerlegen aber ich weiss nicht wie man 2 Functionen schaltet anhand der Stringlänge. Z.B.:
MFR1SPV3LI3707546064000001VBBEH ******
substr($var, 12, 8) ergibt 07546064
während ich für das 48er Telegramm
MFR1SA12LI010908525908VBBEC ********************
substr($var, 14, 8) 08525908 brauche.
Sind die Sternchen am Ende tatsächlich Sternchen, oder hast Du die jetzt nur eingesetzt, um Inhalte unkenntlich zu machen? Wenn Du nur die Sternchen weg haben möchtest, kannst Du den String einfach trimmen lassen:
$nutzlast = rtim($telegram,'*');
http://de3.php.net/manual/en/function.rtrim.php
Deine andere Frage lässt erkennen, dass Du bisher noch keine Strukturierte Programmierung betrieben hast. Um das im Eilzugtempo nachzuholen, empfehle ich Dir mal
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
Sind die Sternchen am Ende tatsächlich Sternchen, oder hast Du die jetzt >>nur eingesetzt, um Inhalte unkenntlich zu machen? Wenn Du nur die Sternchen >>weg haben möchtest, kannst Du den String einfach trimmen lassen:
$nutzlast = rtim($telegram,'*');
es sind tatsächlich Sternchen. Es soll auch nichts getrimmt werden, das habe ich schon mit einem Script in der Datenaufbereitung gemacht. Es geht rein darum, wie schalte ich eine Funktion die vorher abfragt ob der Inhalt der Variable 38 oder 48 Stellen hat und dann erst die substr Routinen ausführt.
Deine andere Frage lässt erkennen, dass Du bisher noch keine Strukturierte >>Programmierung betrieben hast. Um das im Eilzugtempo nachzuholen, empfehle >>ich Dir mal
Ich danke für Empfehlungen bezüglich "Strukturierte Programmierung" bin halt am lernen und habe auch eine Menge Schulungsmaterial über PHP & MySQL Zuhaus.
Gruß Olaf
Hello,
Ich danke für Empfehlungen bezüglich "Strukturierte Programmierung" bin halt am lernen und habe auch eine Menge Schulungsmaterial über PHP & MySQL Zuhaus.
Nun, dann solltest Du dir das Kapitel "Kontrollstrukturen" ansehen und im PHP-Manual die Stringfunktionen und -behandlung.
http://de3.php.net/manual/en/language.types.string.php
http://de3.php.net/manual/en/ref.strings.php
Du wirst mit strlen() und "if() elseif() else()" weiterkommen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
was ich jetzt nicht hin bekomme ist, den letzten String "$9" der immer genau 48 Zeichen lang ist, an bestimmten stellen weiter zu zerlegen.
Definiere "bestimmte Stellen".
MfG ChrisB