[PHP] .csv mergen met tabel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jo,

Momenteel ben ik bezig informatie te importeren en exporteren van een MySQL database naar csv-bestanden en andersom. Dit gaat over het algemeen aardig, maar ik zit nog met een probleempje...

1 //
Ik heb een tabel waar allerlei klanten instaan. Nu kunnen gebruikers klanten toevoegen dmv. een formulier. Nu wil ik ook maken dat men een .xls-bestand kan opslaan als .csv-bestand en deze kan importeren. Het is mogelijk dat er in het excel-bestand waarden staan die ook al in de database staan.
Het probleem is is dat ik het .csv-bestand en de database goed moet laten "mergen". Is hier een goede oplossing voor? Ik heb al gekeken naar zaken als table creatie met type=merge, maar dit werkt ook niet goed. Ik wil dus dat de nieuwe records uit het .csv-bestand in de tabel komen.

Bij voorbaat dank,
Martijn

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 14:27
Dat wordt checken of een klant al bestaat. Waarschijnlijk is het het snelst om eerst het CSV bestand in te lezen in een array.Vervolgens bepaal je de minimum en maximumwaarde van een bepaald veld (choose wisely) in de klantgegevens en haal je alle klanten die hiertussen vallen op uit de db, de resultaten prop je in een gelijkaardig array. Vervolgens bepaal je met array_diff() welke waarden je moet invoeren in de db...

[ Voor 7% gewijzigd door T-MOB op 22-12-2004 09:38 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor je reactie.

Wat bedoel je precies met een minimum en een maximum bepalen?

De oplossing zoals jij die geeft is idd een idee, maar er moet dus ook gekeken worden of er wijzigingen zijn (Wat ik vergeten was te vertellen). Dit kan allemaal met array_diff() maar dat betekent dat ik de hele tabel moet controleren en dan leeg moet maken en daarna weer invoeren :S
En array_diff() is helaas zo langzaam.

Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

If you specify the ON DUPLICATE KEY UPDATE clause (new in MySQL 4.1.0), and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed.
Bij lagere versies van MySQL kan je het ook zelf in PHP forceren door het volgende te doen :
PHP:
1
2
3
4
5
6
7
8
/* Kolom `a` is primarykey */
$error=null;
$sql="INSERT INTO `test` (`a`,`b`) VALUES (1,'test')";
@mysql_query($sql) or $error=true;
if ($error) {
 $sql="UPDATE `test` SET `b`='test' WHERE `a`=1 LIMIT 1;"
 mysql_query($sql);
}

[ Voor 5% gewijzigd door glashio op 22-12-2004 09:58 . Reden: Verberg Error met @ ]

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor het idee, maar dat is nog niet helemaal de oplossing die ik zoek.

Helaas beschikken ik niet over MySQL versie 4.1.0. dus zou ik het volgens jouw idee moeten forceren met PHP. Daar is echter een groot nadeel aan. Zoals je weet is een klantenbestand vaak nogal erg groot. Dus als hij heel de tabel op die manier zou moeten doorlopen, duurt het erg lang.

Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

Excel koppelen via MyODBC ?
Zolang je asynchroon werkt zal je toch heel je excel worksheet (max. 65536) moeten vergelijken met je MySQL-tabel.

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 14:27
Verwijderd schreef op woensdag 22 december 2004 @ 09:49:
Bedankt voor je reactie.

Wat bedoel je precies met een minimum en een maximum bepalen?

De oplossing zoals jij die geeft is idd een idee, maar er moet dus ook gekeken worden of er wijzigingen zijn (Wat ik vergeten was te vertellen). Dit kan allemaal met array_diff() maar dat betekent dat ik de hele tabel moet controleren en dan leeg moet maken en daarna weer invoeren :S
En array_diff() is helaas zo langzaam.
Met het minimum en maximum bepalen bedoel in de array die uit je CSV komt kijkt wat bijvoorbeeld het hoogste voorkomende klantnummer is en het laagste. (of achternaam, of wat voor kolom dan ook). Dit is een weinig kostbare actie op een array en met deze waarden kun je het relevante deel van de reeds bestaande waarden uit de database trekken. Dat scheelt tijd bij het ophalen van de data en ook bij de array_diff().

[edit:
Uhmm.. * T-MOB bedenkt zich net dat je ook wil gaan updaten. Dat betekent dat je op zijn minst een onveranderlijke waarde in de excelsheet moet hebben. Anders weet je natuurlijk nooit of iets een nieuw record is of een update voor een bestaande klant. Wat dacht je ervan om op basis van die onveranderlijke waarde je query uit te voeren. Dus:
code:
1
$sql = 'SELECT * FROM table WHERE unique IN ("' .implode('","', $csv_array[unique]) .'")';

Daarna lijkt het me niet moeilijk meer...

[ Voor 24% gewijzigd door T-MOB op 22-12-2004 11:21 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • erkje
  • Registratie: Oktober 2001
  • Laatst online: 12-06-2024
Ik heb er zelf niet mee gewerkt, maar wel met iemand die het heeft toegepast. In MySQL heb je een commando genaamd: LOAD INFILE waarmee je een CSV in 1 commando kan mergen. met de tabel.
Hier het commando:
code:
1
2
3
4
5
6
LOAD DATA INFILE '/home/path/to/file.csv'
REPLACE INTO TABLE temp_tabl
FIELDS TERMINATED BY ';' 
IGNORE 1 LINES
(temp1, artikel_id, omschrijving, temp2, prijs, temp3, niveau2, 
niveau3, niveau4, fabrikant_code, niveau1, temp4, temp5, temp6)


op de MySQL Manual

[ Voor 53% gewijzigd door erkje op 22-12-2004 11:23 ]

taste and see that the Lord is good


Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
op werk bezig geweest met een functie voor csv files inlezen... zal even voor je zoeken!
Pagina: 1