CSV naar meerdere tabellen
Ik zit met een probleem. Ik heb het volgende:
Ik heb meerdere CSV bestanden (Excel) met data. Voor de uitleg spits ik mij even op 1 bestand.
In dat bestand staan ongeveer 18 kolommen en een stuk of 60 rijen. Niet alle kolommen heb ik nodig. Maar meestal wel alle rijen.
Nu is het zo dat uit bestand A, wat ik inlees met file_get_contents keurig een loop kan draaien en zo op mijn scherm het volgende zie:
Rij 1 | Kolom 1 | Waarde
Rij 1 | Kolom 2 | Waarde
enz.
Daar zit het probleem ook niet in.
Ik heb in een tabel gedefinieerd welke kolommen uit welk bestand naar welke SQL tabel / kolom moeten.
Voorbeeld:
Bestand A | Kolom A | tabel1 | kolom1
Bestand A | Kolom B | tabel 1 | kolom 2
Bestand A | Kolom D | tabel 2 | kolom 1
Bestand A | Kolom H | tabel 2 | kolom 2
Ik kan deze nummering (kolom A,B,D,H) vergelijken met een loopnummering, maar dan krijg ik vervolgens 4 losse query's.
Nu wil ik dat de eerste 2 en de laatste 2 samengevoegd worden. Ze moeten immers naar dezelfde tabel.
Hopelijk heb ik t zo duidelijk genoeg uitgelegd.
Wie kan me helpen en zorgen dat deze waarden samen komen tot 1 insert query?
Mathijs
Toevoeging op 23/02/2011 18:23:14:
Ik denk dat ik een oplossing heb gevonden, correct me if i'm wrong:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
// als de rij voorkomt aan array toevoegen. Ik maak in de variabele $import een array waarde met de tabelnaam, onderverdeeld in een array met de kolom + de waarde:
$import["tabelnaam"] = array("kolom"=>"waarde1","kolom2"=>"waarde2");
groeperen bij "tabel"
{
sql insert per tabel, met kolom -> waarde
}
$import["tabelnaam"] = array("kolom"=>"waarde1","kolom2"=>"waarde2");
groeperen bij "tabel"
{
sql insert per tabel, met kolom -> waarde
}
Klopt en kan dit?
Quote:
Nu is het zo dat uit bestand A, wat ik inlees met file_get_contents
simpelweg fout!!
Gebruik
mysql: LOAD DATA
Oracle: tool sqlldr
Laad data eerst in 1 dataload tabel en vanuit daar kan je met insert/select statements in feite doen en laten wat je wilt
Toevoeging op 23/02/2011 18:30:10:
Ik heb niet alle data nodig. En sommige data moet naar meerdere tabellen (bijv kolom a moet naar tabel 1, 3 en 5)
Tools + (PL)/SQL is sneller dan al het geknoei in php.
De verhouding: php 1 uur tegenover 5 minuten tool + pl/sql
Moet ik dus voor al mijn 15 bestanden, sommigen met meer dan 1000 records, tabellen aanmaken, alles importeren, dan uitlezen en dan wegschrijven weer? Lijkt mij een onzinnige methode. Zeker als je daarvan 5 bestanden elke dag doet.
en nee 1 tabel voldoet en 1 functie + wat procedures
Sorry, ik ben totaal niet vreemd van PHP en SQL, maar ik snap je verhaal niet of jij snapt mijn probleem niet.
Noppes Homeland op 23/02/2011 19:27:25:
Je wilt data importeren en dat doe je niet met PHP maar met de daarvoor bedoelde tools.
Tools + (PL)/SQL is sneller dan al het geknoei in php.
De verhouding: php 1 uur tegenover 5 minuten tool + pl/sql
Tools + (PL)/SQL is sneller dan al het geknoei in php.
De verhouding: php 1 uur tegenover 5 minuten tool + pl/sql
PHP werkt prima hoor.
Je kan wellicht ook eens kijken naar de functie file(), die haalt je bestand op als een array: http://nl.php.net/manual/en/function.file.php
Hiermee voeg ik gemakkelijk mijn csv bestanden van meer dan 75000 regels toe aan de database.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
if (($handle = fopen("joubestand.csv", "r")) !== FALSE)
{
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
$num = count($data);
$row++;
for ($c=0; $c < 1; $c++)
{
$sql = "INSERT INTO tabel1 SET ";
$sql .= "kolom1 = '".mysql_real_escape_string($data[0])."'"; //A
$sql .= ",kolom2 = '".mysql_real_escape_string($data[1])."'"; //B
$res = mysql_query($sql);
$sql = "INSERT INTO tabel2 SET ";
$sql .= "kolom1 = '".mysql_real_escape_string($data[3])."'"; //D
$sql .= ",kolom2 = '".mysql_real_escape_string($data[7])."'"; //H
$res = mysql_query($sql);
if($res)
echo '..........<br/>';
else
{
echo 'Foutje<br/>'.mysql_error();
exit;
}
}
}
fclose($handle);
echo 'Klaar';
}
else
echo 'Bestand niet gevonden';
?>
if (($handle = fopen("joubestand.csv", "r")) !== FALSE)
{
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
$num = count($data);
$row++;
for ($c=0; $c < 1; $c++)
{
$sql = "INSERT INTO tabel1 SET ";
$sql .= "kolom1 = '".mysql_real_escape_string($data[0])."'"; //A
$sql .= ",kolom2 = '".mysql_real_escape_string($data[1])."'"; //B
$res = mysql_query($sql);
$sql = "INSERT INTO tabel2 SET ";
$sql .= "kolom1 = '".mysql_real_escape_string($data[3])."'"; //D
$sql .= ",kolom2 = '".mysql_real_escape_string($data[7])."'"; //H
$res = mysql_query($sql);
if($res)
echo '..........<br/>';
else
{
echo 'Foutje<br/>'.mysql_error();
exit;
}
}
}
fclose($handle);
echo 'Klaar';
}
else
echo 'Bestand niet gevonden';
?>
Het probleem is dat ik dus meerdere (losse) insert query's krijg, die gecombineerd moeten worden.
Dit komt omdat ik per rij / kolom naga of deze in de tabel voorkomt waar in staat welke kolommen waarheen moeten gaan.
Ik heb nu een oplossing denk ik gevonden, maar dat krijg ik nog niet echt werkend.
Ik dacht, als ik nou alles wegschrijf naar een array die als basis de tabelnaam heeft:
Code (php)
1
$array["hier_de_tabel_naam"] = array("sql_kolom1"=>"excelwaarde_1","sql_kolom2"=>"excelwaarde_2");
Dat dan voor iedere tabel, en dan uitlezen. Dan is het in ieder geval samengevoegd.
Goede methode, maar, als ik het nu uitlees, krijg ik telkens alleen de laatste waarde.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
$import = array();
$import["tabelnaam"] = array("kolom1"=>"waarde1","kolom2"=>"waarde2","kolom3"=>"waarde3");
$import["tabelnaam2"] = array("kolom1a"=>"waarde1a","kolom2a"=>"waarde2a","kolom3a"=>"waarde3a");
$import["tabelnaam3"] = array("kolom1b"=>"waarde1b","kolom2b"=>"waarde2b","kolom3b"=>"waarde3b");
foreach ($import as $tabel => $values)
{
echo $tabel."<br/>";
foreach ($values as $kolom => $waarde);
{
echo $waarde." moet naar ".$kolom."<br/>";
}
echo "<br/>";
}
$import["tabelnaam"] = array("kolom1"=>"waarde1","kolom2"=>"waarde2","kolom3"=>"waarde3");
$import["tabelnaam2"] = array("kolom1a"=>"waarde1a","kolom2a"=>"waarde2a","kolom3a"=>"waarde3a");
$import["tabelnaam3"] = array("kolom1b"=>"waarde1b","kolom2b"=>"waarde2b","kolom3b"=>"waarde3b");
foreach ($import as $tabel => $values)
{
echo $tabel."<br/>";
foreach ($values as $kolom => $waarde);
{
echo $waarde." moet naar ".$kolom."<br/>";
}
echo "<br/>";
}
Wat doe ik fout?
Dit is mijn resultaat:
tabelnaam
waarde3 moet naar kolom3
tabelnaam2
waarde3a moet naar kolom3a
tabelnaam3
waarde3b moet naar kolom3b
Toevoeging op 23/02/2011 20:25:44:
Tur min op 23/02/2011 20:20:08:
Het volgende script gebruik ik ervoor. Aangepast aan jou wens natuurlijk.
Hiermee voeg ik gemakkelijk mijn csv bestanden van meer dan 75000 regels toe aan de database.
Hiermee voeg ik gemakkelijk mijn csv bestanden van meer dan 75000 regels toe aan de database.
Beste Tur min,
Zo ver was ik ook al, maar... Ik heb mijn verwijzingen in een tabel staan omdat het om 15 verschillende bestanden gaat en op den duur er ook bestanden bijkomen!
Begrijp ik nou dat je in een array wilt aangeven welke csv kolom in welke database tabel en kolom moet komen?
Ja.
Code (php)
Zoiets?
Je kunt beter cijfers gebruiken ipv a,b,c omdat je ze dan gelijk kunt gebruiken icm output van csv.
Zie bijv in mijn script $data[0] dit is de eerste kolom van 't csv bestand en kun je dus zo koppelen aan de array. Bijv: $data[$array['bestand']['csvkolom']]
Gewijzigd op 23/02/2011 21:20:59 door Michael -