Page 1 sur 1

utilisation des expression régulières

Posté : 29 sept. 2007, 09:54
par medmidou
Salut tout le monde
Je veux effectuer plusieurs modifications sur un fichier texte à travers une interface en PHP.
Alors j'ai utilisé ce code et ça marche très bien :
<?php
$fichier="fichier.txt";

if (file_exists($fichier))
{
if($ouvre=fopen("$fichier","r"))   /
{
while (!feof ($ouvre))         
	{
$lecture = fgets($ouvre, 512); 
$donnee=explode("<br>",$lecture);  
$combien=count($donnee)-1; 

for ($i=0;$i<=$combien;$i++)
	{

if (preg_match("#p0*#",$donnee[$i])){$donnee[$i]=preg_replace("#p0*#","/",$donnee[$i]);}
if (preg_match("#[A-Z]-9#",$donnee[$i])){$donnee[$i]=preg_replace("#-9#","9",$donnee[$i]);}
if (preg_match("#/r01s1b0*#",$donnee[$i])){$donnee[$i]=preg_replace("#/r01s1b0*#","-",$donnee[$i]);}


$liste_modif.=$donnee[$i]."";
	}
	}	
}
else 
{
echo "L'ouverture du fichier '$fichier' a echoué !!";
exit();
}
}
else 
{
echo "Le fichier '$fichier' n'existe pas !!";
exit();
}
fclose($ouvre);		// fermeture


$ouvre=fopen("texte.txt","w+");
fwrite($ouvre,$liste_modif);
echo "<center><b>Modification réussie </b></center>";
fclose($ouvre);
?>

Le problème maintenant ce que je veux effectuer trois autres traitements et je n'ai pas su comment?
D’abord voici le fichier texte, elle contient des centaines de blocs comme celui là :
================================================================================
PATH Abis TUN_1006
================================================================================

***** MAIN ROUTE *******

TUN9000-4/8c1
TUN9000-15/1
TUN9043-16/2
TUN9043-15/12
TUN9009-1/2
TUN9009-2/24c01

***** SPARE ROUTE *******

TUN9043-16/2
TUN9043-15/11
TUN9009-1/1
TUN9009-2/24c01


================================================================================
PATH Abis BAR_1017_2
================================================================================

***** MAIN ROUTE *******

TUN9001-2/17c01
TUN9001-1/2
TUN9043-15/5
TUN9043-3/17c1

1. Comment je peux enlever la première et la dernière ligne (les lignes en gras) à l'aide des expression régulières ou autre chose si c'est possible.


2. Comment je peux enlever les espaces a la fin de chaque ligne,j'ai utiliser cette expression régulière mais le problème qu'elle m'enlève même les sauts de ligne :

Code : Tout sélectionner

if (preg_match("#[[:space:]]*$#",$donnee[$i])){$donnee[$i]=preg_replace("#[[:space:]]*$#","",$donnee[$i]);}

3. Comment je peux enlever les sauts de lignes vides


Merci d'avance pour l'aide

Posté : 29 sept. 2007, 18:29
par ouckileou
Modération :
medmidou, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ

Posté : 30 sept. 2007, 13:52
par Berzemus
salut, en vitesse, sur base de ce que tu as dis:

Pour sélectionner la première ligne de chaque bloc:

Code : Tout sélectionner

(?<=\n\n)TUN[^\n]+
Pour sélectionner la dernière ligne de chaque bloc:

Code : Tout sélectionner

TUN[^\n]+(?=\n\n)
Pour sélectionner les espaces en fin de ligne:

Code : Tout sélectionner

([^\n])( )(?=\n)
(deuxième parenthèse capturante)

Pour les sauts de ligne vides, un simple replace, même pas regex:
remplacer \n\n par \n

ça devrait le faire..

Si t'as besoin d'éclaircissements , n'hésite pas.

Posté : 03 oct. 2007, 18:43
par medmidou
merci pour la réponse :) c'est trés gentil

en faite ce que je veux faire exactement c'est ça :

j'ai un fichier texte,j'ai utilisé les expressions régulières pour la formater et pour la rendre comme ça :

la fichier contient des centaines de blocs comme ces 2 là (taile du fichier 3Mo):
================================================================================
PATH Abis SFX_1022
================================================================================

***** MAIN ROUTE *******

SFX9015-B-5/10c1
SFX9015-B-15/6
SOS9004-15/9
SOS9004-3/18c1


================================================================================
PATH Abis TUN_1006
================================================================================

***** MAIN ROUTE *******

TUN9000-4/8c1
TUN9000-15/1
TUN9043-16/2
TUN9043-15/12
TUN9009-1/2
TUN9009-2/24c01

***** SPARE ROUTE *******

TUN9043-16/2
TUN9043-15/11
TUN9009-1/1
TUN9009-2/24c01
ce que je n'ai pas compris c'est comment insérer ces informations dans une table access avec ces spécifications :

la table contient 3 colonnes : (Nom_path, extrémité_1, extrémité_2)

je dois maintenant :

1-Insérer comme nouvelle enregistrement dans le colonne "nom_path" de la table access le nom du Path (celui devant Path)
par exemple "Abis TUN_1006" (le deuxième bloc)


2- je dois insérer dans le meme enregistrement (de la table) et dans le colonne "extrémité_1" la 2ème ligne (celle qui est souligné) et dans le colonne "extrémité_2" la 3ème (on ignore toujours la 1ère ligne, on ne l'insère pas).

et si on a un autre couple (une 4ème et 5ème ligne) avant la dernière ligne qui est avant **** spare root **** (on ignore toujours la dernière ligne, on ne l'insère pas aussi) alors on refait la meme chose, on insère la 4ème dans le colonne "extrémité_1" et la 5ème dans "extrémité_2" dans une nouvelle enregistrement (de la table) mais avec le meme nom du PATH.

alors j'obtiens dans ma table 2 enregistrements pour la 2ème bloc :
Abis TUN_1006 TUN9000-15/1 TUN9043-16/2
Abis TUN_1006 TUN9043-15/12 TUN9009-1/2

3-pour les ****.spare root **** meme chose mais on doit ajouter "P_"au nom du site.

alors mon 2ème bloc devient dans la table comme ça :

Abis TUN_1006 TUN9000-15/1 TUN9043-16/2
Abis TUN_1006 TUN9043-15/12 TUN9009-1/2
P_Abis TUN_1006 TUN9043-15/11 TUN9009-1/1

j'ai essayé de lire beacoup des documents en ce qui concerne l'insertion des données d'un fichier texte dans une base access, j'ai trouvé un algorithme mais qui fait une insertion simple et non pas avec l'utilisation des expressions régulières, le problème c'est que vraiment maintenant je n'ai plus de temps et en plus je ne suis pas pro en algorithme.
je sais que c'est dingue de vous demander de me faire un exemple bien précis mais c'est parce que je dois rendre ce travail juste aprés ce weekend.

Je me suis vraiment bloqué, Merci pour l'aide, merci encore.

Posté : 03 oct. 2007, 22:57
par Berzemus
ouhla.. sql, filemaker tout ce que tu veux, mais access..

peut-être par ODBC, je vais me renseigner demain.

a+

Posté : 04 oct. 2007, 00:00
par Patriboom
À mon avis, la façon la plus simple pour passer l'info texte à Access est un transit via un fichier CSV. Tu produis un fichier CSV où chaque contenu de champ est séparé par un point-virgule, chaque enregistrement par un saut de ligne. Tu récupères le-dit fichier avec un logiciel Microsoft. Le plus simple et efficace là-dedans est Excel. Tu peux même récupérer directement dans Access si tu respectes toutes les conditions existantes, hypothétiques, existentielles et probables et MonopolSoft. Ainsi, c'est facile.

Bref: fichier CSV, c'est une retour à une base ancestrale et toujours aussi efficace.

Ainsi tu auras au final:



TUN9000-4/8c1;TUN9000-15/1;TUN9043-16/2;TUN9043-15/12;TUN9009-1/2;TUN9009-2/24c01;
TUN9043-16/2;TUN9043-15/11,TUN9009-1/1;TUN9009-2/24c01;

etc.
Une ligne par enregistrement, tous séparés par des pt-virg.
Dans certaines versions, tu peux même te permettre de nommer les champs sur la première ligne et ce sera reconnu dans la table MsAccess

Posté : 04 oct. 2007, 09:06
par Berzemus
oui, ce sera sans doute plus simple que de configurer une source ODBC et d'y injecter le contenu.

Quoique c'est pas si compliqué.. il y avait Odbcphp, mais je sais pas ce qu'il est devenu.

Posté : 04 oct. 2007, 16:36
par medmidou
j'ai utilisé ce code pour la connexion ODBC et ça marche
<?php
$dbq = str_replace("/", "\\", $_SERVER["DOCUMENT_ROOT"]) . "\\tunisiana\bd5.mdb";
if (!file_exists($dbq)) { echo "Crap!<br />No such file as $dbq"; }
$db_connection = @odbc_connect("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$dbq", "ADODB.Connection", "", "SQL_CUR_USE_ODBC");
?>
et ce code pour l'insertion des données :
<?php


$suppr = "delete * from site ";
$res2 = odbc_do($db_connection,$suppr) or die(odbc_error());

$ouvre=fopen("texte.txt","r");  
while (!feof ($ouvre))          
	{

$lecture = fgets($ouvre, 4096); 
$donnee=explode("<br />",$lecture);  


$add_equip = "INSERT INTO site (nom_site) VALUES ('$lecture')";
$result = odbc_do($db_connection,$add_equip) or die(odbc_error());

}
fclose($ouvre);		// fermeture
?>
Ce code fonctionne correctement mais l'insertion se fait pou chaque ligne et dans un seul colonne.

comment on peut modifier ce code pour qu'il insère les données suivant les critères cités au dessus.??

Posté : 04 oct. 2007, 19:15
par Berzemus
tout est dans la requête sql, et dans ta façon de lire le fichier..
En fait, tu lis à chaque fois une ligne $lecture = fgets(..)
et a chaque fois tu l'inseres comme un nouvel enregistrement
"INSERT (..) VALUES ($lecture)".

Tu ne spécifie pas de champs dans lequel il faudrait enregistrer, ni comment.

Alors, résumons, je crois avoir plus ou moins compris ce que tu veux;

ta requête devrais ressembler a quelque chôse comme ceci:

Code : Tout sélectionner

INSERT INTO site (Nom_path, extrem_1, extrem_2) VALUES ('$path','$ext1','$ext2')

Pour récuperer les données, le meilleur est de d'abord lire le fichier dans une variable, avec file_get_contents (ou de toute autre façon):
$lecture = file_get_contents("text.txt");
et puis en t'amusant avec une boucle ou deux, c'est selon, récupères les infos avec les regex, et tu insères ^-^

Si tu as encore besoin d'un coup de pouce, n'hésite pas, je repasse souvent.