|
|
|
|
Bonjour,
Je transfère des données d'un logiciel à un autre via un fichier texte que je fais parser par l'utilisateur via une adresse web locale d'un serveur linux debian (apache2,php4)
La moulinette qui "parse" le fichier lignepar ligne permet de "formater" les champs et d'enregistrer le nouveau fichier pour que l'autre logiciel veuille bien l'importer (le séparateur de champ est la virgule).
Une ligne type est représentée ainsi que suit :
champ1,champ2,champ3,champ4,champ5,etc,champ de la 7ième virgule,,,,champ11
et se termine par un retour à la ligne.
Je souhaite modifier une chaine après la 7ième virgule..Je n'y arrive vraiment pas.J'ai essayé à peu près tout ce que je sais faire en php.
Il me semble possible de le faire en alimentant une base SQL à partir de mon fichier texte, ainsi je pourrais balader mon "pointeur" dans le 7ième champ des lignes matchées et y faire ce que je veux. le volume d'information traitée etant faible( un fichier type comporte 200 lignes) je le ferais que si je n'ai pas d'autre choix.
Je pense qu'il est aussi possible de faire un appel system vers sed ou awk afin de traiter les lignes.je suis en train de regarder de ce coté là pour l'instant.
Il existe trés certainement d'autre solution dans d'autre langage, comme par exemple perl. Mais cela impliquerait de refaire complètement le script.Au cas ou quelqu'un aurais une solution dans un autre langage, c'est à ma portée de réécrire complètement le script.
Toute aide est la bienvenue, merci d'avance ;-)
Configuration: Windows XP Internet Explorer 6.0
J'ajoute la portion du code concerné.
// verif fichier de donnée
if(file_exists('import.txt'))
{
// on efface le précedent export
if(file_exists('export.txt'))
{
unlink('export.txt');
}
$FicEntree = fopen("import.txt", "r");
$FicSortie = fopen("export.txt", "w+");
echo '<br>Generation des lignes d\'ecritures<br>';
while (!feof($FicEntree))
{ $buffer = fgets($FicEntree, 4096);
$search = '"';
$replace = '';
$result0 = str_replace($search, $replace, $buffer);
$search = ',,';
$replace = ',';
$result1 = str_replace($search, $replace, $result0);
$search = 'VT,0';
$replace = 'VT,411000,';
$result2 = str_replace($search, $replace, $result1);
$search = '707100,';
$replace = '707100,,';
$result3 = str_replace($search, $replace, $result2);
$search = '445710,';
$replace = '445710, ,';
$result4 = str_replace($search, $replace, $result3);
$search = '708500,';
$replace = "708500,,";
$result5 = str_replace($search, $replace, $result4);
$search = ',C';
$replace = '';
$result6 = str_replace($search, $replace, $result5);
$mystring = $result5;
$findme = ',C';
$pos = strpos($mystring, $findme);
if ($pos === false)
{
// etat inintéressant, la chaine n'est pas présente.
// ce n'est pas fatal.
}
else
{
// ici je souhaite altérer la ligne courante , mais je ne sais pas comment m'y prendre.
// je dois insérer une virgule après la 7ième virgule en partant de la gauche.
// C'est ici mon problème
}
// saut de ligne html
$search = ',EUR';
$replace = ',EUR<br>';
$result7 = str_replace($search, $replace, $result6);
// on écrit les données dans le fichier de sortie sans la modif html
fputs($FicSortie,$result6, 4096);
// on affiche les données pour le navigateur
echo $result7;
}
}
else
{
echo '<br><font color=red size=3><center>ERREUR FATALE : Le fichier import.txt n\'existe pas</center></font><br>';
exit;
}
echo 'Generation terminée<br>';
echo 'Fermeture des fichiers<br>';
fclose($FicEntree);
fclose($FicSortie);
|
Ca marche mais..enfin pas tout à fait. Je m'explique en isolant 3 lignes types.
$mystring = $result5;
$findme = ',C';
$pos = strpos($mystring, $findme);
if ($pos === false)
{}
else
{
$result6 = ereg_replace("(([^,]*,){7})(.*)", "\\1,\\3", $mystring);
}
//$search = ',C';
//$replace = '';
//$result7 = str_replace($search, $replace, $result6);
$search = ',EUR';
$replace = ',EUR<br>';
$resulthtml = str_replace($search, $replace, $result6);
// on écrit les données dans le fichier de sortie sans la modif html
fputs($FicSortie,$result6, 4096);
// on affiche les données pour le navigateur
echo $resulthtml;
|
Je continue à bosser dessus ^^ des choses doivent m'échapper.
|
Par contre ceci oui :
-------snip---------
$result5 = str_replace($search, $replace, $result4);
$mystring = $result5;
$findme = ',C';
$pos = strpos($mystring, $findme);
if ($pos === false)
{$result6=$result5;}
else
{
echo'<font color=red size=4>|</font>';
$result6 = ereg_replace("(([^,]*,){7})(.*)", "\\1,\\3", $mystring);
}
$search = ',C';
$replace = '';
$result7 = str_replace($search, $replace, $result6);
$search = ',EUR';
$replace = ',EUR<br>';
$resulthtml = str_replace($search, $replace, $result7);
fputs($FicSortie,$result7, 4096);
echo $resulthtml;
----snip----
le fameux etat pas intéressant dans ma boucle if plus haut , en fait il est interessant puisqu'il permet de dire à la boucle while (!feof()) ne touche pas à cette ligne. C'est ça qui m'échappais! ----- J'ai des incohérences cependant , mais ça ne concerne plus ce problème précis.Voici : Soit le morceau de ligne non parsée suivant ( ... ) VT,0YYYYYYY, ( ....) D'après la moulinette ça devrait devenir ( .... ) VT,411000,YYYYY, ( ....) Or voici ce qui arrive parfois seulement : ( ... ) VT,411000YYYYY, ( .....) Cela arrive sur 3-4 lignes par fichier.Il y a surement une explication rationelle à ceci. Une particularité de la ligne, ou peut-etre que les fichiers sont hantés tout simplement. En tout cas on peux considérerle problème principal comme résolu.Et pour être plus précis, c'est un transfert de comptabilité EBP gestion commerciale v9 vers SAGE v14. Merci encore ! PS : le code complet, peut-etre servira t'il à quelqu'un ayant le meme problème.
<?php
echo '<br>Initialisation du traitement ...<br>';
echo '<br>Les donnees seront sauvegardees dans : export.txt';
echo '<br>Ouverture des fichiers ...<br>';
echo '<br>Si une ligne ne parait pas conforme , verifiez toujours export.txt<br>';
// verif fichier de donnée
if(file_exists('import.txt'))
{
if(file_exists('export.txt'))
{
unlink('export.txt');
}
$FicEntree = fopen("import.txt", "r");
$FicSortie = fopen("export.txt", "w+");
echo '<br>Generation des lignes d\'ecritures<br>';
while (!feof($FicEntree))
{
$buffer = fgets($FicEntree, 4096);
$search = '"';
$replace = '';
$result0 = str_replace($search, $replace, $buffer);
$search = ',,';
$replace = ',';
$result1 = str_replace($search, $replace, $result0);
$search = 'VT,0';
$replace = 'VT,411000,';
$result2 = str_replace($search, $replace, $result1);
$search = '707100,';
$replace = '707100,,';
$result3 = str_replace($search, $replace, $result2);
$search = '445710,';
$replace = '445710, ,';
$result4 = str_replace($search, $replace, $result3);
$search = '708500,';
$replace = "708500,,";
$result5 = str_replace($search, $replace, $result4);
$mystring = $result5;
$findme = ',C';
$pos = strpos($mystring, $findme);
if ($pos === false)
{$result6=$result5;}
else
{
$result6 = ereg_replace("(([^,]*,){7})(.*)", "\\1,\\3", $mystring);
}
$search = ',C';
$replace = '';
$result7 = str_replace($search, $replace, $result6);
$search = ',EUR';
$replace = ',EUR<br>';
$resulthtml = str_replace($search, $replace, $result7);
fputs($FicSortie,$result7, 4096);
echo $resulthtml;
}
}
else
{
echo '<br><font color=red size=3><center>ERREUR FATALE : Le fichier import.txt n\'existe pas</center></font><br>';
exit;
}
echo 'Generation terminée<br>';
echo 'Fermeture des fichiers<br>';
fclose($FicEntree);
fclose($FicSortie);
?>
Merci encore Xavier ;-) |
HMM :)
$findme = ',C'; $pos = strpos($mystring, $findme); Il convient de préciser que $findme = ',C,' ceci afin de ne pas matcher un autre champ que ,C, et pour la même raison : $search = ',C'; $replace = ' '; $result7 = str_replace($search, $replace, $result6); Il convient de préciser $search =',C,' et replace = ',' ceci élimine des petits problèmes. |
Salut.
|