traiter fichier csv avant import dans mysql

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : traiter fichier csv avant import dans mysql

Re: traiter fichier csv avant import dans mysql

par Ripat » 01 mai 2012, 11:14

Il est totalement inutile de recourir aux expressions rationnelles
Inutile, je n'irais pas jusque là. Sûrement un poil plus gourmand en ressources mais pratique. Si c'est la performance que l'on cherche, autant ne pas utiliser php du tout et passer par un utilitaire fait pour comme awk (GNU ou mieux, sa version compilée mawk). Rapide (près de 3 fois), économe en mémoire et... nettement moins verbeux.

Code : Tout sélectionner

BEGIN {FS="[;|]"; OFS=";"} { split($2, dte, "/") gsub(/adhoc/, "image/adhoc", $3) print $1, dte[3] "-" dte[2] "-" dte[1], $3, $5, $4, substr($8,2,5) }

Re: traiter fichier csv avant import dans mysql

par sirakawa » 01 mai 2012, 10:28

Il est totalement inutile de recourir aux expressions rationnelles quand la situation est simple, ainsi que le recommande la documentation.
Le fichier provient visiblement de deux implode et on le récupére aisément par deux explode.
$t_ligne = explode(";",$ligne ); // suffirait amplement
pour le code postal il sufit d'exploser la bonne colonne par:
$t_adresse = explode("|", $t_ligne[3]);

pour la chaîne à ajouter, cf substr_replace..

pour la dernière colonne,substr() en partant de1 pour éliminer la quote...
.

Re: traiter fichier csv avant import dans mysql

par Ripat » 30 avr. 2012, 20:24

Une base de travail:
$csv = file('csv.csv');

foreach ( $csv as $line) {

	/* split de la ligne */
	$splitLine = preg_split('#[;|]#', $line);

	/* split de la date */
	$dteSplit = explode ('/', $splitLine['1']);

	/* sortie dans l'ordre dans un tableau  */
	$outFile[] = sprintf ('%s;%s;%s;%s;%s;%s%s',
		$splitLine[0],
		sprintf('%s-%s-%s', $dteSplit[2], $dteSplit[1], $dteSplit[0]),
		str_replace('adhoc', 'image/adhoc', $splitLine[2]),
		$splitLine[4],
		$splitLine[3],
		substr($splitLine[7], 1, 3),
		PHP_EOL
	);

}


file_put_contents('csv_out.csv', $outFile);

/* partie MySQL */

/* ici connexion à ta bdd */

/* query à exécuter pour insertion */
$eol = (PHP_EOL == "\r\n") ? '\r\n' : '\n';
$qry = "LOAD DATA INFILE '/chemin/vers/csv_out.csv' INTO ta_table FIELDS TERMINATED BY ';' LINES TERMINATED BY '".$eol."'";

Re: traiter fichier csv avant import dans mysql

par macplus » 30 avr. 2012, 16:54

il s'agit d'une liste de concerts:
colonnes:
artiste;date;lien;ville;code_postal;categorie
avant:
Charlie Winston;26/04/2012;http://monsite.com/?ref=[[/adhoc;18000 | BOURGES | FR;rue glette;"VAF|Variété et chanson françaises ; 11V|Variété/Comédie musicale ; 1MC|Musique/Concerts"

Après :
Charlie Winston;2012-04-26;http://monsite.com/?ref=[[image/adhoc;Bourges;18000;VAF

sachant que pour l'url, je dois toujour rajouter le même mot au même endroit, qu'ils me collent le code postal dans la ville au lieu de le mettre dans la colonne code postal et que pour la dernière colonne, je ne veux que les 3 premiers caracteres

Merci

Re: traiter fichier csv avant import dans mysql

par edison1986 » 30 avr. 2012, 16:06

Bonjour,

Peux-tu donner quelques ligne d'exemple avant et après modification pour que l'on puisse t'aider.

Merci

traiter fichier csv avant import dans mysql

par macplus » 30 avr. 2012, 16:03

Bonjour,
Je télécharge régulièrement un fihcier csv de +/- 15.000 lignes pour l'importer dans ma bdd.
Jusqu'à présent je modifiait le csv dans excel pour les données qui ne me conviennent pas.

Mais j'aimerai automatiser les choses dans php pour que une fois que j'ai mis le csv sur mon seveur:
-il reformate la date dans la colonne "date"
-il modifie l'url dans la colonne url (ex : rajouter /data/ au milieu de toutes mes url)
-il supprime les chiffres et caracteres speciaux dans une autre colonne
-il ne garde que les 3 premeirs caracteres d'une derniere colonne.
-il envoie les données dans mysql.

Je sais importer le fichier tel quel mais je ne vois pas comment lui dire de faire les modifications puis de les importer.

Merci à vous