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

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 : Script pour décoder une colonne d'un fichier csv

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

par sirakawa » 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.

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

par guenfood » 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') );
 ?>

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

par Maitrepylos » 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); } ?>

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

par guenfood » 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 ;

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

par @rthur » 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.

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

par guenfood » 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 ?

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

par Maitrepylos » 02 avr. 2015, 12:04

Heu il y a rien sur la 36 colonne en AJ donc dans un tableur

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

par guenfood » 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') );
 ?>