Antworten auf deine Fragen:
Neues Thema erstellen

Array - letzes Element 1 Zeichen zu lang?

M

Marotzke

Guest

Hallo!

Ich brauche mal wieder Hilfe, weil ich hier langsam durchdrehe :hmpf:

Ich habe eine CSV-Datei erstellt, deren Daten ich mit PHP einlese und in ein Array speichere. Das klappt auch so weit ganz gut. Allerdings gibt es ein Problem mit dem letzten Element im Array, welches immer ein Zeichen länger ist alles es sein sollte.

Die CSV ist ein Excel-Export, in UTF-8 umgewandelt, und sieht ganz simpel so aus:

Code:
Songtitel 1;dateiname;1;0;0;0
Songtitel 2;dateiname;0;0;1;0
Songtitel 3;dateiname;0;1;0;0
Bis auf den Titel gibt es keine Leerzeichen (hinter den Zeilen) und natürlich keine Zeile zu viel (automatisiert erzwungen durch den PSPad Editor und kontrolliert von mir selbst).

Der PHP-Code sieht so aus:

PHP:
// Datei einlesen
$fileArray = file_get_contents('dateiname.csv');

// Trennzeichen in Kommata umwandeln
$fileArray = str_replace(array(';', '|'), ',', $fileArray);

// nach Zeilenumbrüchen aufteilen
$c = split("\n", $fileArray);

// Array füllen
foreach($c as $val) {

   // Kommata auftrennen
   $c = split(",", $val);

   // Inhalt ins fertige Array schreiben
   $myArray[] = Array('title' => $c[0], 'filename' => $c[1], 'genre1' => $c[2], 'genre2' => $c[3], 'genre3' => $c[4], 'genre4' => $c[5]);
}

// Debug Text
echo strlen($myArray[0]['genre4']).' | ';
echo $myArray[0]['genre4'];
Der Output gibt folgendes heraus:

Code:
2 | 1
Also zwei Zeichen lang, Inhalt ist gleich "1".

Mit "substr" hatte ich bisher auch keine Erfolge, obwohl ich hier auch mal mehrere Kombinationen durchprobiert habe. Das Zeichen verschwindet dann immer.

PHP:
substr($myArray[0], -1, -1);

Weiss jemand einen Rat, warum das Array in der letzten Stelle immer ein verstecktes Zeichen einbindet? :'(
 

stroyer

Aktives Mitglied

AW: Array - letzes Element 1 Zeichen zu lang?

Das erste, was ich mich frage, ist, wieso du zuerst alle ; durch , ersetzt und dann alles nach , splittest; wär nicht leichter gleich beim ; zu bleiben und nur split(";", $val); zu verwenden?
Probier mal, was kommt, wenn du echo "-".$myArray[0]['genre4']."-"; ausgeben lässt; eigenlich sollte dann ja 1|-1- kommen.
Probier weiters mal mit ord() herauszubekommen, um was für ein Zeichen es sich da handelt.
 
M

Marotzke

Guest

AW: Array - letzes Element 1 Zeichen zu lang?

Danke, das teste ich mal, dann mach ich nen Edit an diesen Post hier.

Warum ich die Zeichen alle umwandle, liegt daran, dass verschiedene Programme die CSV unterschiedlich speichern. OpenOffice z.B. bietet da ne ganze Menge an Möglichkeiten für die Trennstriche, also dacht ich mir, ich wandel erstmal alle möglichen in eine Art um und trenne danach. Dann muss man sich nicht an bestimmte Exportformate halten.

EDIT:

Codetabelle Ascii: ASCII Codes - Table of ascii characters and symbols

Ausgabe wie gesagt:

Code:
2 | -1 -

PHP:
$x = $myArray[4]['genre4'];
 echo $x;
 $x = substr($x, 1, 1);
echo ord($x);

In gekürzter Fassung bin ich mal durchgegangen und habe die ASCII Nr. 13 herausbekommen, welche für CR (Carriage Return?) steht.

Nur wie werde ich das wieder los? Gesplittet nach "\n" habe ich ja bereits.
 
Zuletzt bearbeitet von einem Moderator:

sokie

Mod | Web

AW: Array - letzes Element 1 Zeichen zu lang?

ich shätze das liegt an den Zeilenumbrücken nach Windows-art.

der Zeilenumbruch bei Windows ist \n\r.
darum bleibt jeweils das \r übrig, wenn man per "\n" splittet.
man könnte diese Zeichen per trim() entfernen.

viel einfacher wäre es allerdings sich den kompletten Inhalt der csv Datei per while und
fgetcsv() in ein Array zu lesen.

