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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| function boosFileToXmlFile($path){
// je recupere le contenu du fichier
$lines_arr = file($path);
// je met tout le contenu sur une seule ligne (1 seule chaine de caracteres)
$line_str = implode("" , $lines_arr);
// je supprime de cette ligne tout les caracteres de retour chariot et de nouvelle ligne
// c'est trop casse couilles à gérer.
// (je crois que le "\n\r" ne sert à rien mais bon...)
$patterns_arr = array("\r\n", "\n\r", "\n", "\r");
$replacements_str = '_CRLF_';
$lineWithoutCRLF_str = str_replace($patterns_arr, $replacements_str, $line_str);
// je sectionne la chaine de caractere en 'boos' (d'une balise "BOOS|" à la suivante en supprimant le "BOOS|")
// je met donc dans une case du tableau seulement ce qu'il y a entre 2 "BOOS|"
// ...j'obtiens une chaine de caractere par case correspondant a un ensemble 'boos' avec chaque paire cle/valeur du 'boos' separer par un "_CRLF_"
$boosStringSection_arr = explode('BOOS|', $lineWithoutCRLF_str);
// je supprime la premiere case du tableau qui contient tout ce qui etait avant le premier "BOOS|"
// cela correspond au header du fichier texte
$header_str = array_shift($boosStringSection_arr);
// Traitement particulier de la derniere case du tableau car elle contient un ensemble 'boos' et le footer du fichier texte.
// Extraction du footer :
$lastBoosWithFooter_arr = explode('BOOE|', end($boosStringSection_arr));
$footer_str = $lastBoosWithFooter_arr[1];
$boosStringSection_arr[count($boosStringSection_arr)-1] = $lastBoosWithFooter_arr[0] . 'BOOE|_CRLF_';
echo '____________________________________________' . $this->br;
echo 'CHAINE CORRESPONDANT AU HEADER' . $this->br . $header_str . $this->br2;
echo '____________________________________________' . $this->br;
echo 'CHAINE CORRESPONDANT AU FOOTER' . $this->br . $footer_str . $this->br2;
// maintenant je vais traiter chaque paire clé/valeur d'une chaine 'boos'
// c'est-a-dire les "PBLS|Hachette" et compagnie...
// et tout mettre dans un super mega tableau de ouf sa mere !
$boosXmlSource_arr = array();
echo '____________________________________________' . $this->br;
echo count($boosStringSection_arr) . " SECTION BOOS DETECTEES." . $this->br2;
// pour chaque ligne 'boos'
foreach ($boosStringSection_arr as $boosKey => $boosValue) {
// je met dans chaque case d'un tableau temporaire une paire clé/valeur
$currentBoos_arr = explode('_CRLF_', $boosValue);
// je supprime la premiere et la derniere case de ce tableau car elle sont vide.
// c'est normal, due au traiement str_replace et explode plus haut.
// je supprime aussi l'avant derniere, inutile dans le fichier xml car elle correspond à une balise "BOOE|"
// qui ne sert qu'a marquer la fin d'une balise "BOOS|"
array_shift($currentBoos_arr);
array_pop($currentBoos_arr);
array_pop($currentBoos_arr);
echo '____________________________________________' . $this->br;
echo 'CHAINE BOOS N° ' .$boosKey . $this->br;
echo 'LONGUEUR = ' . count($currentBoos_arr) . $this->br;
echo 'DERNIERE PAIRE KEY|VALUE = ' . $currentBoos_arr[count($currentBoos_arr)-1] . $this->br;
echo 'VALEUR = ' . $boosValue . $this->br2;
// pour chaque paire clé/valeur du style "PBLS|Hachette" ou "tamere|lapute"
foreach ($currentBoos_arr as $key => $value) {
echo $this->tab . 'PAIRE N° ' . $key . " = " . $value . $this->br;
// je remplace la chaine "clé|valeur" par un tableau a 2 cases avec :
// la partie gauche de la chaine (la clé) dans la case 0 et la partie droite (la valeur) dans la case 1.
$currentBoos_arr[$key] = explode('|', $value);
echo $this->tab2 . 'Clé = ' . $currentBoos_arr[$key][0] . $this->br;
echo $this->tab2 . 'Valeur = ' . $currentBoos_arr[$key][1]. $this->br2;
}
echo $this->br;
// Maintenant que j'ai des millions de tableaux c'est plus clair !
// je met tout ces tableaux dans... un tableau !
array_push($boosXmlSource_arr, $currentBoos_arr);
}
$this->boosArrayToXmlFile($boosXmlSource_arr, $path);
}
function boosArrayToXmlFile($boos_arr, $path){
// generation des donnees xml
$encoding = 'UTF-8';
$xmlData = '<?xml version="1.0" encoding="'.$encoding."\"?>\r\n";
$xmlData .= "<BOOSCOLLECTION>\r\n";
// pour chaque section 'boos'
foreach ($boos_arr as $boosKey => $boosValue) {
// Ligne pour version XML Node
//$xmlData .= "\t<BOOS>\r\n";
// Ligne pour version XML attributs
$xmlData .= "\t<BOOS";
$currentBoos = $boos_arr[$boosKey];
// pour chaque paire de la section courante
foreach ($currentBoos as $key => $value) {
$k = htmlspecialchars($currentBoos[$key][0]);
$v = htmlspecialchars($currentBoos[$key][1]);
// Ligne pour version XML Node
//$xmlData .= "\t\t<" . $k . '>' . $v . '</' . $k . ">\r\n";
// Ligne pour version XML attributs
$xmlData .= " ". $k .' = "' . $v .'"';
}
// Ligne pour version XML Node
//$xmlData .= "\t</BOOS>\r\n";
// Ligne pour version XML attributs
$xmlData .= "/>\r\n";
}
$xmlData .= "</BOOSCOLLECTION>";
$file = dirname($path) . DIRECTORY_SEPARATOR . basename(realpath($path),".txt") . ".xml";
$fd = fopen($file,"w");
$fout = fwrite($fd, utf8_encode($xmlData));
clearstatcache();
fclose($fd); |
Partager