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 :

Effectuer un traitement sur 2 champs csv


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 487
    Par défaut Effectuer un traitement sur 2 champs csv
    Bonjour à tous,

    j'ai un webservice qui me crache des données sous cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "JAHR";"PERIODE";"VERSION";"EINHEIT";"PARTNER";"KATEGORIE";"GUV-KZ";"AUFTRAG";"BELEGNR";"BELEGART";"SATZNUMMER EINZELPOSTENSATZ";"LEDGER";"SATZART";"BUCHUNGSKREIS";"HERKUNFTSOBJEKT";"VORGANG";"EMPFAENGER OBJEKTART";"REFERENZBELEGNUMMER";"BUCHUNGSTEXT";"DEBITOR";"DEBITORNAME";"KREDITOR";"KREDITORNAME";"BETRAG IN EUR";"#VALUE"\r\n
    "2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194.25";"-0.19425"
    avec souvent beaucoup plus de lignes (et le nombre de colonnes peut être variable)

    mon but ce serait d'effectuer un traitement dans la seconde ligne sur les 2 dernières colonnes (entre autres remplacer le "." par une ",") ; en sortie j'ai besoin d'exactement du même format (avec les guillemets et les points virgules), c'est à dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "JAHR";"PERIODE";"VERSION";"EINHEIT";"PARTNER";"KATEGORIE";"GUV-KZ";"AUFTRAG";"BELEGNR";"BELEGART";"SATZNUMMER EINZELPOSTENSATZ";"LEDGER";"SATZART";"BUCHUNGSKREIS";"HERKUNFTSOBJEKT";"VORGANG";"EMPFAENGER OBJEKTART";"REFERENZBELEGNUMMER";"BUCHUNGSTEXT";"DEBITOR";"DEBITORNAME";"KREDITOR";"KREDITORNAME";"BETRAG IN EUR";"#VALUE"\r\n
    "2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194,25";"-0,19425"
    j'ai essayé plusieurs méthodes:

    1/ avec str_csv :
    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
    $mystring='"JAHR";"PERIODE";"VERSION";"EINHEIT";"PARTNER";"KATEGORIE";"GUV-KZ";"AUFTRAG";"BELEGNR";"BELEGART";"SATZNUMMER EINZELPOSTENSATZ";"LEDGER";"SATZART";"BUCHUNGSKREIS";"HERKUNFTSOBJEKT";"VORGANG";"EMPFAENGER OBJEKTART";"REFERENZBELEGNUMMER";"BUCHUNGSTEXT";"DEBITOR";"DEBITORNAME";"KREDITOR";"KREDITORNAME";"BETRAG IN EUR";"#VALUE"' . "\r\n";
    $mystring.='"2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194.25";"-0.19425"';
     
    $array1=str_getcsv($mystring,"\r\n");
     
    $array2=array_map(function ($theArray)
    {
    	$theArrayCsvToArray=str_getcsv($theArray,';','"');
     
    	$theValue1=$theArrayCsvToArray[count($theArrayCsvToArray)-1];
    	$theValue1=str_replace('.',',',$theValue1);
    	$theValue1=(strpos($orig,'E'))?substr($theValue1,0,strpos($theValue1,'E')):$theValue1;
     
    	$theValue2=$theArrayCsvToArray[count($theArrayCsvToArray)-2];
    	$theValue2=str_replace('.',',',$theValue2);
    	$theValue2=(strpos($orig,'E'))?substr($theValue2,0,strpos($theValue2,'E')):$theValue2;
     
    	$theArrayCsvToArray[count($theArrayCsvToArray)-1]=$theValue1;
    	$theArrayCsvToArray[count($theArrayCsvToArray)-2]=$theValue2;
    	return $theArrayCsvToArray;
    }
    ,$array1);
     
    print_r($array2);
    ça fonctionne mais il faut que je remette les guillemets et que je reimplose 2 fois, 1 pour les ";" et l'autre pour les \r\n. or pour des raisons de performances je souhaiterais me passer d'une ou deux itérations supplémentaire sur le tableau

    2/ en recherchant la position de chaque "\r\n" pour ensuite remonter aux 2 dernières colonnes mais ca n'est pas très pratique...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $mystring='"JAHR";"PERIODE";"VERSION";"EINHEIT";"PARTNER";"KATEGORIE";"GUV-KZ";"AUFTRAG";"BELEGNR";"BELEGART";"SATZNUMMER EINZELPOSTENSATZ";"LEDGER";"SATZART";"BUCHUNGSKREIS";"HERKUNFTSOBJEKT";"VORGANG";"EMPFAENGER OBJEKTART";"REFERENZBELEGNUMMER";"BUCHUNGSTEXT";"DEBITOR";"DEBITORNAME";"KREDITOR";"KREDITORNAME";"BETRAG IN EUR";"#VALUE"' . "\r\n";
    $mystring.='"2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194.25";"-0.19425"' . "\r\n";
    $mystring.='"2014";"5";"IST";"A100000";"Extern";"NA";"0000041310";"000050008680";"0011263941";"A";"000000000045695588";"8A";"0";"2383";"03";"RMRP";"00";"5105632164";"Kopierpapier ECONOMY, A4, 80 g/qm, ";"-194.25";"-0.19425"';
     
    $needle = "\r\n";
    $lastPos = 0;
    $positions = array();
     
    while (($lastPos = strpos($mystring, $needle, $lastPos))!== false) {
        $positions[] = $lastPos;
        $lastPos = $lastPos + strlen($needle);
    }
     
    print_r($positions);
    auriez vous une idée plus simple pour faire ça ?

    D'avance merci !

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Tu utilise mal le deuxième paramètre de la fonction str_getcsv. C'est ce qui te permet de définir le délimiteur de chaque champ, et non de chaque ligne. Celui-ci est par défaut la virgule, or dans ton cas c'est le point virgule, voilà pourquoi il te faut faire deux fois l'extraction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $array1=str_getcsv($mystring,';');

  3. #3
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 487
    Par défaut
    Bonjour Spartacusply et merci pour ta réponse,

    en fait selon moi je dois d'abord séparer les lignes (séparateur \r\n) puis les colonnes (séparateur ";") ; sinon comment identifier les 2 derniers champs de la ligne ?

    voilà pourquoi je fais 2 fois l'extraction avec 2 séparateurs différents

    ou alors je fais complètement fausse route ?

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Ok, en effet je vois le problème.

    En fait, la première séparation (avec "\r\n") devrait être faites dans la fonction str_getcsv (enfin pour moi logiquement, ça devrait être le cas). Or, en lisant les commentaires (notamment celui-là, http://php.net//manual/fr/function.s...csv.php#101888) de la doc il s'avère que... non. Ce qui nécessite dans tous les cas deux séparations, tu n'as pas le choix, ta fonction n'est pas si mal que ça.

    Après pour le chemin inverse, je suppose que tu vas bien finir par l'écrire dans un fichier cette string, tu peut donc te simplifier la tâche en utilisant directement la fonction fputcsv.

  5. #5
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 487
    Par défaut
    Ce qui nécessite dans tous les cas deux séparations, tu n'as pas le choix, ta fonction n'est pas si mal que ça.
    okay, alors qu'il en soit ainsi, je vais me débrouiller avec

    Après pour le chemin inverse, je suppose que tu vas bien finir par l'écrire dans un fichier cette string, tu peut donc te simplifier la tâche en utilisant directement la fonction fputcsv.
    en fait non, la chaine en bout de script est renvoyée dans une interface web qui a besoin de ce format pour l'interpréter.

    du coup fputcsv ne me semble pas utile içi. A moins de l'utiliser en combinaison avec les fonctions ob_* ? Est-ce possible du fait que fputcsv attend un fichier ouvert ?

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/03/2017, 18h45
  2. effectuer un test sur deux champ
    Par patmar83 dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/04/2009, 22h45
  3. Réponses: 3
    Dernier message: 07/08/2008, 11h17
  4. Réponses: 39
    Dernier message: 11/01/2007, 11h31
  5. [SQL2K][TSQL] effectuer un traitement sur un booléen
    Par pcdj dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/08/2006, 11h39

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