eine zweite ist den Inhalt per file() in ein Array zu bekommen.

happy codeing
 
M

Marotzke

Guest

AW: Array - letzes Element 1 Zeichen zu lang?

Ahh, super danke :)

Na dann schau ich mal nach dieser optimierten Variante.
 

stroyer

Aktives Mitglied

AW: Array - letzes Element 1 Zeichen zu lang?

Die Idee mit dem Zeilenumbruch ist sehr gut. Etwas anderes kann es eigentlich nicht sein.
Der Zeilenumbruch unter Windows ist übrigens \r\n und nicht \n\r (da würde das überflüssige Zeichen ganz am Anfang stehen).
Probier mal ob dies bei allen letzten Elementen auftritt (dh. bei $myArray[$i]['genre4'];)

Aja nochwas: Wenn das so wäre, stimmt das, dass du das Problem nur bei einem Server unter Windows bekommst?
 
Zuletzt bearbeitet:
M

Marotzke

Guest

AW: Array - letzes Element 1 Zeichen zu lang?

Also.... der Zeilenumbruch ist nicht nur "\r" ? Sondern immer in Kombination mit dem "\n"?
Könnte man dann nicht gleich nach der Doppelkombination aufsplitten (teste ich mal)?

Der Server ist Windows XP Prof. SP 3 - eine XAMPP 1.70 Installation, Lokalserver.


EDIT:
Supergeil, es klappt. Habe ganz ganz ganz einfach gemacht und einfach so:
PHP:
$myArray= split("\r\n", $myArray);

Das funktioniert. Die Variante "\n\r" klappte nicht. Aber jetzt gehts und die Stringlänge passt jetzt auch wieder. Tausend dank!
 
Zuletzt bearbeitet von einem Moderator:

stroyer

Aktives Mitglied

AW: Array - letzes Element 1 Zeichen zu lang?

