Script pour décoder une colonne d'un fichier csv

Eléphanteau du PHP | 23 Messages

02 avr. 2015, 08:06

Bonjour,

Un fichier est mis à jour quotidiennement par un fournisseur sur mon FTP.
Ce fichier, initialement au format txt que je renomme via un script en csv, contient des chaines de caractères qui sont à décoder avec la fonction base64_decode, pour la partie correspondant à la 36ème colonne.

Cependant, je ne vois pas comment procéder dans le script PHP automatisé pour être exécuté quotidiennement.
Je joins une portion de fichier en exemple, ainsi que ce que contient actuellement le script.

Pour préciser ma démarche, j'ai sur mon ftp un fichier format.csv (qui contient l'en-tête de colonne des données que m'envoient mon fournisseur). Après avoir renommé le UPDATEDB.TXT en UPDATEDB.csv, le script concatène les 2 CSV en 1 seul (database.csv), et ce fichier database.csv va être importé automatiquement via un cronjob, quotidiennement, pour alimenter la base MySql des produits contenus dans le fichier.
Mais auparavant, il faut que le fichier UPDATEDB.csv soit traité pour décoder la 36ème colonne, juste avant la concaténation avec le fichier format.csv.

Merci par avance pour votre aide (mais si vous avez plus simple pour arriver à ce résultat, je prends :mrgreen: )
<?php
unlink("./data/UPDATEDB.csv");
unlink("./data/database.csv");
rename("./data/UPDATEDB.TXT", "./data/UPDATEDB.csv");
file_put_contents('./data/database.csv', file_get_contents('./data/format.csv') . file_get_contents('./data/UPDATEDB.csv') );
 ?>
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Mammouth du PHP | 1029 Messages

02 avr. 2015, 12:04

Heu il y a rien sur la 36 colonne en AJ donc dans un tableur
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 23 Messages

02 avr. 2015, 12:21

J'ai pourtant bien quelque chose en AJ quand j'ouvre le fichier csv (pour la première ligne, cela commence par PGRpdj48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iID48YnIgLz48L2ZvbnQ+PC9kaXY+PGRpdj48, mais le texte est coupé et se poursuit en cellule A2, A3 et A4).
Peut-être qu'il serait préférable de convertir le txt en xml pour éviter cette scission ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 avr. 2015, 16:21

Cependant, je ne vois pas comment procéder dans le script PHP automatisé pour être exécuté quotidiennement.
Pour exécuter un script quotidinnement, il faut mettre en place ce qu'on appelle un cronjob (=une tache planifiée).
Rapproche toi de ton hébergeur pour qu'il t'indique comment faire.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 23 Messages

03 avr. 2015, 08:00

Cependant, je ne vois pas comment procéder dans le script PHP automatisé pour être exécuté quotidiennement.
Pour exécuter un script quotidinnement, il faut mettre en place ce qu'on appelle un cronjob (=une tache planifiée).
Rapproche toi de ton hébergeur pour qu'il t'indique comment faire.
Merci à toi. Mais pour le cronjob, il est déjà en place avec la portion de code que j'ai cité dans mon post initial.
Dedans, il faut juste que je rajoute le code pour décoder la colonne mentionnée.
Et c'est dans cette partie là que je suis sec. Pas assez calé en PHP.
Il semblerait qu'il faille voir du côté de fgetcsv, mais je ne suis pas assez expert pour ça.
D'où mon appel à l'aide :wink:

En fait, il faut que la fonction base64_decode agisse, sur l'ensemble de mon fichier, entre les 35ème et 36ème ;
Modifié en dernier par guenfood le 03 avr. 2015, 09:15, modifié 1 fois.

Mammouth du PHP | 1029 Messages

03 avr. 2015, 09:08

Et moi je persiste à dire que le csv est incorecte, il y a bien de temps à autres 36 champs, mais pas sur toutes les lignes.
Essaye ce petit code et tu verras :

