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 :

Formatage .txt suppression de certain \n [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut Formatage .txt suppression de certain \n
    Bonjour, devant faire de l'import de base à partir d'un fichier .txt que je ne peux modifier, je me heurte à un petit soucis :

    - un champ commentaire est mal formaté et comporte des \n qui sont aussi mes caractères de fin de ligne pour mon LOAD DATA INFILE ce qui provoque une erreur puisque mysql détecte deux lignes aux lieu d'une.

    - j'essaye donc de purger mon fichier mais je n'arrive à rien de satisfaisant voici comment je pensais procéder: chaque ligne d'insert commence par un champ qui est soit: _SO , _SE , _NE, _OU , _U1

    j'essaye donc de détecter toute les lignes ne commençant pas par ca pour les concaténer avec les précédentes .

    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
    <?
    //ouverture fichier
    $chemin="brasil_g4_listage_des_broches_ou_ports_hsm_plaque_idf.txt";
    $lines=file($chemin,FILE_SKIP_EMPTY_LINES );
    $i=0;
    foreach ($lines as $line_num => $line) {	
    	//test si 3premiers carac = idplaque
    	if($line != ''){
    	eregi('([0-9A-z]{3})', $line, $out);
    	if($out[0] != "_SE" && $out[0] != "_S0" && $out[0] != "_U1" && $out[0]!="_NE" && $out[0]!="_OU" && $line_num != 0 && $line_num != 1){
    		//on enleve le \n de la ligne précedente
    		$piece[0]=substr_replace($line0  , " "  , -2  );
    		$piece[1]=$line;
    		$line0=implode(" ",$piece);	
    		$fich[]=$line0;	
    	}
    	else {
    		if(isset($line0))$fich[]=$line0;
    		$line0=$line;
    	}
    }
    file_put_contents  (  "test.txt"  ,$fich);
    ?>
    je n'arrive à rien de bon aurait vous une solution via les regex que je ne maitrise pas du tout

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 376
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 376
    Billets dans le blog
    17
    Par défaut
    Dis-moi si je me trompe : finalement tu veux remplacer les "\n" par des " ", non ?
    Dans ce cas un simple str_replace( ) suffit.

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 376
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 376
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Dis-moi si je me trompe : finalement tu veux remplacer les "\n" par des " ", non ?
    Dans ce cas un simple str_replace( ) suffit.
    Hum non laisse tomber

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 376
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 376
    Billets dans le blog
    17
    Par défaut
    Voici ce que je ferai :
    1. Initialisation d'un buffer et parcours des lignes
    2. Si ligne commence par un des id : ajout au buffer d'un retour à la ligne + ligne
    3. Sinon : on se retrouve avec un commentaire à la ligne, ajout d'un espace blanc et de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $lines = file($chemin, FILE_SKIP_EMPTY_LINES) ;
    $ids = array('_SO', '_SE', '_NE', '_OU', '_U1') ;
    $buffer = '' ; // Contient le fichier nettoyé
    foreach ( $lines as $line ) {
        if ( in_array(substr($line, 0, 3), $ids) ) {
            // Ligne commençant par _SO, _SE, etc.
            $buffer .= "\n" . $line ;
        } else {
            // Ligne ne commençant pas par _SO, _SE, etc. = commentaire
            // Ajout au buffer...
            $buffer .= ' ' . $line ;
        }
    }
    $buffer = substr($buffer, 1) ; // Suppression du 1er \n

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Merci de t'intéresser au problème je regarde ta solution

    ton idée est bonne est plus facile à réaliser juste quelque petit soucis:
    - tu rajoute un \n or il existe déjà à la fin des lignes donc rajout d'une ligne blanche entre chacune de mes lignes d'insert

    - le \n contenu ds le champ commentaire n'est pas supprimé

    j'essaye dajuster ca

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Voici la solution qui me sort un résultat propre je te remercie:

    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
    $lines = file($chemin, FILE_SKIP_EMPTY_LINES) ;
     
    $ids = array('_SO', '_SE', '_NE', '_OU', '_U1') ;
    //recupération des deux premières lignes qui ne sont pas concernées
    $buffer = array_shift  ( $lines );  
    $buffer .= array_shift  ( $lines );  
    foreach ( $lines as $line_num => $line ) {
        if ( in_array(substr($line, 0, 3), $ids)) {
            // Ligne commençant par _SO, _SE, etc.
            $buffer .= $line ;
        } else {
            // Ligne ne commençant pas par _SO, _SE, etc. = commentaire
            // suppression du \n
    		$buffer = substr($buffer,0,-1);
    		//mise en buffer
            $buffer .= ' ' . $line ;
        }
    }
    //ecriture fichier
    file_put_contents  (  "test.txt"  ,$buffer);

  7. #7
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 376
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 376
    Billets dans le blog
    17
    Par défaut
    Ah oui zut il me semblait que file( ) supprimait les retours à la ligne, mais non je vois qu'il faut rajouter l'option FILE_IGNORE_NEW_LINES
    A+

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Ah oui zut il me semblait que file( ) supprimait les retours à la ligne, mais non je vois qu'il faut rajouter l'option FILE_IGNORE_NEW_LINES
    A+
    oui mais non car du coup tout mon fichier était rassemblé sur $lines[0]


  9. #9
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 376
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 376
    Billets dans le blog
    17
    Par défaut
    Bon faut que je révise file( ) sérieusement

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/07/2009, 17h00
  2. Réponses: 2
    Dernier message: 05/06/2008, 10h51
  3. Suppression de certains enregistrements d'un import
    Par CinePhil dans le forum Requêtes
    Réponses: 5
    Dernier message: 19/03/2008, 09h39
  4. Suppression de certains caractères dans une chaine
    Par Tchupacabra dans le forum Langage
    Réponses: 2
    Dernier message: 05/12/2007, 12h08
  5. Réponses: 2
    Dernier message: 13/02/2007, 11h46

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