Unter Windows \r\n,
Unter Linux nur \n,
Unter Mac nur \r
Wegen XP: das fehlende \r wird das Problem sein.
Du musst im Script im Prinzip nur mehr $c = split("\n", $fileArray); auf $c = split("\r\n", $fileArray); ändern (Geht dann aber nur mehr unter Windows-Server; am besten nur nach \n splitten und das nicht gefilterte \r einfach von Anfang an im String filtern.
 

sokie

Mod | Web

AW: Array - letzes Element 1 Zeichen zu lang?

Also.... der Zeilenumbruch ist nicht nur "\r" ? Sondern immer in Kombination mit dem "\n"?
Könnte man dann nicht gleich nach der Doppelkombination aufsplitten (teste ich mal)?

Der Server ist Windows XP Prof. SP 3 - eine XAMPP 1.70 Installation, Lokalserver.

das kann man natürlich machen. nur würde das script dann wieder nicht auf zB linuxservern laufen.
besser ist es die komfortablen methoden zu benutzen, bei denen werder das eine noch das andere eine Rolle spielt:
fgetcsv() file() etc.
 

stroyer

Aktives Mitglied

AW: Array - letzes Element 1 Zeichen zu lang?

Oder wie gesagt einfach aus dem String, den Du einliest, \r herausfiltern. (Ich nehme wohl kaum an, dass du das jemals auf einem älteren Mac Os (Bis Version 9) laufen haben willst). Dann erübrigt sich dieses Problem, da auf jeden Fall nur mehr das \n vorhanden ist. ASCII Nr. 13 (=CR) ist im Prinzip das gleiche wie \r
 
M

Marotzke

Guest

AW: Array - letzes Element 1 Zeichen zu lang?

Das "\r" herausfiltern, mache ich das so? :

PHP:
$myArray = str_replace("\r", '', $myArray);
Aber wenn es da umfassende Funktionen gibt, schaue ich mich natürlich nach einer Variante um, die möglichst kurz ist und keiner Änderungen noch Bedarf. Bin da ziemlicher PHP-Neuling, daher weiss ich selten, wonach ich suchen muss, wenn es Probleme gibt.
 

stroyer

Aktives Mitglied

AW: Array - letzes Element 1 Zeichen zu lang?

So müsste es eigentlich ohne Probleme gehen.
Mir persönlich ist fgetcsv zu umständlich (fopen, dann eine passende Länge setzen...); aber auch nur weil ich mich mit Dateifunktionen kaum beschäftigt habe. Schaden tut es auf jeden Fall nicht.

EDIT: Ich hätt ganz am Anfang den String gefiltert, nicht das Array.
 

sokie

Mod | Web

AW: Array - letzes Element 1 Zeichen zu lang?

Das "\r" herausfiltern, mache ich das so? :

PHP:
$myArray = str_replace("\r", '', $myArray);
ja, das wäre so.

hier mal ein Ansatz per fgetcsv() (bietet sich ja an, wenn man schon mit csv Datei arbeitet.)
PHP:
<?php
$csv = "dateiname.csv";
$fp = fopen($csv,"r");
while ($datensatz = fgetcsv($fp,1024,";")){
echo $datensatz[0]."|".$datensatz[1]."|".$datensatz[2]."|".$datensatz[3]."|".$datensatz[4]."|".$datensatz[5]."<br />\n";
}
fclose($fp);
?>
 

stroyer

Aktives Mitglied

AW: Array - letzes Element 1 Zeichen zu lang?

Aber kann es so nicht passieren, dass sich eine Zeile im Buffer nicht ganz ausgeht, sprich sie wird abgeschnitten ausgegeben?
 
M

Marotzke

Guest

AW: Array - letzes Element 1 Zeichen zu lang?

Danke für den Codeschnipsel!

Ich glaube für die Dateilänge setze ich einfach einen sehr hohen Wert ein, damit nichts schief geht. Oder gibt es hierfür auch eine Funktion, die ermittelt, wie lang die Datei ist (vllt. einfach erstmal so einlesen und mit length, dann Länge übergeben?) ?

Sobald ich ein Backend programmiert habe, fliegt die CSV sowieso komplett raus und alles geht über die Datenbank, weil man Excel oder Office braucht und die Codierung nur Probleme macht. Aber schaden kann das Wissen nicht.
 

stroyer

Aktives Mitglied

AW: Array - letzes Element 1 Zeichen zu lang?

Auf die Idee hätt ich auch kommen können: filesize($filename); gibt die Dateigröße zurück.
 

sokie

Mod | Web

AW: Array - letzes Element 1 Zeichen zu lang?

der Wert für length gibt die länge der längsten Zeile an. Das hat mit der filesize() nichts zu tun.
PHP: fgetcsv - Manual

man kann ihn aber so hoch setzen, wie man ihn braucht.
 

stroyer

Aktives Mitglied

AW: Array - letzes Element 1 Zeichen zu lang?

Ich habe gemeint, dass man ja die Länge der Längsten Zeile nicht weiß.
Sie kann aber nur maximal so lang sein, wie lang die Datei ist. (zugegebenermaßen etwas unprofessionell)
 

Christian

verpeilt & verschallert

AW: Array - letzes Element 1 Zeichen zu lang?

Ich habe gemeint, dass man ja die Länge der Längsten Zeile nicht weiß.
Sie kann aber nur maximal so lang sein, wie lang die Datei ist. (zugegebenermaßen etwas unprofessionell)
Ist aber bei Dateien, wo die Inhaltslänge einer Zeile nicht bekannt ist, meiner Meinung nach, die sinnvollste Methode, da wie schon angemerkt, die Maximallänge eben max. der Dateigröße entsprechen kann und die Funktion fopen ohnehin nur nach Linefeeds liest.
Der Dateiinhalt kann ohnehin sehr stark variieren, wenn man zB HTML-Vorlagen in einer CSV transportiert, ist eine neue CSV-Zeile nicht gleich jedem Linefeed, da ( \r, \r\n ) auch in einer CSV-Spalte nicht maskiert werden.
Kurzum: fgetcsv( $fileHandle, filesize( $fileName ), ';', '"'); halte ich für die sinnvollste Anwendung, es sei denn Du bist dir sicher, dass Du eine Maximallänge für eine Zeile (zb: 4096 Zeichen ) festlegen kannst.
 
M

Marotzke

Guest

AW: Array - letzes Element 1 Zeichen zu lang?

Ok mach ich es wirklich so, auch wenn mir die fixe Angabe einer Länge und Größe überhaupt nicht zusagt und mich an meine alten Dos/C++ Zeiten mit Dateien erinnert... grml. Lieber wärs mir, Datei reinknallen und das Script läuft bis es am EOF ankommt, fertig aus. Nungut man kann nicht alles haben.

Ich hoffe ich red grad keinen Stuss.

Edit @stroyer
Achso dann hat man damit auch keinen anderen Vorteil? Ok. Nun das überzeugt mich endgültig vom komplizierteren aber anscheinend besseren Weg.

Danke nochmal an alle für die Tipps. Jetzt schau ich mal auf php.net weiter.
 
Zuletzt bearbeitet von einem Moderator:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.633
Beiträge
1.538.446
Mitglieder
67.555
Neuestes Mitglied
scheflo
Oben