IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Concaténation de lignes lors de l'écriture dans un fichier


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Juillet 2009
    Messages
    55
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2009
    Messages : 55
    Points : 43
    Points
    43
    Par défaut Concaténation de lignes lors de l'écriture dans un fichier
    Bonjour à tous,

    voici mon problème :

    je pars d'un fichier csv dans le lequel mes données sont rangées de la manière suivante :

    champ(1)/champ(2)/..../champ(n)

    mais sur certaines lignes de mon fichier csv j'ai cela :

    champ(1)/champ(2)/..../champ(i)
    suite du champ(i)/.../champ(n)

    Je souhaiterai réécrire correctement mes données dans un nouveau fichier csv.

    Mon but est ensuite de pouvoir importer ce nouveau fichier correctement réécrit dans une base MySQL.

    De plus, j'effectue des traitements sur mes lignes de données pour que je puisse correctement les exploiter par la suite.

    Grâce à mon code je parviens à réécrire mes données dans le nouveau fichier csv mais elles sont toujours sous la forme :
    champ(1)/champ(2)/..../champ(i)
    suite du champ(i)/.../champ(n)

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    <?php
    // On se connecte à la base
    	mysql_connect("localhost", "root", "");
    	mysql_select_db("bdd_evenementsmajeurs_backbonerbci");
     
    // ENREGISTREMENT DU FICHIER A IMPORTER ET VERIFICATIONS
    //---------------------------------------------------------------------
    // On enregistre le fichier sur le disque dans le dossier upload :
    //---------------------------------------------------------------------
    	if (!(isset($_POST['annuler']) or isset($_POST['mettreAJour'])))
    	{
    		$dossier = 'upload/'; 	// Dossier où tous les fichiers importés seront stockés
    		$fichier = basename($_FILES['ticket']['name']);	 // On récupère le nom du fichier
    		$taille_maxi = 100000; // On limite la taille des fichiers à 100ko
    		$taille = filesize($_FILES['ticket']['tmp_name']); // On récupère la taille du fichier chargé
    		$extensions = array('.csv'); //Extension du fichier à importer
    		$extension = strrchr($_FILES['ticket']['name'], '.'); // On récupère l'extension du fichier chargé
    		//Début des vérifications de sécurité...
    		if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
    		{
    			$erreur = 'Vous devez uploader un fichier de type csv ...';
    		}
    		if($taille>$taille_maxi) // Si le fichier chargé est trop gros
    		{
    			$erreur = 'Le fichier est trop gros...<br/> Vous êtes limité à 100ko';
    		}
     
    		//On formate le nom du fichier ici...
    		$fichier = strtr($fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 	'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    		$fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $fichier); // On remplace le nom du fichier chargé
    		}
    	// FIN DES VERIFICATIONS
     
    	if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
    	{
    // On regarde si le fichier a déjà été téléchargé
    	if (!(file_exists($dossier . $fichier))) // S'il n'existe pas, c'est qu'on le charge pour la première fois
    	{
    		move_uploaded_file($_FILES['ticket']['tmp_name'], $dossier . $fichier);
    					//--------------------------------------------------------
    // On ouvre le fichier pour effectuer les modifications :
    //--------------------------------------------------------
    		$handle = @fopen($dossier.$fichier, "r+"); // on ouvre le fichier chargé
    		$csv_ok = @fopen('C:\\Program Files\\wamp\\www\\projet_tickets\\admin\\upload_ok\\ok_' . $fichier, "w+"); // on ouvre le fichier sui sera chargé dans la base, s'il n'existe pas il est créé
    		// Test d'ouverture des fichiers
    		if (!($handle))
    		{
    		echo 'impossible d\'ouvrir le fichier' . $fichier . '<br/>';
    		}
    		else
    		{
    		echo $fichier . ' ouvert<br/>';
    		}
     
    		if (!($csv_ok))
    		{
    		echo 'impossible d\'ouvrir le fichier ok_' . $fichier . '<br/>';
    		}
    		else
    		{
    		echo 'ok_' . $fichier . ' ouvert<br/>';
    		}
     
    	// On regarde si le fichier est accessible en écriture
    		if (is_writable('C:\\Program Files\\wamp\\www\\projet_tickets\\admin\\upload_ok\\ok_' . $fichier))
    		{
    			$date_fr = "/([a-z]{3} \d{1,2}\/\d{1,2}\/\d{4} \d{1,2}\:\d{2})/";
    			$impact_pt = "/(\d{1}\,\d{2})/";
    			$impact_pondere = "/(\d{1,10}\:\d{2}\:\d{2})/";
    			// On effectue toutes les modifications nécéssaires
    				while(!feof($handle))
    				{
    					$ligne_en_cours = fgets($handle);
     
    					if (!feof($handle)) 
    					{
    					// On supprime les fins de ligne sur les lignes non complètes
    					if (!preg_match("/(\r)$/",$ligne_en_cours)) // \r correspond au retour chariot
    					{	
    					$ligne_en_cours = preg_replace("/(\r\n|\n|\r)/", "", $ligne_en_cours);
    					}
    	// On modifie les formats de date pour les exploiter dans MySQL
    					if(preg_match_all($date_fr, $ligne_en_cours, $datetrouvee, PREG_PATTERN_ORDER))
    					{
    					$date_a_modifier = $datetrouvee[0][0];
    					$date_a_mettre = datefr2en($datetrouvee[0][0]);
    					$ligne_en_cours = str_replace($date_a_modifier, $date_a_mettre, $ligne_en_cours);
    					}
    								if(preg_match_all($impact_pt, $ligne_en_cours, $impactTrouve, PREG_PATTERN_ORDER))
    					{
    						$impact_a_modifier = $impactTrouve[0][0];
    						$impact_a_mettre = modifImpact($impactTrouve[0][0]);
    						$ligne_en_cours = str_replace($impact_a_modifier, $impact_a_mettre, $ligne_en_cours);
    					}
     
    								if(preg_match_all($impact_pondere, $ligne_en_cours, $impactPondereTrouve, PREG_PATTERN_ORDER))
    								{
    									$impact_pondere_a_modifier = $impactPondereTrouve[0][1];
    									$impact_pondere_a_mettre = duree2sec($impactPondereTrouve[0][1]);
     
    									$ligne_en_cours = str_replace($impact_pondere_a_modifier, $impact_pondere_a_mettre, $ligne_en_cours);
    								}
     
    								$ligne_en_cours = str_replace("'", "_", $ligne_en_cours);
    								$ligne_en_cours = str_replace("; ", ";", $ligne_en_cours);
     
    								// On écrit que les bonnes lignes dans le fichier
    								if(preg_match("/^(\d{1,9})/",$ligne_en_cours))
    								{
    									if(strlen($ligne_en_cours))
    									{
    										fwrite($csv_ok,$ligne_en_cours);
    									}
    								}
    								else
    								{
    									fwrite($csv_ok,$ligne_en_cours);
    								}
     
    							}
    						}
    						echo 'Le chargement a été effectué</br>';
     
    					   // On n'oublie pas de fermer les fichiers
    						fclose($handle);
    						fclose($csv_ok);   
    					}
    					else 
    					{
    						echo 'Impossible d\'écrire dans le fichier ok_' . $fichier . '</br>';
    					}
     
     
    					// On charge le fichier correct dans la base
    					mysql_query("LOAD DATA INFILE 'C:/Program Files/wamp/www/projet_tickets/admin/upload_ok/ok_" . $fichier . "' INTO TABLE `qpr` FIELDS TERMINATED BY ';' (`oceane`,`date_debut`,`duree`,`gravite`,`equipement`,`type_vendor`,`nb_clients_impactes`,`commentaires`,`cause`,`coeff_impact`,`impact_pondere`)") or die(mysql_error());
    					?>

    Merci à tous pour votre aide

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    je suppose que la partie chargée de la concaténation des lignes est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // On supprime les fins de ligne sur les lignes non complètes
    if (!preg_match("/(\r)$/",$ligne_en_cours)) // \r correspond au retour chariot
    {	
    	$ligne_en_cours = preg_replace("/(\r\n|\n|\r)/", "", $ligne_en_cours);
    }
    ce qui signifie que tu supprimes les retours à la ligne si il n'y a pas de retours chariot dans la ligne. Il doit y avoir une logique dans cette idée, mais je dois avouer que j'ai du ma à voir la quelle
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre du Club
    Étudiant
    Inscrit en
    Juillet 2009
    Messages
    55
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2009
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    C'est bien ici qu'était l'erreur !
    Merci beaucoup

    Dans mon fichier csv, j'avais remarqué que les lignes correctes se finissaient par \r\n, ce qui permet bien d'avoir une nouvelle ligne après ;
    et que les lignes incorrectes n'avaient que \n en fin de ligne, ce qui me impliquait un retour à la ligne pour la suite.

    Pour info, dans Excel, si dans une cellule(ici, pour moi c'était des commentaires) on tape du texte avec un retour à la ligne alors le fichier csv créera une nouvelle ligne de données au lieu de continuer sur la même ligne !

    C'est pourquoi il me fallait résoudre ce problème pour charger correctement mes données dans ma base MySQL.

    En fait il fallait que je mette ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // On supprime les fins de ligne sur les lignes non complètes
    if (!preg_match("/(\r\n)$/",$ligne_en_cours)) // \r correspond au retour chariot
    {	
    	$ligne_en_cours = preg_replace("/(\r\n|\n|\r)/", "", $ligne_en_cours);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 04/04/2011, 14h56
  2. Comment sauter une ligne lors de l'ecriture dans un fichier
    Par Harald dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 29/05/2009, 18h01
  3. Réponses: 8
    Dernier message: 13/11/2006, 11h19
  4. Erreur E/S 32 lors de l'écriture dans un fichier text.
    Par yosthegost dans le forum Delphi
    Réponses: 6
    Dernier message: 01/06/2006, 11h45
  5. Passer à la ligne lors de l'écriture dans un fichier
    Par hams dans le forum Assembleur
    Réponses: 4
    Dernier message: 17/04/2005, 19h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo