[PHP] erst .gz-Datei entpacken, dann diese Datei aufnehmen und darstellen

BartTheDevil89

Devilution Media
ID: 87739
L
2 Mai 2006
3.960
103
Hallo,

ich habe diesmal ein etwas schwieriges Problem, wo ich nicht wirklich weiterkomme:

Ich bekomme per URL einen .gz-gepackte-Datei. Diese Datei möchte ich jetzt entpacken und in diesem Paket muss genau 1 Datei drin sein! Diese Datei möchte ich jetzt auslesen und den Inhalt per echo darstellen!

Klingt ja eigentlich ganz einfach, aber leider komm ich damit nicht weiter.

Danke für eure Hilfe :roll:
 
Einfach mit gzopen öffnen und dann mit mit fgets auslesen...

Hallo,

hab es jetzt mal so versucht:

Code:
$file = gzopen("https://domain.de/tar.gz", "r");
$file = fgets("$file");
echo "File ist jetzt $file an dieser Stelle";
Allerdings läuft es so nicht, was mir auch verständlich ist. Denn muss ich fgets nicht erstmal den file zuweisen, der aus dem gzopen kommt?
 
Die Resource zum String konvertieren und damit das Handle der Datei zu überschreiben, is wohl ned besonders clever ;)

PHP:
$fp = gzopen("file.gz", "r");
$data = fgets($fp);
gzclose($fp);

echo $data;
So sagt es zumindest das Manual aus (*gz-Funktionen noch nie benutzt hab*)
 
Code:
$file = gzopen("https://domain.de/tar.gz", "r");
$file = fgets("$file");
echo "File ist jetzt $file an dieser Stelle";
Allerdings läuft es so nicht, was mir auch verständlich ist. Denn muss ich fgets nicht erstmal den file zuweisen, der aus dem gzopen kommt?

Ja ist verständlich, wenn man noch nichtmal mit solchen elementaren Sachen wie Variablen klar kommt, geschweigedenn Fehlermeldungen zu verstehen. So von wegen wir wandeln ein Filehandler in einen String um und übergeben diesen mal an eine Funktion die darauf "is not a valid ressource" ausspuckt.

Und nein du musst fgets gar nichts zuweißen ausser einen Filehandler. In einem .gz Archiv steckt immer nur eine "Datei" und den Inhalt dieser Datei bekommst du mit fgets...

PS: wenn du eine .tar.gz hast (dein Beispiel) ist das nur die hälfte...
 
Die Resource zum String konvertieren und damit das Handle der Datei zu überschreiben, is wohl ned besonders clever ;)

PHP:
$fp = gzopen("file.gz", "r");
$data = fgets($fp);
gzclose($fp);

echo $data;
So sagt es zumindest das Manual aus (*gz-Funktionen noch nie benutzt hab*)

Ah ok...damit kann ich den File entpacken.....aber jetzt kommt erst das schwierige, denn diese Datei ist eine csv-Datei.
Aufgabe des gesamte Scripts soll es sein dieser csv-Datei noch einen Tabellenkopf hinzuzufügen und dann wieder als csv-Datei auszuliefern.

Also beispielsweise ich habe diese CSV-Datei:

1;blub;3
2;bllll;77
3;ölajf;555
4;öjsafjdl;44
....

Jetzt möchte ich nachträglich allerdings noch einen Tabellenkopf einbauen. Also so soll es nachher ausschauen:

id;name;zahl
1;blub;3
2;blll;77
3;.....

Und dann soll es wieder als csv-Datei ausgeliefert werden.....aber jetzt natürlich die Frage: Wie bekomm ich sowas hin? Ich hab schon probiert mit fgetcsv rumprobiert aber irgendwie bekomm ich das nicht hin....kann mir jemand helfen?
 
Jetzt erstmal ganz scharf nachdenken :roll:

Vorher:
Code:
1;blub;3 
2;bllll;77 
3;ölajf;555 
4;öjsafjdl;44
Nachher:
Code:
[COLOR=Red]id;name;zahl [/COLOR]
1;blub;3 
2;bllll;77 
3;ölajf;555 
4;öjsafjdl;44
Was hat sich geändert ? :think: Am Anfang ne Zeile mehr ? Wie wäre es dann mit
  • erst die neue Zeile schreiben und
  • den Rest einfach abschreiben
?
 
aber erstens kommt jetzt aus dem oben genannten Code nur eine Zeile beim echo raus [...]
fgets() liest ja auch nur eine Zeile. Willst du mehr lesen, musst du halt öfters aufrufen oder z.B. fread() benutzen.
[...]und dann ist die Frage, wie ich es dann an das system übergebe, das eigentlich csv-Dateien bearbeitet.
Über das andere System hast du ja noch nichts erzählt.
Ich hab den Stand, dass du nur eine .csv-Datei ändern willst.
 
fgets() liest ja auch nur eine Zeile. Willst du mehr lesen, musst du halt öfters aufrufen oder z.B. fread() benutzen.Über das andere System hast du ja noch nichts erzählt.
Ich hab den Stand, dass du nur eine .csv-Datei ändern willst.


Ja, im Prinzip ist es auch nicht viel anderes. Nochmal genau das, was gesucht wird:

Tradedoubler gibt seine CSV-Produktlisten in ner .gz-Datei zum Download raus. Problem ist, dass in dieser csv-Datei der Tabellenkopf fehlt. Jetzt brauche ich für einen csv-Reader ein Script. Am csv-Reader direkt kann ich leider nichts ändern, weil der verschlüsselt ist.
Deswegen muss ich ja vorher ein Script erstellen (das ist eben genau das, was hier gesucht wird), das beim Aufruf die Produktliste herunterlädt, entpackt, der csv-Datei den Header hinzufügt und dann die komplette csv-Datei wiedergibt.

Und später soll der csv-Reader einfach dieses Script aufrufen, das dann die komplette csv-Datei ausliefert.
 
Hrm ein Blick in die Manuel hilft weiter...

PHP:
<?
echo "spalte1;spalte2;spalte3\n";

$handle = gzopen('https://www.example.com/file.gz', 'r');
while (!feof($handle)) {
	echo fgets($handle, 4096)."\n";
}
fclose ($handle);
?>
 
Zuletzt bearbeitet:
Hrm ein Blick in die Manuel hilft weiter...

PHP:
<?
echo "spalte1;spalte2;spalte3\n";

$handle = gzopen('https://www.example.com/file.gz', 'r');
while (!feof($handle)) {
	echo fgets($handle, 4096)."\n";
}
fclose ($handle);
?>

Naja aber damit bekomm ich ja nur eine Zeile komplett am Stück und dazu auch noch diese Begrenzung von 4096!

Ich habs jetzt mit Hilfe des Manuels so gemacht:

PHP:
<?
$fp = gzopen("https://pf.tradedoubler.com/export/export?export=true&zip=true&a=1394573&format=csv&programId=43952&pfId=8542&version=1", "r");
$count = 10;
$count2 = 0;
echo "1;2;3;4;5;6;7;8;9;10<br>";
while ( ($data = fgetcsv ($fp, 1000, "|")) !== FALSE ) { 
                                          
    $num = count ($data);                      
                                               
    for ($c=0; $c < $num; $c++) {            
        print $data[$c];
		$count2++;
		if ($count == $count2){
		echo "<br>";
		$count2 =0;
		}elseif ($count != $count2 and $count2 != 0){
		echo ";";
		}
    }
}
gzclose($fp);

?>

Also das ist schon etwas ausfürhlicher, da er einfach jedes Feld nimmt und mir nochmal komplett mit neuen Trennzeichen (;) die Liste macht. Jetzt allerdings hab ich noch ein letztes Problem:

Mein System erkennt nicht die neue Zeile. Also er liest die erste Zeile, trennt sie dann schön, etc. Aber er erkennt nicht, wenn die Zeile zu Ende ist.
Daher die Frage: Welches Zeichen ist normal um in einer csv-Datei eine neue Zeile einzuleiten? Denn ich lass es mir halt einfach als Text ausgeben, aber diese <br> werden von dem csv-Lesescript nicht erkannt.

Was muss ich also dafür nehmen?