.csv Datei aulesen Ausgabe mit einem Array
Brainkeks
- php
Hallo PhP-Forum,
da ich schon eine längere Zeit am grübeln bin, frage ich euch.
Ich selbst fange Grade an PhP für mich zu entdecken doch jetzt habe ich ein Problem.
Dieses besteht darin, dass ich aus einer Datei namens abcd.csv Zeilen und Spalten auslesen möchte und in ein Dreidimensionales-Array speichern will(dies soll als Funktion geschehen da diese noch öfter verwendet wird).
Die abcd.csv enthält Daten wie z.B:
jahr;author;titel;seitenanzahl...
1991;hans;froeliches-schaffen;125
nach der Speicherung in ein Array, möchte ich dieses natürlich auch wieder ausgeben lassen. Das mit dem Ausgeben klappt soweit, gar nicht mal so schlecht, aber nur dann, wenn ich die function entferne und die Ausgabe mit in den Bereich zum Auslesen stecke. Daher meine Frage lässt sich dies auch anders lösen?
hier der Codeschnipsel:
<?php
function fkt_hohleDaten()
{
$daten = file('abcd.csv');
$zeilen = count($daten);
for ($c=0; $c<$zeilen; $c++)
{
$datensatz = explode (";", $daten[$c]);
}
}
fkt_hohleDaten();
echo '<pre>';
print_r ($datensatz);
echo '</pre>';
?>
MfG
Brainkeks
Ich versteh' deine Frage zwar nicht und warum du eine zweidimensionale Datenstruktur in eine dreidimensionale Transportieren willst, aber du könntest dir zumindest fgetcsv() ansehen.
Ich versteh' deine Frage zwar nicht und warum du eine zweidimensionale Datenstruktur in eine dreidimensionale Transportieren willst, aber du könntest dir zumindest fgetcsv() ansehen.
Die Ausgabe mit meinem Script ergibt folgendes
Array
(
[0] => 200901 (monat)
[1] => 27000503 (ID)
[2] => 34378 (gefahrene_km)
...
)
und haben somit eine eindeutige Zuordnung mit der ich diese wieder aufrufen könnte.
mit fgetcsv() werde ich mich auseinandersetzen. Danke für den Hinweis.
MfG
Brainkeks
Ahoi,
nuttze fgetcsv und Alternative Syntax:
$fh = fopen ("abc.csv");
while ($rows[] = fgetcsv($fh)) {
}
// vielleicht noch schließen
// im php/html-dokument dann:
<?php foreach $rows as $row?>
<tr>
<?php foreach $row as $cell?>
<td><?php echo $cell;?></td>
<?php endforeach?>
</tr>
<?php endforeach?>
ungetestet.
Dank und Gruß,
Hello,
Die abcd.csv enthält Daten wie z.B:
jahr;author;titel;seitenanzahl...
1991;hans;froeliches-schaffen;125nach der Speicherung in ein Array, möchte ich dieses natürlich auch wieder ausgeben lassen. Das mit dem Ausgeben klappt soweit, gar nicht mal so schlecht, aber nur dann, wenn ich die function entferne und die Ausgabe mit in den Bereich zum Auslesen stecke. Daher meine Frage lässt sich dies auch anders lösen?
hier der Codeschnipsel:
<?php
function fkt_hohleDaten()
{
$daten = file('abcd.csv');
$zeilen = count($daten);
for ($c=0; $c<$zeilen; $c++)
{
$datensatz = explode (";", $daten[$c]);
}
}
function holeDaten($filename, &$_buffer, $maxrecsize=4098)
{
$fh = fopen($filename,'r'); ## Datei zum lesen öffnen
if (!$fh) { return 5 }; ## Datei konnte nicht geöffnet werden
if (!flock($fh, LOCK_SH) ## Datei sperren, um ungestört LESEN zu können [1]
{ ## Sperre hat nicht geklappt,
fclose($fh); ## Datei daher wieder schließen
return 8; ## Datei konnte nicht gesperrt werden, Funktion abbrechen
}
$_rec = array(); ## einen leeren Buffer für einen Datensatz bereitstellen
## ganze Datei auslesen solange das Lesen erfolgreich ist
while ($false !==($rec = fgetcsv($fh, $maxrecsize, ';', '"'))
{
$_buffer[] = $_rec;
}
fclose($fh); ## Datei schließen und Sperrung aufheben.
return 0; ## kein Fehler aufgetreten
}
fkt_hohleDaten();
echo '<pre>';
print_r ($datensatz);
echo '</pre>';
$_buffer = array(); ## leeren Buffer für dire Daten bereitstellen
$err_hd = holeDaten('abcd.csv',$_buffer); ## Leeren Buffer
## und Dateinamen an holeDaten() übergeben
if ($err_hd == 0)
{
echo "<pre>\r\n";
echo htmlspecialchars(print_r($_buffer,1));
echo "</pre>\r\n";
}
else
{
echo "<p>Fehler beim Lesen von <strong>".htmlspecialchars($filename).": $err_hd <p>\r\n";
}
So ungefähr würde ich mir das vorstellen.
Die Funktion bekommt den Namen der Datei und einen (leeren) Buffer für die Daten übergeben. Dieser Buffer muss ein Array sein. Das wird in der Funktion nicht geprüft! Ein Prüfung kann man aber auch noch einbauen, wenn man sich selber nicht traut ;-)
Es wird versucht, die datei zu öffnen. Wenn dies fehlschlägt, wird die Funktion verlassen und der Buffer bliebt unverändert. Die Fehlernummer, die die Funktion zurückgibt, gibt aufschluss darüber, warum die Funktion verlassen wurde.
Als nächstes wird geprüft, ob die Datei gerade bearbeitet wird, oder ob sie noch zum Lesen sperrbar ist. Solange Du im gesamten Vorgang nur Informationen lesen willst, reicht ein LOCK_SH (Lesesperre). Diese Sperre verhindert, dass während jemand liest (beliebig viele Teilnehmer) jemand anderes (nur ein einzelner kann das zur Zeit) Daten in der Datei verändert.
Wenn das klappt, wir in einer Schleife solange CSV-Format ausgelesen, wie die Datei lesbar ist.
[1] wenn man eine Datei mit LOCK_SH öffent, um sie auszulesen, darf man ohne weitere Maßnahmen später keine Änderungen in ihr vornehmen, auch wenn man dann später LOCK_EX benutzen würde. Schau Dir hierzu den Artikel con Chsritian Seiler an, der viele Grundlagen dazu vermittelt.
[link:http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/]
?>
>
> MfG
> Brainkeks
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Hello,
einige wichtige Sätze habe ich eben vergessen:
Wenn Du möchtest, dass eine Funktion auch wirklich funktional, also wiederverwendbar, abrbeitet, dann musst Du sie so aufbauen, dass sie immer das Gleiche macht, aber mit unterschiedlichen Rahmenbedingungen. Die Rahmenbedingungen übergibst Du der Funktion als Argumente in den Klammern.
In Deinem Fall sind das der Dateiname der CSV-Datei und das Array, in dem die Daten abzulegen sind.
Die Übergabe des Arrays für das Ergebnis als Argument stellt hier sogar schon wieder einen Spezialfall dar. Du sieht, dass vor der Variable ein '&' steht. Das bedeutet, dass diese Variable nicht nur an die Funktion übergeben wird, sondern von ihr auch verändert werden darf.
In der klassischen Programmierung würde dies bedeuten, dass durch $variable nur die Adresse einer Kopie der Variable an die Funktion übergeben wird, mit der sie machen kann, was sie will, ohne das Original zu verändern. Bei Übergabe von '&$variable' würde der Funktion jedoch die Adresse des Originals übergeben werden. Wenn sie darin herumändert, ist das Original verändert, also in Deinem Fall $_buffer mit Werten gefüllt.
Der eigentliche Rückgabewert der Funktion wird mit 'return' zurückgegeben. Auch diese darf in PHP ein Array sein!
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg