Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

txt.gz nach mysql





Frage

hi, kann mir bitte jemand sagen wie ich folgende datei: http://ds3.die-staemme.de/map/village.txt.gz per php in meine datenbank einfuegen kann ?! am liebsten waere mir ein fertiges script was dies uebernimmt. vielen dank im voraus :)

Antwort 1 von rabies

Kleine Frage am Rande... liegt das Script dann auf dem gleichen Server wie die von Dir genannte Datei? Oder auf einem "entferntem" Server?

Vorgehensweise wäre, (wenn die Datei auf dem gleichen Server liegt), die village.txt.gz zu "parsen", die Datei village.txt auszulesen, den Inhalt dann zu zerstückeln (wie mir scheint wäre hier eine Trennung der einzelnen Werte durch Komma das passendste) und das dann einfach in die DB zu schuppsen.

Denkanstoß genug? :b

Sven.

Antwort 2 von rabies

Ach.. das mit dem entferntem Server hat sich erledigt. .. Hilfreich wäre nun noch, wenn Du kundtun könntest, was Die einzelnen Werte aussagen und die Tatsache, was für eine Tabellenstruktur Du verwendest. - Und überhaupt: Welche DB-Software? MySQL?

Antwort 3 von nrg76

Hi

ich verwende MySQL.
Die Datei liegt nicht auf meinem Server.

also die daten sind durch koma getrennt. folgende daten enthalten : id, name, x, y, tribe, points, rank.

datenbankstruktur ist folgende:

# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `ds3_village`
#

CREATE TABLE `ds3_village` (
`id` int(11) NOT NULL default ´0´,
`name` varchar(50) NOT NULL default ´´,
`x` smallint(6) NOT NULL default ´0´,
`y` smallint(6) NOT NULL default ´0´,
`tribe` varchar(11) NOT NULL default ´´,
`points` varchar(11) NOT NULL default ´´,
`rank` varchar(11) NOT NULL default ´´
) TYPE=MyISAM;

#
# Daten für Tabelle `ds3_village`
#

Antwort 4 von rabies

Hey,

Ich denke, das könnte funktionieren (wenn man MySQL nicht das brechen anfängt, aufgrund der Länge des Datensatzes...):



	$file = "http://ds3.die-staemme.de/map/village.txt.gz";
	$gzfile = gzfile($file);
	
	$tab = "ds3_village";
	$tabstruct = ´id, name, x, y, tribe, points, rank´;
	$query = ´INSERT INTO ´.$tab.´ (´.$tabstruct.´) ´;
	
	foreach($gzfile as $gzline)
		{
		  $list=explode(",", $gzline);
		  $query .= ´VALUES(´.$list[0].´, ´.$list[1].´, ´.$list[2].´, ´.$list[3].´, ´.$list[4].´, ´.$list[5].´, ´.$list[6].´), ´;
		}
	
	$lastpos = strrpos($query, ", ");
	$query = trim(substr($query, 0, $lastpos));



... zuvor halt noch die Verbindung via mysql_connect(Dein_Hostname, Dein_Benutzername, Dein_Passwort) herstellen und die Datenbank via mysql_select_db(Deine_DB) auswählen. ... Unterhalb des von mir geposteten Snippets dann noch
mysql_query($query);
ausführen. Dann sollte das ganze (eigentlich) eingefügt werden. ...

Beachte: Es kann u.U. eine Weile dauern. (allein schon das Statement zusammenbasteln dauert auf der Kiste hier an die 15-20 Sek). Testweise eingefügt hab´ ich das jetzt auch nicht - lediglich das Statement zusammenbauen lassen.

hth,
Sven.

Antwort 5 von nrg76

vielen dank fuer deine schnelle antwort.

leider bekomme ich gerade nen parse fehler :(

Parse error: parse error, unexpected ´,´ in /home/virtual/site40/fst/var/www/ira/update.php on line 10


hier mein code ..


<?php

mysql_connect(´lxxx´, ´xxx´, ´xxx´);
mysql_select_db(´xxx´);

$file = "http://ds3.die-staemme.de/map/village.txt.gz";
$gzfile = gzfile($file);

$tab = "ds3_village";
$tabstruct = ´id, name, x, y, tribe, points, rank´;
$query = ´INSERT INTO ´.$tab.´ (´.$tabstruct.´) ´;

foreach($gzfile as $gzline)
{
$list=explode(",", $gzline);
$query .= ´VALUES(´.$list[0].´, ´.$list[1].´, ´.$list[2].´, ´.$list[3].´, ´.$list[4].´, ´.$list[5].´, ´.$list[6].´), ´;
}

$lastpos = strrpos($query, ", ");
$query = trim(substr($query, 0, $lastpos));

mysql_query($query);

?>

und ich danke dir schonmal im voraus ;)
echt supernett von dir ^^

Antwort 6 von rabies

Hast Du das jetzt einfach per Copy & Paste gemacht? ... Diese Accente musst Du jeweils durch Apostrophe tauschen. Sonst wird das nichts. ... Die Apostrophe werden automatisch ersetzt, wenn man hier Code reinkopiert. ... Wenn Du das so übernimmst sieht PHP das glaube ich als irgendeine Programmausführung an.

Sven.

Antwort 7 von nrg76

joar hab ich *schaem*
ist mir gar nicht aufgefallen mit den apostroph. erst als ich die datei im dreamweaver geschaut hab und nicht im editor ;)

okay also nu geht es..
aber ein problem:

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 35 bytes) in /home/virtual/site40/fst/var/www/ira/update.php on line 7

die datei ist zu gross. was kann ich da machen?
jemand anders meinte damit sollte es gehen :

function gzfile_lowmem($url) {

$content = file_get_contents($url);

$file = basename($url);

$h_file = fopen($file, ´w´);

fwrite($h_file, $content);

fclose($h_file);

system(´/bin/gzip -d ´ . $file);

$content = file(substr($file, 0, -3));

unlink(substr($file, 0, -3));

return $content;

}


aber da ich voll der noob bin, weiss ich nicht was ich mit der fumkyion machen soll *grml*

lg

steffen

Antwort 8 von rabies

Bringt Dir nichts... Dazu muss die Datei village.txt.gz auf dem gleichen Server liegen wie das Script. ... Testen, wie sich das Teil nun verhällt, kann ich nicht. Ich hab´ hier keine Linuxkiste. ...

Ansonsten halt mal die Datei village.txt.gz runterladen und auf Deinen Server hochschieben. Dort könntest Du dann mit der Funktion rumspielen. ...

also $content = gzfile_lowmem("http://ds3.die-staemme.de/map/village.txt.gz");

$content wäre dann der Inhalt der Datei. .. Und dann halt wieder das übliche Verfahren des SQL-Statements basteln. (Wobei ich jetzt erst recht daran zweifle, dass MySQL das schlucken wird).

Antwort 9 von nrg76

also die datei koennte ich auf meinen server legen.
das ist nicht das problem. die wuerde ich mir per http post holen. das script habe ich auch schon am laufen ;)

wieso muss es dann so heissen :
also $content = gzfile_lowmem("http://ds3.die-staemme.de/map/village.txt.gz");

wenn es doch auf meinem server liegt ?!

und wie mache ich das mit der function?
so hier ?!

<?php

$url=´meine url´

function gzfile_lowmem($url) {

$content = file_get_contents($url);

$file = basename($url);

$h_file = fopen($file, ´w´);

fwrite($h_file, $content);

fclose($h_file);

system(´/bin/gzip -d ´ . $file);

$content = file(substr($file, 0, -3));

unlink(substr($file, 0, -3));

return $content;

}

$tab = "ds3_village";
$tabstruct = ´id, name, x, y, tribe, points, rank´;
$query = ´INSERT INTO ´.$tab.´ (´.$tabstruct.´) ´;

foreach($gzfile as $gzline) // hier $gzfile durch $content ersetzen? und mit was $gzline?!
{
$list=explode(",", $gzfile); // hier auch wieder $content?
$query .= ´VALUES(´.$list[0].´, ´.$list[1].´, ´.$list[2].´, ´.$list[3].´, ´.$list[4].´, ´.$list[5].´, ´.$list[6].´), ´;
}

$lastpos = strrpos($query, ", ");
$query = trim(substr($query, 0, $lastpos));

mysql_query($query);

?>

Antwort 10 von rabies

Ich kann Dir die Fragen nicht wirklich beantworten... ich kann das nicht testen. Und ich weiß auch nicht, wie Content aussieht, wenn man es von der Funktion geliefert bekommt. ... Wenn Du mir das sagen kannst, kann man sich vllt. auch einen anderen Weg suchen, um die Daten in MySQL reinzustopfen. (LOAD DATA INFILE, z.B.).

Ruf einfach mal die Funktion mit schon im letzten Posting genannter Zeile auf. und gib mal $content mit echo aus. (also echo $content;) ...

So, und für heute hab´ ich endlich Feierabend. ;D
Sven.

Antwort 11 von nrg76

habe jetzt die datei und das script in einenn ordner gepackt.
ordner auf chmod777 gesetzt.
das script sieht jetzt wie folgt aus::



<?php
mysql_connect(´host´, ´user´, ´password´);
mysql_select_db(´database´);

$url="village.txt.gz";

$content = gzfile_lowmem($url);

function gzfile_lowmem($url) {

$file = basename($url);
echo $file;
$h_file = fopen($file, ´w´);

fwrite($h_file, $content);

fclose($h_file);

system(´/bin/gzip -d ´ . $file);

$content = file(substr($file, 0, -3));

unlink(substr($file, 0, -3));

return $content;

}

echo $content;

?>


so nun bekomme ich leider eine andere msg :

village.txt.gz
Warning: file() [function.file]: Unable to access village.txt in /home/virtual/site40/fst/var/www/ira/ds/test.php on line 21

