traiter fichier csv avant import dans mysql

Eléphanteau du PHP | 44 Messages

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

Eléphant du PHP | 86 Messages

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

Eléphanteau du PHP | 44 Messages

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

ViPHP
ViPHP | 1380 Messages

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."'";
ripat

Mammouth du PHP | 2278 Messages

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...
.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 1380 Messages

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) }
ripat