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 :

Peut on faire plus simple pour parser un csv/txt et reconstruire ? [Encodage]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Commercial
    Inscrit en
    Novembre 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Commercial
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 44
    Points : 33
    Points
    33
    Par défaut Peut on faire plus simple pour parser un csv/txt et reconstruire ?
    Bonjour à tous,

    Voici le code que j'utilise pour parser un fichier CSV et voici comment je reconstruit un autre fichier txt pour en faire un csv en faisant apparaitre les champs qui m’intéresse ensuite en stockant le résultat dans un fichier texte.

    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
    ?php
    $fichier = fopen("parserpdf.txt","w");
    $row = 1;
    $array = null;
    if (($handle = fopen("test.csv", "r")) !== FALSE)
     
    	{
    while (($data = fgetcsv($handle, 738, ";")) !== FALSE)
     
     
    	{
     
    $array[] = $data;
    }
    echo $array[0][0] ; // DATE EMISSION
     
    echo ';';
     
    echo $array[0][18] ; // MONTANT
     
    	echo ';';
     
    	echo $array[0][51] ; // MONTANT TVA
     
    	echo ';';
     
    //	Ajout Retour à la ligne dans le fichier texte.
    //	echo ' '. "\r\n";
     
    	echo $array[0][20] ; // affiche date
     
    	echo ';';
     
    	echo $array[0][30] ; // affiche valeur montant
     
    	echo ';';
     
    	echo $array[0][53] ; // affiche valeur montant
     
    	echo ';';
     
     
    //	Ajout Retour à la ligne dans le fichier texte.
    //	echo ' '. "\r\n";
     
    	echo $array[1][20] ; // affiche date
     
    	echo ';';
     
    	echo $array[1][30] ; // affiche valeur montant
     
    	echo ';';
     
    	echo $array[1][53] ; // affiche valeur montant
     
    	echo ';';
     
     
     
    fwrite($fichier, ob_get_contents());
    fclose($fichier);
    ob_end_flush();
     
    // FONCTION SUPPRESION <BR> dan sle fichier texte
     
    define('FICHIER', 'parserpdf.txt');
     
    $resultats =array();
    $mot = "<br>";
     
    /* Prend le contenu du fichier d'un coup */
    $content = file_get_contents(FICHIER);
    $pattern = $mot;
     
    /* cherche combien de fois il trouve le mot, le tableau de résultat sera dans... $resultats ;-) */
    $nb = preg_match_all($pattern, $content, $resultats);
     
    //if ($nb > 0) {
    //echo "$mot trouvé $nb fois";
     
    /* remplace toutes les occurences de $mot par "rien" */
    $content = str_replace($pattern, "", $content);
     
    /* Réécris le tout */
     
    $fp = fopen(FICHIER, "w") or die("camarchepo !!");
    fwrite($fp, $content);
    fclose($fp);
     exit;
     
     
     
     
    fclose($handle);
     
     
    ?>
    Mon hic je débute en php et je souhaite savoir s'il est possible de faire plus cours que :

    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
    echo $array[0][0] ; // DATE EMISSION
     
    echo ';';
     
    echo $array[0][18] ; // MONTANT
     
    	echo ';';
     
    	echo $array[0][51] ; // MONTANT TVA
     
    	echo ';';
     
    //	Ajout Retour à la ligne dans le fichier texte.
    //	echo ' '. "\r\n";
     
    	echo $array[0][20] ; // affiche date
     
    	echo ';';
     
    	echo $array[0][30] ; // affiche valeur montant
     
    	echo ';';
     
    	echo $array[0][53] ; // affiche valeur montant
     
    	echo ';';
     
     
    //	Ajout Retour à la ligne dans le fichier texte.
    //	echo ' '. "\r\n";
     
    	echo $array[1][20] ; // affiche date
     
    	echo ';';
     
    	echo $array[1][30] ; // affiche valeur montant
     
    	echo ';';
     
    	echo $array[1][53] ; // affiche valeur montant
     
    	echo ';';
    En gros le résultat me suffit mais je me dis qu'il doit y avoir plus simple pour lire chaque ligne de l'array sachant que je récupère toujours pour chaque ligne les mêmes valeurs.

    Merci d'avance,

    DkA.

    PS : DkA59 <= apprends à coder sans ses pieds

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne suis pas sûr de bien comprendre : tu ne veux lire que les deux premières lignes de test.csv ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    que ce soit en PHP ou avec un autre langage, le 1er réflexe est de remarquer le code qui se répète puisqu'il peut souvent se simplifier.
    si vous avez déjà ce réflexe alors que vous êtes "débutant" comme vous dites, vous allez rapidement améliorer votre code

    la 2e étape est de trouver comme simplifier le code et là il y a plusieurs façon suivant la façon de code de chacun. le plus important est que le résultat soit clair pour vous afin que votre code soit compréhensible si vous le relisez dans 3 mois.
    personnellement, j'aurais fait des boucles comme ça :
    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
    // 1re partie
     
    foreach ([0, 18, 51] as $index) {
     
    	echo $array[0][$index];
    	echo ';';
     
    }
     
     
    // 2e partie
     
    foreach ([0, 1] as $indexLigne) {
     
    	foreach ([0, 18, 51] as $index) {
     
    		echo $array[$indexLigne][$index];
    		echo ';';
     
    	}
     
    }

    ensuite la lecture et l'écriture peuvent aussi être réécrit comme suit
    ce n'est pas forcement plus rapide mais c'est juste mon style de codage que j'arriverai mieux à relire :
    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
     
     
    define('FICHIER_CSV', 'test.csv');
    define('FICHIER_RESULTAT', 'parserpdf.txt');
     
     
    // lecture du fichier CSV
     
    $array = [];
     
    if (($handle = fopen(FICHIER_CSV, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 738, ";")) !== FALSE) {
            $array[] = $data;
        }
    }
     
    fclose($handle); // relacher le fichier CSV dont on n'a plus besoin
     
     
    // construction du contenu 
     
    $contenu = "";
     
    // 1re partie
     
    foreach ([0, 18, 51] as $index) {
        $contenu .= $array[0][$index] . ';';
    }
     
     
    // 2e partie
     
    foreach ([0, 1] as $indexLigne) {
     
        foreach ([0, 18, 51] as $index) {
            $contenu .= $array[$indexLigne][$index] . ';';
        }
     
    }
     
     
    // traitement
     
    $mot = "<br>";
    $pattern = $mot;
     
    /* remplace toutes les occurences de $mot par "rien" */
    $contenu = str_replace($pattern, "", $contenu);
     
     
    // enregistrement dans le fichier
     
    file_put_contents(FICHIER_RESULTAT, $contenu);

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Sinon il y a une technique de prime abord plus compliquée mais qui offre des possibilités de recherches/remplacements beaucoup plus aisées :

    On crée une table sqlite en mémoire dans laquelle on charge le contenu du csv. Et par magie on se retrouve donc avec toutes les fonctions sql pour faire des recherches, modifications etc. Et si le csv est très gros, on peut monter la table dans un fichier temporaire pour économiser la mémoire serveur.

    Bref ça paraît peut être compliqué mais pas tant que ça et c'est puissant et très agréable à utiliser puisqu'il suffira de faire des requêtes pdo. Si cela t'intéresse j'avais laissé un exemple complet (fonctionnel) ici. Le code pour créer les tables n'est pas vraiment à la portée d'un débutant (on fait pas ça tous les jours...) mais il est fourni et assez générique donc si tu maîtrises un peu les requêtes sql/pdo tu pourras t'en servir.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Commercial
    Inscrit en
    Novembre 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Commercial
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 44
    Points : 33
    Points
    33
    Par défaut
    Un grand merci Mathieu pour vos explications ( et la simplicité de celle-ci) pour la lecture du fichier je pensais qu'il n'était pas possible de le relâcher avant d'avoir cesser de l'utiliser, et effectivement je débute , en gros je ne code que lorsque j'ai besoin d'une fonctionnalité précise (ou quand je ne connais pas la commande magique qui peut me simplifier et éviter un script complet) sachant que je crée ces outils pour d'autres autant que cela soit le plus propre possible.

    Merci également a ABCIWEB , votre méthode est très intéressante également pour le coup je vais la tester de suite sachant qu'en plus.... initialement je réinjecte le résultat dans une base sql ! autant dire qu'il tombe à pique et comme en plus je joue plus souvent avec SQL/ACCESS..... autant dire que vous faites un heureux

    Questions complémentaires : Maintenir la lecture d'un fichier consomme plus de mémoire ou le fait de la relâcher en libère plus ?

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par DkA59 Voir le message
    Questions complémentaires : Maintenir la lecture d'un fichier consomme plus de mémoire ou le fait de la relâcher en libère plus ?
    Tu peux faire des tests avec memory_get_usage() pour voir la consommation mémoire. Cela dit quand on ouvre un fichier on le ferme dès qu'on en a plus besoin, il peut aussi exister des problèmes d'accès concurrentiels en plus de la consommation mémoire.
    Dans son code, mathieu referme le fichier dès qu'il a stocké le contenu utile dans un tableau. C'est la méthode habituelle avec fopen que tu retrouveras dans tous les exemples de code.

    La méthode avec SplFileObject gère la fermeture du fichier automatiquement dès que le code n'en a plus besoin. Mais on peut la fermer manuellement si besoin en afffectant la valeur null à la ressource. Par exemple dans mon code tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //...
     
    // Insertion des données csv dans la table
    while($row = $file->current())
    {		
        $stmt->execute($row);
        $file->next();
    }
     
    // maintenant on a plus besoin de la ressource 
    $file = null;
     
    //...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/11/2009, 18h00
  2. peut on faire plus simple.
    Par dinette dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/08/2009, 14h50
  3. y a t il plus simple pour faire un wget en c++
    Par simoelasimo dans le forum C++
    Réponses: 9
    Dernier message: 26/10/2008, 23h59
  4. Comment faire plus simple
    Par mobscene dans le forum Langage
    Réponses: 5
    Dernier message: 26/07/2005, 04h12
  5. Réponses: 10
    Dernier message: 24/05/2005, 14h09

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