Warning: file(village.txt) [function.file]: failed to open stream: No such file or directory in /home/virtual/site40/fst/var/www/ira/ds/test.php on line 21

Warning: unlink(village.txt) [function.unlink]: No such file or directory in /home/virtual/site40/fst/var/www/ira/ds/test.php on line 23


das erste ist die ausgabe der datei: (echo $file;)
das 2te heisst das ich keine rechte hab... aber warum ?!
das 3te und 4te resultiert dann natuerlich daraus ..

kannst du mir sagen was ich noch machen muss?!

Antwort 12 von nrg76

so hier das was bis jetzt geht.
leider wird nichts in die datenbank geschrieben ...


<?php
mysql_connect(´host´, ´user´, ´password´);
mysql_select_db(´database´);

$tab = "ds3_village";
$tabstruct = ´id, name, x, y, tribe, points, rank´;
$query = ´INSERT INTO ´.$tab.´ (´.$tabstruct.´) ´;

$content=gzfile(´village.txt.gz´);
foreach ($content as $line)
{
$list=explode(",", $line);
$query .= ´VALUES(´.$list[0].´, ´.$list[1].´, ´.$list[2].´, ´.$list[3].´, ´.$list[4].´, ´.$list[5].´, ´.$list[6].´), ´;
}
$lastpos = strrpos($query, ", ");
$query = trim(substr($query, 0, $lastpos));

mysql_query($query);


echo $query
?>

Antwort 13 von Nessus

Hi,

Die Tabelle liegt vor, die Daten auch?
Installiere dir mal auf die Schnelle phpmyadmin, und installiere sie in 3 oder 4 gleiche Teile.
Ist zwar nicht elegant, geht aber schneller wie mit den Scripten.


HTH

Nessus

Antwort 14 von nrg76

jo nexxus, das problem ist das muesste dann tgl gemacht werden. i wollte das einfach per cron job machen.

das problem ist wirklich das die datei zu gross ist.
kann man da nicht was mit loop machen ?!

und vorallem wie?!

danke ^^

Antwort 15 von rabies

definiere "Loop"...

Antwort 16 von nrg76

das script sieht wie folgt aus:

<?php
mysql_connect(´host´, ´user´, ´password´);
mysql_select_db(´database´);

$tab = "ds3_village";
$tabstruct = ´id, name, x, y, tribe, points, rank´;
$query = ´INSERT INTO ´.$tab.´ (´.$tabstruct.´) ´;

$content=gzfile(´village.txt.gz´);
global $arr; // some Array
foreach ($content as $line($i=0, $i < count($arr), $i++)) {
if ($i % 300 == 0 && $i != 0) {
$list=explode(",", $line);
$query .= "VALUES($list[0], ´$list[1]´, $list[2], $list[3], $list[4], $list[5], $list[6]), ";
}
}
$lastpos = strrpos($query, ", ");
$query = trim(substr($query, 0, $lastpos));

mysql_query ($query) or die (mysql_error ())


?>



mit loop meinte ich das:

foreach ($content as $line($i=0, $i < count($arr), $i++)) {
if ($i % 300 == 0 && $i != 0) {

es soll die datei eingelesen werden, 300 eintraege in die datenbank geschoben und dann die naechstn 300 usw ...

doch habe ich dort nen fehler in der foreach anweisung.
eventuell sollte es nur for sein...

Antwort 17 von nrg76

kann mir da kiner helfen?

Antwort 18 von nrg76

okay habs nun nach langem probieren geschafft :)

danke nochmal an alle fuer die super mithilfe !


lg

Antwort 19 von rabies

... Und die Lösung war?! Ich bin wissbegierig.

Antwort 20 von nrg76

:)


so sieht es nu aus:
und geht bestens^^

trotzdem vielen dank fuer deine hilfe !!!!!!!!!!!!!!!!!

<?php
error_reporting(E_ALL);
ini_set(´display_errors´,´1´);
mysql_connect(´host´, ´user´, ´password´);
mysql_select_db(´database´);
$tab = "ds3_village";

$tabstruct = ´id, name, x, y, tribe, points, rank´;
$query_tpl = ´INSERT INTO ´.$tab.´ (´.$tabstruct.´) VALUES ´;
$data=array();
$content=gzfile(´village.txt.gz´);
foreach ($content as $counter => $line) {
$p=explode(´,´,$line);
$p[1]="´".$p[1]."´";
$data[]=´(´.implode(´,´,$p).´)´;
if (($counter>0) AND ($counter % 300 == 0)) {
mysql_query($sql=$query_tpl.implode(´,´,$data));
print ´<pre style="border:1px solid lightcoral">´.var_export($sql,true).´</pre>´;
$data=array();
}
}
if (count($data)>0) {
mysql_query ($sql=$query_tpl.implode(´,´,$data)) or die (mysql_error ());
print ´<pre style="border:1px solid lightcoral">Last Values: ´.var_export($sql,true).´</pre>´;
}

?>



lg

nrg76

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: