Page 1 sur 1

Lire un fichier texte à colonnes fixes

Posté : 28 août 2008, 10:49
par mcorgnet
Bonjour,

J'ai un fichier texte à traiter, qui contient des colonnes fixes (en octets). En gros, quand une colonne fait 30 octets et que la valeur enregistrée dedans fait 8 octets, 22 octets sont remplis avec des espaces.

Donc, j'ai besoin de récupérer certaines colonnes dans ce fichier, et je ne sais absolument pas comment m'y prendre.


Extrait de quelques lignes du fichier :

Code : Tout sélectionner

1 BAT 1 HLM Residence de l AU SAP96240778 RDC 1VILLAGE-NEUF 0 R3 026/07/200715:48:48 629 628 1m3 0 1l 1 0 0 1 BAT 1 HLM Residence de l AU SAP96240780 RDC 2VILLAGE-NEUF 0 R3 026/07/200715:49:34 331 330 1m3 0 1l 1 0 0
Merci de votre aide.

(oups, je crois que j'ai posté dans le mauvais forum ...)

Posté : 28 août 2008, 11:37
par sadeq
En utilisant les fonctions : fopen(), fread() et fclose() on peut lire un fichier texte. fread() peut lire dans une ligne du fichier un certain nombre d'octets, il suffit d'en préciser le nombre.

Ainsi, puisque tu connait les tailles des colonnes en octets, tu peux faire des fread() de tant d'octets pour chaque lecture de colonne.

Voici un exemple commenté:
<?php
//Format d'une ligne (taille des colonnes fixes en octets)
$taille_col1 = 5; //Colonne 1 de taille 5 octets
$taille_col2 = 20;
$taille_col3 = 10;

//Fichier à format fixe pour l'exemple
$contenu = <<<TEXT
1....BAT 1...............HLM.......
2....BAT 2...............XML.......
TEXT;
// Imaginez que les points .... sont des espaces

//Ecrire le fichier
file_put_contents("fichierFixe.txt", $contenu);

//Lire le fichier et exploiter les données (colonnes)
$f = fopen("fichierFixe.txt", "r");
while (! feof($f)) //Parcourir le fichier jusqu'à sa fin (feof = End Of File)
{
	//lire les colonnes d'une ligne par taille
	$col1 = fread($f, $taille_col1); 
	$col2 = fread($f, $taille_col2);
	$col3 = fread($f, $taille_col3);
	$retour_chariot = fread($f, 1); //La fin d'une ligne est marquée par 1 octet de retour chariot
	//afficher les données
	echo sprintf("<p>Col1= %d, Col2= %s, Col3= %s</p>", trim($col1), trim($col2), trim($col3));
}
fclose($f);
?>

Posté : 28 août 2008, 11:46
par mcorgnet
C'est exactement ce que je cherchais.

Merci beaucoup de ton aide.