INSERT INTO - mit bedingungen?

Bendzo

Grünschnabel
Hallo!
Ich arbeite an einem script das mir ein csv file in mysql importiert, soweit so gut...
das importieren funktioniert, einziges problem ist, die spalten sind manchmal im csv file durcheinander, weil ein feld fehlt also z.B.

das ist ein test //dann ist das unten zb so
das ist test

somit stimmt der spaltenname nicht mehr!

jetzt meine frage ob ich eine bedingung machen kann wie z.b.
wenn vor einem feld MAC:"inhalt" steht das er das "mac" erkennt und alles was danach steht in die spalte mit dem namen Mac schreibt!

mein script:
PHP:
$offen = fopen ($datei,"r");				//datei wird geöffnet
while ($zeile = fgetcsv ($offen, 1000, ";")) { //der delimiter wird festgelegt
    $query = "INSERT INTO form(name, type, description, mac, ishare, user, scope, pclang, pctype, company)
	VALUES('".$zeile[0]."', '".$zeile[1]."', '".$zeile[2]."', '".$zeile[3]."'
	,'".$zeile[4]."', '".$zeile[5]."', '".$zeile[6]."', '".$zeile[7]."'
	, '".$zeile[8]."', '".$zeile[9]."')"; //die arrays werden in die tabelle eingefügt
    $result = mysql_query($query) or die("Ungültiges query: " . mysql_error().__LINE__.__FILE__); //falls nicht erfolgreich, fehlermedlung wird ausgegeben
    
	
	}
fclose($offen); //datei wird geschlossen

hoffe ihr könnt mir helfen!
 
Das die Spalten im CSV durcheinander sind, dürfte eigentlich bei einem guten CSV nicht passieren. Dann sollte eben ",inhalt,,inhalt" da stehen, also zwischen den "," müsste nichts stehen und die spalten wären leer. Zeig doch mal 1-2 Zeilen von deinem CSV wo das Problem auftritt, bitte.
 
natürlich, hab einiges zensieren müssen, sind computerdaten meiner firma.
wie man sieht die ersten drei zeilen sind ohne probleme geordnet, beim letzten kommts durcheinander, öfters kommts auch deswegen in einer zeile durcheinander wenn ein teil fehlt und alles andere dann nachrückt.
VIEDXXXX;Computer;OS:XP;MAC:00047696XXXX;ISHARE:\\XXXXXS511\STDAPPS;USER:VIECXXXX;SCOPE:ADM#SR;PCTYPE:DESKTOP;PCLANG:EN;COMPANY:XXXXX-AT;
VIEDxxxx;Computer;OS:XP;MAC:000102B4XXXX;ISHARE:\\XXXXXS511\STDAPPS;USER:VIEEXXXX;SCOPE:ADM#SR;PCTYPE:DESKTOP;PCLANG:EN;COMPANY:XXXXX-AT;
VIEDXXXX;Computer;OS:XP;MAC:000102AFXXXX;ISHARE:\\XXXXXS511\STDAPPS;USER:VIEHXXXX;SCOPE:ADM#SR;PCTYPE:DESKTOP;PCLANG:EN;COMPANY:XXXXXX-AT;
VIEDXXXX;Computer;OS:XP;MAC:00047615XXXX;COMPANY:XXXXX-AT;ISHARE:\\XXXXXS511\STDAPPS;USER:VIEANXXX;SCOPE:ADM#SR;PCTYPE:DESKTOP;PCLANG:EN;

am csv kann man nix ändern dass muss so bleiben, ich muss irgendwie bedingungen einbauen damit ein feld in die richtige spalte geschrieben wird!
ahja, das csv file hat über 300 datensätze, tendenz steigend...
 
Zuletzt bearbeitet:
Wenn ich das richtig sehe, hast du zumindestens bei ein paar die möglichkeit was abzufangen. Trenne einfach die Zeilen nach Computer; immer am : dann hast du ja was in der Zeile steht und kannst den ersten part als Key nehmen. Dann noch ein paar if-schleifen um zu sehen welcher Key wo steht und there you go.

$aArray = explode(":", $sString) sollte völlig reichen. Wenn count($aArray)==1, hast du ein Feld ohne Key, wenn du mehr als einen Eintrag hast, hast du Key und Wert.

Verstanden?
 
na das ist doch schonmal was!
ja verstanden hab ichs, umsetzen wird ein bisschen schwierig da ich nicht so der profi bin, ich les mich halt wo durch...

thx für den lösungsansatz!
 
ich hab mal da was gemacht, aber ich weis nicht wie ich festlegen soll was key ist und was wert bzw. das er weiss das mac: 000blabla zusammengehört.

ein kleiner schnipsel:

PHP:
$offen = fopen ($datei,"r");				//datei wird geöffnet
while ($zeile = fgetcsv ($offen, 1000, ";")) { //der delimiter wird festgelegt
	
	$inhalt = fread($offen, 1000);
	$teil = explode(":",$inhalt); //trennt alles voneinander wo ein ":" steht
	echo $teil[1];

Ausgabe ist das hier
MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP;MACXP

sprich wie kann ich festlegen "alles das vor ":" steht ist schlüssel, alles danach wert"?

LG
B.P.
 
Zuletzt bearbeitet:
Ich bin nicht wirklich weitergekommen, möchte nicht glauben das keiner eine Lösung weiss, ich brauch doch nur einen Befehl oder so mit dem ich definieren kann das alles was vor dem : steht ein key ist und alles danach ein value (wert).

lg
B.P.
 
Ist nur ein hingerotzter Block .. hoffe du kannst damit was anfangen
PHP:
foreach($a as $b) {
	$line	= explode(";", $b);
	echo "<br> Zeile: <hr>";
	foreach($line as $c) {
		$column	= explode(":", $c);
		$key	= $column[0];
		$value	= $column[1];
		
		echo "$key - $value <br>";
	}
}
 
Zurück