Code : Tout sélectionner

<?php $row = 1; if (($handle = fopen("UPDATEDB.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { $num = count($data); echo '<p><b>'.$num.' champs à la ligne'.$row.': <br /></b></p>'; $row++; for ($c = 0; $c < $num; $c++) { echo $data[$c] . '<br />'; } } fclose($handle); } ?>
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 23 Messages

05 avr. 2015, 21:56

Un petit retour.
J'ai pu avancer sur le code, malheureusement, ce n'est pas encore ça.
Pour info, voici les fichiers sources utilisés.
http://librairieduherisson.fr/data/UPDATEDB.csv
http://librairieduherisson.fr/data/stock.csv
http://librairieduherisson.fr/data/format.csv

Comme vous pouvez le voir dans le fichier stock.csv, seules sont reprises les infos de UPDATEDB.csv à partir du 35ème ";" mais tout ce qui est avant n'est pas repris.
Où cela pêche t'il dans le code ?
<?php
unlink("./data/UPDATEDB.csv");
unlink("./data/database.csv");
rename("./data/UPDATEDB.TXT", "./data/UPDATEDB.csv");
$fichier = fopen("./data/UPDATEDB.csv", "r");
// ouvre le fichier à lire

$newfichier = fopen("./data/stock.csv", "w");
// crée le fichier cible s'il n'existe pas ou écrase s'il existe déjà
fclose($newfichier);

$newfichier = fopen("./data/stock.csv", "a");
// on le rouvre en mode ajout pour qu'il ecrive à la fin du fichier sans écraser

if ($fichier) {
    // Si le fichier s'ouvre bien
    while (($line = fgets($fichier)) !== false) {
	    // lecture ligne par ligne
$line = iconv("UTF-8", "ISO-8859-1", $line);

	$write_line = $write_line . $line;
	   // on ajoute la ligne à la variable tampon write_line

	if (strpos($write_line,"#<SEPARATOR>#") !== false) {
	   // si le tampon contient un séparateur alors on ecrit la ligne dans le nouveau fichier

 //##### decode base 64 #####		
$arr_decode = explode(";",$write_line);
		//découpe la ligne CSV et stocke dans tableau
		$i_count = 0;
		$write_line_decode = "";
		//initialise la variable count et la variable tampon
		foreach( $arr_decode as $str_to_decode) {
		//parcours chaque colonne et incrémente le compteur
		$i_count = $i_count + 1;
			//si le compteur arrive à la 35e colonne
			if($i_count = 35) {
				//convertion base64
				$str_to_decode = 
base64_decode($str_to_decode);
			}
			//on reconstitue la ligne en concaténant dans une variable intermédiaire
			$write_line_decode = $write_line_decode . $str_to_decode . ";";
		}

		$write_line = $write_line_decode;
		//Une fois la boucle finie - fin de la ligne, on reaffecte la valeur convertie à la variable de départ
	//##### decode base 64 #####


		fwrite($newfichier, $write_line . "\n");

	   // puis on réinitialise le tampon
		$write_line = "";

	} else {
	   // sinon rien on passe a la ligne suivante
	}
    }
    fclose($fichier);
    fclose($newfichier);
} else {
    // si le fichier ne s'ouvre pas
}
file_put_contents('./data/database.csv', file_get_contents('./data/format.csv') . file_get_contents('./data/stock.csv') );
 ?>

Mammouth du PHP | 2278 Messages

06 avr. 2015, 08:59

jE VIENS D'OUVRIR UPDATE.CSV AVEC OPEN OFFICE:
Il y a deux sortes de lignes:
celles dont la colonne A (1 si tu préfères) contient un 1 : données lisibles et cohérentes
celles commençant par une incantation comme
Z2UgYWluc2kgcXVlIGxldXIgc2VucyB0YWN0aWxlLjwvZm9udD48L2Rpdj4=
Stock a une allure analogue...
qui ne contiennent rien d'utile.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD