PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : in csv-datei schreiben


exweised
22.06.2004, 13:35:07
hallo,
ich habe eine csv-datei. diese lasse ich ausgeben, etc. und funktioniert auch alles. in dieser datei gibt es zwei spalten, die mit komma getrennt sind. in der ersten spalte steht eine zahl, in der zweiten bestimmte wörter.

ich habe jetzt das problem, dass ich in dieser datei die kleinste zahl suchen möchte und ggf. durch eine andere eintragung ersetzen lassen möchte. leider weis ich nicht, wie ich das anstellen soll.

ich lese den inhalt in das array $data, aber jetzt komm ich nicht weiter.

$fp = @fopen($datei, "r+");
if($fp == false) {
echo "Fehler! Keine Liste gefunden.n";
} else {
while(!feof($fp)) {
$data[] = fgetcsv($fp, 62);
}

// hier muss ich den kleinsten wert suchen lassen
// und durch einen anderen ersetzen lassen,
// sollte die zahl größer sein als die kleinste in der liste stehende

}
}
@fclose($fp);

tapferesschneid
22.06.2004, 17:23:49
<?php
$fp = @fopen($datei, 'r');
if(!$fp)
echo 'Fehler! Keine Liste gefunden.'."n";

else
{
while(!feof($fp))
$data[] = fgetcsv($fp, 1024);

fclose($fp);

array_pop($data);

// hier muss ich den kleinsten wert suchen lassen
array_multisort($data);

// und durch einen anderen ersetzen lassen,
// sollte die zahl größer sein als die kleinste in der liste stehende
if ($data[0][0] < $zahl)
{
$data[0][0] = $zahl;

foreach ($data AS $val)
$str .= $val[0].',"'.$val[1].'"'."n";

if ($fp = @fopen($datei, 'w'));
{
fputs($fp, $str);
fclose($fp);
}
}

}
?>

exweised
22.06.2004, 17:58:34
hallo,
erst mal danke, dass du mir helfen willst. ;) leider passiert bei deinem code nix. er schreibt nicht in die datei. :(

mir ist aber noch eingefallen, dass ich vergessen habe etwas zu erwähnen. also, die datei sieht ja ungefair so aus:

1234,blabla
42,huhu
9222,mähh
131,hallo
.
.
.

jetzt besteht die möglichkeit, dass ein neuer eintrag hinzu kommt. wenn dem so ist, soll er nur in der datei geschrieben werden, wenn er größer als die kleinste vorhandene zahl ist. ist die zahl größer, soll die kleinste zeile einfach gelöscht werden und mit den neuen daten ersetzt werden.
das ganze läuft in der funktion:

function update($datei, $punkte, $wort) {

}

tapferesschneid
22.06.2004, 20:44:21
Ach so ... schon mal überlegt, die ganze Arbeit von MySQL machen zu lassen oder brauchst Du diese CSV-Datei?

<?php

function update ($datei, $punkte, $wort)
{
$fp = @fopen($datei, 'r');
if(!$fp)
{
echo 'Fehler! Keine Liste gefunden.'."n";
return;
}

while(!feof($fp))
$data[] = fgetcsv($fp, 1024);

fclose($fp);

// je nach Quelldatei gibt's manchmal kein leeres letztes
if (!$data[count($data)-1][0]) array_pop($data);

// hier muss ich den kleinsten wert suchen lassen
array_multisort($data);

// und durch einen anderen ersetzen lassen,
// sollte die zahl größer sein als die kleinste in der liste stehende
if ($punkte > $data[0][0])
{
$data['neu'][0] = $punkte;
$data['neu'][1] = $wort;
}

else
{
$data[0][0] = $punkte;
$data[0][1] = $wort;
}


foreach ($data AS $val)
$str .= $val[0].',"'.$val[1].'"'."n";

if ($fp = @fopen($datei, 'w'));
{
fputs($fp, $str);
fclose($fp);
}
return $str;
}
?>

exweised
22.06.2004, 21:35:55
also, in die datei wird jetzt schon mal geschrieben. leider fügt er mir leerzeilen mit ein, die das aussehen der tabelle verhaut. zudem ersetzt er immer irgend einen wert. gebe ich eine höheren wert ein , als der kleinste der vorhanden ist, wird irgendein beliebiger gelöscht und dieser eingetragen. trage ich einen kleineren wert ein und schicke das formular ab, trägt er ihn trotzdem in die datei ein, obwohl er das ja gar nicht soll. ach mist ... :( hänge schon tage daran und komm einfach nicht weiter.

mysql geht nicht, da die datei auch manuell bearbeitet werden soll/kann.

tapferesschneid
23.06.2004, 09:16:11
Mmh, also bei mir macht das Skript genau das, was ich Deiner Beschreibung entnehmen konnte.

Aus Deiner

1234,blabla
42,huhu
9222,mähh
131,hallo

wird nach Aufruf von update('datei', 4, 'Schnabel');

4,"Schnabel"
131,"hallo"
1234,"blabla"
9222,"mähh"

nach update('datei', 600, 'Schnabel');

42,"huhu"
131,"hallo"
1234,"blabla"
9222,"mähh"
600,"Schnabel"

exweised
23.06.2004, 11:16:33
ne, nich ganz. also, ich habe sagen wir 4 einträge in der datei. dann sollen da auch nie mehr als 4 einträge vorhanden sein. hätte ich 20 einträge drin, sollten halt nie mehr als 20 einträge vorhanden sein.

es soll so funktionieren:

datei besteht so:

32,blabla
200,huhu
123,hallo
923,guckguck

sieht jetzt die funktion so aus:

update($datei, 7, hans)

wird nix eingetragen, denn die 7 ist ja kleiner als die z.Z. kleinste vorhandene zahl 32.

würde die funktion so sein:

update($datei, 32, mähh)

würde auch nix eingetragen werden, weil die 32 schon existiert.

würde aber die funktion so aussehen:

update($datei, 333, jippy)

dann würde die 32 mit dem wort einfach gelöscht und stattdessen der eintrag 333,jippy hinzugefügt werden.

die datei sieht dann so aus:

333,jippy
200,huhu
123,hallo
923,guckguck

würde jetzt ne funktion:

update($datei, 120, aha)

kommen, würde nix in die datei geschrieben werden, denn der kleinste wert ist ja jetzt 123. würde aber ein größerer kommen, würde dieser ersetzt werden.

tapferesschneid
23.06.2004, 12:24:41
Also lies Dir nochmal Deine Sätze durch:

jetzt besteht die möglichkeit, dass ein neuer eintrag hinzu kommt. wenn dem so ist, soll er nur in der datei geschrieben werden, wenn er größer als die kleinste vorhandene zahl ist. ist die zahl größer, soll die kleinste zeile einfach gelöscht werden und mit den neuen daten ersetzt werden.


Aber es geht auch anders:

<?php

function update ($datei, $punkte, $wort)
{
$fp = @fopen($datei, 'r');
if(!$fp)
{
echo 'Fehler! Keine Liste gefunden.'."n";
return;
}

while(!feof($fp))
$data[] = fgetcsv($fp, 1024);

fclose($fp);

// je nach Quelldatei gibt's manchmal kein leeres letztes
if (!$data[count($data)-1][0]) array_pop($data);

// hier muss ich den kleinsten wert suchen lassen
array_multisort($data);

// und durch einen anderen ersetzen lassen,
// sollte die zahl größer sein als die kleinste in der liste stehende
if ($punkte <= $data[0][0])
return;

$data[0][0] = $punkte;
$data[0][1] = $wort;

foreach ($data AS $val)
$str .= $val[0].',"'.$val[1].'"'."n";

if ($fp = @fopen($datei, 'w'));
{
fputs($fp, $str);
fclose($fp);
}
return $str;
}
?>

exweised
23.06.2004, 13:02:43
super, so funktionierts schon mal ;-) aber 2 sachen musst du mir mal erklären, die verstehe ich nicht ganz.

was macht das hier genau?
// je nach Quelldatei gibt's manchmal kein leeres letztes
if (!$data[count($data)-1][0]) array_pop($data);

und warum steht das datei öffnen und schreiben in einer if-anweisung?
if ($fp = @fopen($datei, 'w'));
{
fputs($fp, $str);
fclose($fp);
}

dann noch eine letzte frage. kann man beim in die datei schreiben irgendwie verhindern, dass er keine leerzeile ans ende macht? denn ich habe am ende dadurch eine leere tabellenzeile.

trotzdem schon mal danke. ;-) bin schon meinem ziel ganz nah gekommen.

exweised
23.06.2004, 14:23:27
hab das mit der leerzeile gelöst, per

$str = chop($str);

wenn du mir diese 2 codezeilen einen beitrag vor diesem hier noch ein wenig erläuterst, sind wir schon fertig. ;)

tapferesschneid
23.06.2004, 14:44:45
was macht das hier genau?
// je nach Quelldatei gibt's manchmal kein leeres letztes
if (!$data[count($data)-1][0]) array_pop($data);


Genau damit verhindere ich die letzte leere Zeile. Wenn im letzten $data[0] nix steht, lösche ich den Eintrag.


und warum steht das datei öffnen und schreiben in einer if-anweisung?
if ($fp = @fopen($datei, 'w'));
{
fputs($fp, $str);
fclose($fp);
}


Analog zum ersten Öffnen werden damit Fehlermeldungen unterdrückt. Man sollte aber davon ausgehen, daß das erneute Öffnen klappt, wenn es Bruchteile von Sekunden vorher auch ging ;-)



dann noch eine letzte frage. kann man beim in die datei schreiben irgendwie verhindern, dass er keine leerzeile ans ende macht? denn ich habe am ende dadurch eine leere tabellenzeile.


Dazu braucht es eine Zeile mehr:

foreach ($data AS $val)
$str .= $val[0].',"'.$val[1].'"'."n";


// NEU:
$str = substr($str, 0, -1);

exweised
23.06.2004, 15:02:44
alles klar. vielen dank für alles. läuft alles problemlos. ;)