CSV naar meerdere tabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mathijs van der Hurk

Mathijs van der Hurk

23/02/2011 17:39:19
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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
}


Klopt en kan dit?
 
PHP hulp

PHP hulp

05/05/2024 13:17:42
 
Noppes Homeland

Noppes Homeland

23/02/2011 18:24:30
Quote Anchor link
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
 
Mathijs van der Hurk

Mathijs van der Hurk

23/02/2011 18:29:38
Quote Anchor link
Ik werk met MSSQL. En waarom is dat fout?

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)
 
Noppes Homeland

Noppes Homeland

23/02/2011 19:27:25
Quote Anchor link
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
 
Mathijs van der Hurk

Mathijs van der Hurk

23/02/2011 19:40:11
Quote Anchor link
Ik snap je argument nog niet bepaald, maar geef maar een voorbeeld.

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.
 
Noppes Homeland

Noppes Homeland

23/02/2011 20:08:12
Quote Anchor link
Je hoeft het maar 1 keer te maken, daarna kan je het gewoon aanslingeren mbhv een jobje

en nee 1 tabel voldoet en 1 functie + wat procedures
 
Mathijs van der Hurk

Mathijs van der Hurk

23/02/2011 20:10:37
Quote Anchor link
Sorry, ik ben totaal niet vreemd van PHP en SQL, maar ik snap je verhaal niet of jij snapt mijn probleem niet.
 
Ozzie PHP

Ozzie PHP

23/02/2011 20:15:53
Quote Anchor link
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

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
 
Michael -

Michael -

23/02/2011 20:20:08
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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';
?>
 
Mathijs van der Hurk

Mathijs van der Hurk

23/02/2011 20:23:17
Quote Anchor link
We wijken nu van het probleem af.
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)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
1
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/>";
}


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.



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!
 
Michael -

Michael -

23/02/2011 20:42:59
Quote Anchor link
Begrijp ik nou dat je in een array wilt aangeven welke csv kolom in welke database tabel en kolom moet komen?
 
Mathijs van der Hurk

Mathijs van der Hurk

23/02/2011 20:58:04
Quote Anchor link
Ja.
 
Michael -

Michael -

23/02/2011 21:05:50
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$array
= array('bestand'=>'file1.csv',
        array('csvkolom'=>0,'tabel'=>1,'kolom'=>1),
        array('csvkolom'=>1,'tabel'=>1,'kolom'=>2),
        array('csvkolom'=>3,'tabel'=>2,'kolom'=>1),
        array('csvkolom'=>7,'tabel'=>2,'kolom'=>2)
);

?>

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 -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.