Concaténation contenus fichiers xml
Bonjour à tous,
Une application tierce (dont je ne peux rien modifier car prestataire extérieur) génére 2 fichiers xml par dossiers traités (un fichier entête et un fichier détail). Seul la 1ère lettre dans le nom de ces deux fichiers changent (Exxxx.xml pour entête et Dxxxx.xml pour détail). Ensuite, tous les fichiers sont copiés dans un répertoire unique. On retrouve dans ce répertoire :
Exxxx1.xml
Dxxxx1.xml
Exxxx2.xml
Dxxxx2.xml
et ainsi de suite en fonction du nombre de dossiers traités.
Je dois boucler sur ce répertoire et concaténer les deux fichiers xml qui appartiennent au même dossier (concaténer Exxxx1.xml avec Dxxxx1.xml).
J'ai réalisé un code qui fonctionne mais je pense qu'il y a moyen de faire mieux. Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
<?php
//Cette fonction va permettre d'écrire dans un fichier de LOG.
function ecrire_log($str_log) {
$ddmmyyhhmmss = date("d-m-Y H:i:s");
$a_ecrire = "[".$ddmmyyhhmmss." : ]" . $str_log . " " ."\r\n";
$filename = "log/concat_xml_ap.log";
fwrite(fopen($filename, 'a+'), $a_ecrire);
}
// Fonction qui permet d'ouvrir un fichier et d'enrichir le fichier temporaire
function concat_xml($fichier,$fichier_tmp) {
if (is_file($fichier)) {
if ($TabFich = file($fichier)) {
for($j = 0; $j < count($TabFich); $j++) {
// ouverture du fichier en écriture
$fp = fopen($fichier_tmp,"a");
fputs($fp, "$TabFich[$j]");
fclose($fp);
}
}
}
else {
// On écrit dans le log
ecrire_log("ERREUR ! $fichier n'est pas un fichier xml !");
}
}
// Déclaration fichier temporaire pour la concaténation
$fichier_tmp = "concat_xml_ap.xml";
// On déclare 2 tableaux qui contiendront respectivement les fichires d'entête et les fichiers détails des flux AP
$tableau_entete = array();
$tableau_detail = array();
// On ouvre le dossier que l'on doit traiter
$dossier = opendir ('.');
while ($fichier = readdir ($dossier)) {
if ($fichier != '.' && $fichier != '..') {
// on stocke le nom des fichiers entetes dans un tableau
if (preg_match("/^E/", $fichier)) {
$tableau_entete[] = $fichier;
}
// on stocke le nom des fichiers detail dans un tableau
if (preg_match("/^D/", $fichier)) {
$tableau_detail[] = $fichier;
}
}
}
closedir ($dossier);
// Compte le nombre de fichiers pour chaque tableau
$nbfichiers_entete = count($tableau_entete);
$nbfichiers_detail = count($tableau_detail);
// Si le nombre de fichiers est identique entre les 2 tableaux (même nombre de fichiers entête que détails, c'est bon)
if ($nbfichiers_entete == $nbfichiers_detail) {
// On écrit dans le log
ecrire_log("Le nombre de fichiers entête est identique au nombre de fichiers détails.");
// On effectue un tri sur les entrées du tableau
sort($tableau_entete);
sort($tableau_detail);
// On boucle sur le nombre de fichiers
for ($i=0; $i<$nbfichiers_entete; $i++){
// On vérifie que nom du lot entre le fichier entete et le fichier détail est identique
$entete = substr("$tableau_entete[$i]",1,20);
$detail = substr("$tableau_detail[$i]",1,20);
// Les 3 = permettent de vérifier que les valeurs sont de même type et identique
if ($entete === $detail) {
concat_xml($tableau_entete[$i],$fichier_tmp);
concat_xml($tableau_detail[$i],$fichier_tmp);
//On copie les fichiers qui ont servi à la concaténation dans un autre répertoire
rename($tableau_entete[$i],"sav_xml/$tableau_entete[$i]");
rename($tableau_detail[$i],"sav_xml/$tableau_detail[$i]");
rename($fichier_tmp,$tableau_detail[$i]);
}
else {
// On écrit dans le log
ecrire_log("Le fichier $tableau_entete[$i] est different du fichier $tableau_detail[$i].");
//On copie les fichiers en erreur dans un autre répertoire
rename($tableau_entete[$i],"ko_xml/$tableau_entete[$i]");
rename($tableau_detail[$i],"ko_xml/$tableau_detail[$i]");
}
}
}
else {
// On écrit dans le log
ecrire_log("ERREUR ! Il n'y a pas le même nombre de fichiers entete et detail.");
}
?> |
Tout fonctionne, mais quelque chose me gêne et je vais essayer de vous l'expliquer. Mes 2 tableaux sont triés. J'ai donc :
tableau_entete : Exxxx1.xml puis Exxxx2.xml .... etc
tableau_detail : Dxxxx1.xml puis Exxxx2.xml ....ect
Mon problème est le suivant si j'ai :
tableau_entete : Exxxx1.xml puis Exxxx3.xml (le n° 2 a disparu)
tableau_detail : Dxxxx1.xml puis Dxxxx2.xml
La concaténation va fonctionner pour Exxx1 et Dxxx1.xml. Mais pour les autres, du fait qu'il manque Exxxx2.xml tout est décalé et la condition d'égalité n'est plus respecté. Or, Exxxx3.xml existe avec Dxxxx3.xml. Comment faire pour continuer à concaténer lorsque l'entête et le détail sont présent malgré un décalage ?
Est-ce assez claire ou pas ?
Merci pour vos conseils et retour.
Cordialement,