Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
2 CSV-Dateien --> eine Tabelle [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
2 CSV-Dateien --> eine Tabelle


 
Stoner
18-12-2003, 14:43 
 
Hallo, ich habe mehere CSV-Dateien und möchte diese in eine "große" Tabelle eintragen.
Geht das oder MUSS ich mehrere Tabellen anlegen?
Wenn es geht, unter welchem Stichwort muss ich weiter suchen?

Gruß Stoner

PS: die CSV-Dateien haben einige gemeinsame Felder und einige unterschiedliche, außerdem sind sie alle in unterschiedlicher Reihenfolge und die Anzahl der Felder variiert.

 
derHund
18-12-2003, 14:50 
 
?,

wenn die csvs unterschiedliche strukturen beschreiben, wärs doch dämlich, die in _eine_ table zu packen, oder? ich zumindest pack nicht meine besucherdaten mit denen von gästebuch oder der menustruktur zusammen in eine table.

wenn sie natürlich sinngemäß zusammengehören und deshalb auch in _einer_ table stehen sollten, kannst du auch 34265,4 dieser csvs in _eine_ table einfügen
:confused:

 
Stoner
18-12-2003, 15:00 
 
Mein Chef hat mir den Auftrag dazu gegeben. Er möchte alle Daten in einer Tabelle haben "Dann ist alles zusammen".

Aber wie mache ich das dann? Wie sage ich den CSV-Daten, in welches Feld sie gehören?

Gruß Stoner

PS: die Tabelle ist schon vorhanden

 
mrhappiness
18-12-2003, 15:01 
 
beschreib mal den inhalt, was steht in der einen datei, was in der anderen?

 
Stoner
18-12-2003, 15:48 
 
also, es geht um csv-dateien von affiliate-programmanbietern, die daten dieser csv-dateien beinhalten :
datum, nummer, sbid, provision, leads, sales und in einigen csvs sind die leads und sales noch genauer aufgedröselt.
also, vom inhalt passen sie zusammen, aber ....
in der tabelle sind nun alle felder aufgeführt, wenn ich nun eine der csvs eintragen will, kann es sein, dass sie nur in feld 1, feld5, feld 7 und feld 12 der datenbanktabelle eingetragen werden soll.
Einzelne scripte, um die csvs in einzelne tabellen einzutragen habe ich schon, aber wie mache ich das, dass die csv nur in diese bestimmten felder eingetragen wird?

Fruß Stoner

 
mrhappiness
18-12-2003, 15:51 
 
wenn felder leer sind, sieht eine zeile in der csv datei dann nicht so ausfeld 1;;feld 3;feld4;;;;feld7?

schau dir auch mal fgetcsv (http://www.php.net/fgetcsv) an

 
derHund
18-12-2003, 16:09 
 
Original geschrieben von mrhappiness
wenn felder leer sind, sieht eine zeile in der csv datei dann nicht so aus
wäre ja schlimm, wenn es nicht so wäre.

somit sollte nur noch
sind die leads und sales noch genauer aufgedröselt.
etwas arbeit erfordern.

 
Stoner
18-12-2003, 17:05 
 
das habe ich mir schon angeschaut.
also, beispiel:
csv1 =
datum; nummer; status; subid; programm; leads/sales; netto; provision;

csv2 =
datum; views-anzahl; views-provision; clicks-anzahl; clicks-provision; leads-anzahl; leads-provision; sales-anzahl; sales-provision; provision;

csv3 =
programm_id; programmname; datum; provision; status

ich habe nun eine tabelle entwickelt, die alle felder inne hat, (natürlich keine doppelten) und da hinein möchte ich nun die csvs eintragen

ich habe es mit
<?php
$db_Hostname[0] = "localhost";
$db_UserName[0] = "";
$db_Password[0] = "";
$db_Database[0] = "abrechnung";
$db_Table[0] = "partner";
$db_File[0] = "c:/xampp/htdocs/test/beispiel.csv";
$db_Terminated[0] = ";";

$select_db = 0;
if (isset ($select_db))
{
mysql_connect($db_Hostname[$select_db], $db_UserName[$select_db], $db_Password[$select_db]) || die("Can't Connect to Database: ".mysql_error());
mysql_select_db($db_Database[$select_db]);
$del = "DELETE FROM ".$db_Table[$select_db];
$sql = "LOAD DATA INFILE '$db_File[$select_db]' REPLACE INTO TABLE ".$db_Table[$select_db].(Datum,Nr,Sts,SubID,Prg,L_S,Netto,Prov_Wert,Prov)"FIELDS TERMINATED BY '$db_Terminated[$select_db]' IGNORE 1 LINES";
if (mysql_query ($del) and mysql_query ($sql))
{
echo "&Uuml;bertragung erfolgreich";
}
else
{
echo "&Uuml;bertragung fehlgeschlagen. Grund: ". mysql_error ();

}

}
exit();
?>

versucht, bekomme aber immer die fehlermeldung
Parse error: parse error, unexpected ',' in C:\xampp\htdocs\test\affilinet2.php on line 44

???
Gruß
Stoner

Das ist die Zeile mit dem LOAD DATA

 
derHund
18-12-2003, 18:28 
 
haha,

das du da nen parse error kriegst, glaub ich ....
siehst doch schon am highlighting, oder muß der LOAD DATA wirklich so aussehen?

würde vielem widersprechen, was ich über sql weiß ...

 
Stoner
18-12-2003, 18:36 
 
wenn ich die felder nicht angebe und die csv in eine eigene tabelle schreibe - funktionierts

ich denke, dass die felder-angaben an der falschen stelle sind, dabei habe ich sie aus dem mysql-manual

Gruß Stoner

 
derHund
18-12-2003, 18:45 
 
also,

ich kenne den befehl nicht, würde aber rein intuitiv

$sql = "LOAD DATA INFILE '".$db_File[$select_db]."' REPLACE INTO TABLE ".$db_Table[$select_db]." (Datum,Nr,Sts,SubID,Prg,L_S,Netto,Prov_Wert,Prov) FIELDS TERMINATED BY '".$db_Terminated[$select_db]."' IGNORE 1 LINES";

schreiben.

aber, wenn ich mal in mein manual schau....

6.4.9 LOAD DATA INFILE Syntax

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES
[STARTING BY '']
[TERMINATED BY '\n']
]
[IGNORE number LINES]
[(col_name,...)]


seh ich da keine möglichkeit, die spalten anzugeben ... oder bin ich blind?

habs
If you wish to load only some of a table’s columns, specify a field list:
mysql> LOAD DATA INFILE 'persondata.txt'
-> INTO TABLE persondata (col1,col2,...);


funktioniert die oben angegebene query?

 
Stoner
18-12-2003, 19:07 
 
wenn du ein bisschen weiter nach unten scollst, dann steht da:

Wenn Sie Daten nur in einige Tabellenspalten einladen wollen, geben Sie eine Felderliste an:

mysql> LOAD DATA INFILE 'personen.txt'
INTO TABLE personen (spalte1,spalte2,...);

Eine Felderliste müssen Sie ausserdem angeben, wenn die Reihenfolge der Felder in der Eingabedatei von der Reihenfolge der Tabellenspalten abweicht. Ansonsten kann MySQL nicht feststellen, wie er Eingabefelder Tabellenspalten zuordnen soll.

es bleibt dann die frage, wo muss die feldangabe hin?

Gruß Stoner

 
Stoner
18-12-2003, 19:18 
 
also, wenn ich das nun so schreibe:

$sql = $sql = "LOAD DATA INFILE '".$db_File[$select_db]."'
REPLACE INTO TABLE '".$db_Table [$select_db]."' (Datum, Nr, Sts, SubID, Prg, L_S, Netto, Prov_Wert, Prov)
FIELDS TERMINATED BY '".$db_Terminated[$select_db]."'
IGNORE 1 LINES";

dann kommt folgende fehlermeldung:
Übertragung fehlgeschlagen. Grund: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''partner' (Datum, Nr, Sts, SubID, Prg, L_S, Netto, Prov_Wert, P

Gruß Stoner

 
derHund
18-12-2003, 19:44 
 
hmm,

da paßt wohl was nicht, ich hab keine zwei ' hintereinander geschrieben

near ' ' partner ' (Da

lass mal die ' ' weg beim table namen

 
Stoner
19-12-2003, 09:13 
 
moin, moin

hat bisher alles nix gebracht, hab es nun etwas vereinfacht:

<?
mysql_connect("localhost", "", "") or die("Can't Connect to Database: ".mysql_error());
mysql_select_db("partner (Datum,Nr,Sts,SubID,Prg,LS,Netto,ProvWert,Prov)");
$sql = "LOAD DATA INFILE 'c:/xampp/htdocs/test/beispiel.csv'
REPLACE INTO TABLE partner(Datum,Nr,Sts,SubID,Prg,LS,Netto,ProvWert,Prov)
FIELDS TERMINATED BY ';'
IGNORE 1 LINES";
if (mysql_query ($sql))
{
echo "&Uuml;bertragung erfolgreich";
}
else
{
echo "&Uuml;bertragung fehlgeschlagen. Grund: ". mysql_error ();
}
exit();
?>

meine Fehlermeldung lautet nun:

Übertragung fehlgeschlagen. Grund: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'FIELDS TERMINATED BY ';' IGNORE 1 LINES' at line 3

ich hab als letztes die hochkommas in der Zeile davor weggenommen, die gleiche Fehlermeldung wie oben nur mit der Ausnahme, dass die Zeile vorher als mGrund angegeben worden ist

In Verzweiflung
Stoner

 
Stoner
19-12-2003, 12:10 
 
nu hab ich es so gemacht:

<?php
$db_Hostname = "localhost";
$db_UserName = "";
$db_Password = "";
$db_Database = "abrechnung";
$db_Table = "partner";
$db_Fields = "Datum, V_Anz, V_Prov, C_Anz, C_Prov, L_Anz, L_Prov, S_Anz, S_Prov, SubID, Prov";
$db_File = "c:/xampp/htdocs/test/zanox.csv";
$db_Terminated = "';'";

$select_db = 0;
if (isset ($select_db))
{
mysql_connect($db_Hostname, $db_UserName, $db_Password) || die("Can't Connect to Database: ".mysql_error());
mysql_select_db($db_Database);
$sql = "LOAD DATA INFILE '$db_File' INTO TABLE $db_Table FIELDS TERMINATED BY ';' IGNORE 1 LINES($db_Fields)";
if (mysql_query ($sql))
{
echo "&Uuml;bertragung erfolgreich";
}
else
{
echo "&Uuml;bertragung fehlgeschlagen. Grund: ". mysql_error ();
}
}
exit();
?>


und bekomme folgende Meldung:
Übertragung fehlgeschlagen. Grund: Duplicate entry '0' for key 1

in der Tabelle ist ein Datensatz eingetragen, aber auch nicht ganz richtig

Was muss ich denn nu machen?
Gruß Stoner

 
derHund
19-12-2003, 13:46 
 
und bekomme folgende Meldung:
Übertragung fehlgeschlagen. Grund: Duplicate entry '0' for key 1

in der Tabelle ist ein Datensatz eingetragen, aber auch nicht ganz richtig

Was muss ich denn nu machen?
Gruß Stoner

du mußt imho das REPLACE | INGNORE setzen, das ist fürs überschreiben/ignoriren von datensätzen mit gleichen primärschlüsseln verantwortlich .... so erinnern ich mich zumindest, es gestern gelsen zu haben ...

versuch doch deine query erst mal in php_myadmin zum laufen zu kriegen ...

 
Stoner
19-12-2003, 14:26 
 
thx für alle Tips

es läuft und nun habe ich URLAUB!!!

Schönes Weihnachtsfest
Stoner


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:39 Uhr.