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 : 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
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,