XPath, XML, BigData – Rationnaliser ces données, manipulation du XML à l’aide SimpleXML
Comme dans le précèdent billet, un autre petit billet sur la recherche d’une solution rapide et peu coûteuse pour récupérer des données éparses afin de les consolider ultérieurement dans une base de données.
En clair, la cible comme aime à dire les consultants : c’est récupérer de gros fichiers de données notamment au format XML, donc passablement structurées, les “découper”, les passer à la moulinette de SimpleXML pour générer des queries et injecter le tout dans une base de données MySQL. Une base sur laquelle, vous pourrez requêter facilement, sortir de KPI, dédoublonner, corriger les corruptions de données… Bref, transformer tel un docteur Frankenstein de la data, des données mortes en données vivantes et exploitables.
Bien évidemment, il y a moyen d’industrialiser, automatiser ce type de manipulation mais volontairement on n’utilise que ce que des outils très usuels. Certes, cela fait un “workflow” un peu chaotique mais qui permet de séquentiellement voir chaque étape
Pour information, nous avons utiliser MAMP pour PHP et MySQL et la console MAC.
1. XML à la Découpe
Vous êtes souvent face à des fichiers imposants en XML, vous aurez donc un sérieux problème à charger le fichier ou les fichiers .xml
. Pour contrer, ce problème, vous pouvez indiquer dans votre fichier php que vous allez étendre le paramètre memory_limit
Dans votre fichier php
ini_set("memory_limit","12M"); |
Dans le php.ini
ini_set("memory_limit","12M"); |
Par ailleurs, vous pouvez découper préalablement le fichier .xml
volumes en fichiers plus petits de taille égales.
Un unique enregistrement de notre fichier xml sample_demo.xml
, un row
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 128 129 130 131 132 133 134 135 | <?xml version='1.0' encoding='utf-8'?> <MEMBER_LIST> <!-- // some records --> <row> <MEMBER num="1"></MEMBER> <CAMPAGNE_ID>TT1114079764</CAMPAGNE_ID> <MEMBER_ID>9437858932541</MEMBER_ID> <CLIENT_ID>1187635315</CLIENT_ID> <EMVHBQ></EMVHBQ> <EMVISP></EMVISP> <DATEJOIN>12/05/2011</DATEJOIN> <DATEUNJOIN></DATEUNJOIN> <EMAIL>barack.ndlf@lamaisonblanche.eu</EMAIL> <EMVCELLPHONE></EMVCELLPHONE> <EMVUNROUTABLE></EMVUNROUTABLE> <HBQ_REASON></HBQ_REASON> <SMS_DATE_UNJOIN></SMS_DATE_UNJOIN> <SMS_EMVHBQ></SMS_EMVHBQ> <SMS_HBQ_REASON></SMS_HBQ_REASON> <FIRSTNAME>Barack</FIRSTNAME> <LASTNAME>N'diang-Le floc'h</LASTNAME> <TITLE></TITLE> <DATEOFBIRTH></DATEOFBIRTH> <ADRESSE></ADRESSE> <ANNEE_NAISSANCE></ANNEE_NAISSANCE> <CHAMP_DATE_1></CHAMP_DATE_1> <CHAMP_DATE_2></CHAMP_DATE_2> <CHAMP_DATE_3></CHAMP_DATE_3> <CHAMP_DATE_4></CHAMP_DATE_4> <CHAMP_DATE_5></CHAMP_DATE_5> <CHAMP_NUM_1></CHAMP_NUM_1> <CHAMP_NUM_2></CHAMP_NUM_2> <CHAMP_NUM_3></CHAMP_NUM_3> <CHAMP_NUM_4></CHAMP_NUM_4> <CHAMP_NUM_5></CHAMP_NUM_5> <CHAMP_TXT_3></CHAMP_TXT_3> <CHAMP_TXT_4></CHAMP_TXT_4> <CHAMP_TXT_5></CHAMP_TXT_5> <CLIENTURN></CLIENTURN> <CODE></CODE> <CODEPOSTAL></CODEPOSTAL> <COUNTRY></COUNTRY> <CRENEAU_HORAIRE></CRENEAU_HORAIRE> <DATE_ABO_ALERT></DATE_ABO_ALERT> <DATE_ABO_AUTOPROMO></DATE_ABO_AUTOPROMO> <DATE_ABO_BESTOF_OBS></DATE_ABO_BESTOF_OBS> <DATE_ABO_BESTOF_WEEK></DATE_ABO_BESTOF_WEEK> <DATE_ABO_BESTOF_W_END></DATE_ABO_BESTOF_W_END> <DATE_ABO_NEWS></DATE_ABO_NEWS> <DATE_DEMANDE_MODIFICATION_PROF></DATE_DEMANDE_MODIFICATION_PROF> <DATE_DESABO_ALERT></DATE_DESABO_ALERT> <DATE_DESABO_AUTOPROMO></DATE_DESABO_AUTOPROMO> <DATE_DESABO_BESTOF_OBS></DATE_DESABO_BESTOF_OBS> <DATE_DESABO_BESTOF_WEEK></DATE_DESABO_BESTOF_WEEK> <DATE_DESABO_BESTOF_W_END></DATE_DESABO_BESTOF_W_END> <DATE_DESABO_NEWS></DATE_DESABO_NEWS> <DATE_ENVOI_PDM></DATE_ENVOI_PDM> <DATE_MODIFICATION_PROFIL></DATE_MODIFICATION_PROFIL> <DATE_MODIF_NEWS></DATE_MODIF_NEWS> <EMAIL_FORMAT></EMAIL_FORMAT> <EMAIL_ORIGINE></EMAIL_ORIGINE> <EMVADMIN1></EMVADMIN1> <EMVADMIN2></EMVADMIN2> <EMVADMIN3></EMVADMIN3> <EMVADMIN4></EMVADMIN4> <EMVADMIN5></EMVADMIN5> <EMVDOUBLON></EMVDOUBLON> <FAI></FAI> <FREQUENCE></FREQUENCE> <GENDER></GENDER> <HEURE_ENVOI></HEURE_ENVOI> <LASTACTIVITY></LASTACTIVITY> <LG></LG> <LHE></LHE> <MESSAGEID_PDM></MESSAGEID_PDM> <MOBICLIP></MOBICLIP> <NEWS_MENU></NEWS_MENU> <OPTINALERT></OPTINALERT> <OPTINMONFRANCE></OPTINMONFRANCE> <OPTINPARTENAIRES></OPTINPARTENAIRES> <OPTIN_ACTU_AFRIQUE>1</OPTIN_ACTU_AFRIQUE> <OPTIN_ACTU_MONDE>1</OPTIN_ACTU_MONDE> <OPTIN_ACTU_MUSIQUE>False</OPTIN_ACTU_MUSIQUE> <OPTIN_AUTOPROMO></OPTIN_AUTOPROMO> <OPTIN_BESTOF_OBS></OPTIN_BESTOF_OBS> <OPTIN_BESTOF_WEEK></OPTIN_BESTOF_WEEK> <OPTIN_BESTOF_W_END></OPTIN_BESTOF_W_END> <OPTIN_MFI></OPTIN_MFI> <OPTIN_NEWSLETTER5></OPTIN_NEWSLETTER5> <OPTIN_NEWSLETTERS></OPTIN_NEWSLETTERS> <OPTIN_OFFRE_PARTENAIRE></OPTIN_OFFRE_PARTENAIRE> <OPTIN_OFFRE_RFI></OPTIN_OFFRE_RFI> <OP_MARKETING></OP_MARKETING> <OP_WEBMARKETING></OP_WEBMARKETING> <PAYS></PAYS> <PROFESSION></PROFESSION> <SEED></SEED> <SEGMENT></SEGMENT> <SOURCE>IHH</SOURCE> <SYNCHRO_INSERT></SYNCHRO_INSERT> <SYNCHRO_UNJOIN></SYNCHRO_UNJOIN> <SYNCHRO_UPDATE></SYNCHRO_UPDATE> <TELEPHONE></TELEPHONE> <TEMP10_NBMAX></TEMP10_NBMAX> <TEMP10_TOPIC></TEMP10_TOPIC> <TEMP11_NBMAX></TEMP11_NBMAX> <TEMP11_TOPIC></TEMP11_TOPIC> <TEMP1_NBMAX></TEMP1_NBMAX> <TEMP1_TOPIC></TEMP1_TOPIC> <TEMP2_NBMAX></TEMP2_NBMAX> <TEMP2_TOPIC></TEMP2_TOPIC> <TEMP3_NBMAX></TEMP3_NBMAX> <TEMP3_TOPIC></TEMP3_TOPIC> <TEMP4_NBMAX></TEMP4_NBMAX> <TEMP4_TOPIC></TEMP4_TOPIC> <TEMP5_NBMAX></TEMP5_NBMAX> <TEMP5_TOPIC></TEMP5_TOPIC> <TEMP6_NBMAX></TEMP6_NBMAX> <TEMP6_TOPIC></TEMP6_TOPIC> <TEMP7_NBMAX></TEMP7_NBMAX> <TEMP7_TOPIC></TEMP7_TOPIC> <TEMP8_NBMAX></TEMP8_NBMAX> <TEMP8_TOPIC></TEMP8_TOPIC> <TEMP9_NBMAX></TEMP9_NBMAX> <TEMP9_TOPIC></TEMP9_TOPIC> <TEMPLATE_TYPE></TEMPLATE_TYPE> <UPLOAD_ID></UPLOAD_ID> <VILLE></VILLE> <ZONE></ZONE> </row> <!-- // some records --> </MEMBER_LIST> |
On peut donc considérer que notre gros fichier contient 2 190 enregistrements et qu’un enregistrement (row) fait 129 lignes.
Si on souhaite scinder le gros fichier en petits fichiers de taille égale de 500 enregistrements, un rapide calcul nous le donne (282 449x500)/2 190 = 64 500
, soit 5 fichiers.
Scinder le gros fichier .xml
“quick and dirty”
split -l 103 200 /path_to_file/big_file.xml /path_to_file/destination/small_file_ |
Ajouter l’extension .xml aux fichiers small_file_aa small_file_ab small_file_ac…etc.
for f in $(find . -type f); do mv $f ${f}.xml; done |
Attention, la découpe est faite à la hache, vérifier tout de même de pas scinder au milieu un enregistrement, d’une balise <row>...</row>
.
2. Utiliser SimpleXML
SimpleXML est une extension de PHP 5 destinée à simplifier la manipulation des documents XML. Par rapport à DOM ou au parser Expat, SimpleXML peut être utilisé en quelques lignes de code pour lire et extraire des données de fichiers XML, notamment en manipulant les noeuds (nodes) ou les attributs (attributes) de votre fichier .xml
.
Nous allons nous servir d’un petit script .php
pour se servir de SimpleXML
et générer des requêtes d’insertion sql
pour charger un fichier .sql
qui reprend les données de notre XML bien gras que nous venons d’écarir à l’aide de split.
La base de données et mettre la table
- Database: fsb_cpg_opened
- Table: member_list_index_full
-- -------------------------------------------------------- -- -- Table structure for table `member_list_index_full` -- CREATE TABLE `member_list_index_full` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `campagne_id` text, `member_id` text, `client_id` text, `emvhbq` text, `emvisp` text, `datejoin` text, `dateunjoin` text, `email` VARCHAR(255) NOT NULL DEFAULT '', `emvcellphone` text, `emvunroutable` text, `hbq_reason` text, `sms_date_unjoin` text, `sms_emvhbq` text, `sms_hbq_reason` text, `firstname` VARCHAR(255) NOT NULL DEFAULT '', `lastname` VARCHAR(255) NOT NULL DEFAULT '', `title` text, `dateofbirth` text, `adresse` text, `annee_naissance` text, `champ_date_1` text, `champ_date_2` text, `champ_date_3` text, `champ_date_4` text, `champ_date_5` text, `champ_num_1` text, `champ_num_2` text, `champ_num_3` text, `champ_num_4` text, `champ_num_5` text, `champ_txt_3` text, `champ_txt_4` text, `champ_txt_5` text, `clienturn` text, `code` text, `codepostal` text, `country` text, `creneau_horaire` text, `date_abo_alert` text, `date_abo_autopromo` text, `date_abo_bestof_obs` text, `date_abo_bestof_week` text, `date_abo_bestof_w_end` text, `date_abo_news` text, `date_demande_modification_prof` text, `date_desabo_alert` text, `date_desabo_autopromo` text, `date_desabo_bestof_obs` text, `date_desabo_bestof_week` text, `date_desabo_bestof_w_end` text, `date_desabo_news` text, `date_envoi_pdm` text, `date_modification_profil` text, `date_modif_news` text, `email_format` text, `email_origine` text, `emvadmin1` text, `emvadmin2` text, `emvadmin3` text, `emvadmin4` text, `emvadmin5` text, `emvdoublon` text, `fai` text, `frequence` text, `gender` text, `heure_envoi` text, `lastactivity` text, `lg` text, `lhe` text, `messageid_pdm` text, `mobiclip` text, `news_menu` text, `optinalert` text, `optinmonfrance` text, `optinpartenaires` text, `optin_actu_afrique` text, `optin_actu_monde` text, `optin_actu_musique` text, `optin_autopromo` text, `optin_bestof_obs` text, `optin_bestof_week` text, `optin_bestof_w_end` text, `optin_mfi` text, `optin_newsletter5` text, `optin_newsletters` text, `optin_offre_partenaire` text, `optin_offre_rfi` text, `op_marketing` text, `op_webmarketing` text, `pays` text, `profession` text, `seed` text, `segment` text, `source` text, `synchro_insert` text, `synchro_unjoin` text, `synchro_update` text, `telephone` text, `temp10_nbmax` text, `temp10_topic` text, `temp11_nbmax` text, `temp11_topic` text, `temp1_nbmax` text, `temp1_topic` text, `temp2_nbmax` text, `temp2_topic` text, `temp3_nbmax` text, `temp3_topic` text, `temp4_nbmax` text, `temp4_topic` text, `temp5_nbmax` text, `temp5_topic` text, `temp6_nbmax` text, `temp6_topic` text, `temp7_nbmax` text, `temp7_topic` text, `temp8_nbmax` text, `temp8_topic` text, `temp9_nbmax` text, `temp9_topic` text, `template_type` text, `upload_id` text, `ville` text, `zone` text, PRIMARY KEY (`id`), FULLTEXT KEY `ind_full_email` (`email`), FULLTEXT KEY `ind_full_firstname` (`firstname`), FULLTEXT KEY `ind_full_lastname` (`lastname`), FULLTEXT KEY `ind_full_ema_fir_las` (`email`,`firstname`,`lastname`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; |
3. Générer l’ensemble des requêtes pour injecter le contenu du XML dans la BDD
On va se servir d’un modèle de requête tout bête d’insertion. Faite attention, lorsque vous héritez des données de langue étrangère, le français est à ce titre une langue étrangère, il faut faire une petite “sanitization” de vos données avant des les injecter dans votre requête SQL. Prenons par exemple, une personne fictive dotée d’un nom d’origine bretonne et africaine, nommons-le Barack N'diang-Le floc'h
. Cet individu est donc doté d’une double apostrophe, il faut donc protéger avec des addslashes
le nom de ce brave homme, ce qui donne N\'diang-Le floc\'h
.
fsb_cpg_opened_massive_insert.php
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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | /* Source : http://www.phpro.org/tutorials/Introduction-To-SimpleXML-With-PHP.html */ /*** create a SimpleXML object ***/ if( ! $xml = simplexml_load_file("sample_demo.xml") ) { echo "Unable to load XML file"; } else { $i = 0; /*** loop over the elements ***/ foreach($xml as $node) { /* MODEL */ /* <MEMBER num="1"></MEMBER> <CAMPAGNE_ID>TT1114079764</CAMPAGNE_ID> <MEMBER_ID>9437858932541</MEMBER_ID> <CLIENT_ID>1187635315</CLIENT_ID> <EMVHBQ></EMVHBQ> <EMVISP></EMVISP> <DATEJOIN>12/05/2011</DATEJOIN> <DATEUNJOIN></DATEUNJOIN> <EMAIL>barack.ndlf@lamaisonblanche.eu</EMAIL> <EMVCELLPHONE></EMVCELLPHONE> <EMVUNROUTABLE></EMVUNROUTABLE> <HBQ_REASON></HBQ_REASON> <SMS_DATE_UNJOIN></SMS_DATE_UNJOIN> <SMS_EMVHBQ></SMS_EMVHBQ> <SMS_HBQ_REASON></SMS_HBQ_REASON> <FIRSTNAME>Barack</FIRSTNAME> <LASTNAME>N'diang-Le floc'h</LASTNAME> <TITLE></TITLE> ... to be continued */ /* VALUES */ $MEMBER_num = $xml->row[$i]->MEMBER->attributes(); $CAMPAGNE_ID = $xml->row[$i]->CAMPAGNE_ID; $MEMBER_ID = $xml->row[$i]->MEMBER_ID; $CLIENT_ID = $xml->row[$i]->CLIENT_ID; $EMVHBQ = $xml->row[$i]->EMVHBQ; $EMVISP = $xml->row[$i]->EMVISP; $DATEJOIN = $xml->row[$i]->DATEJOIN; $EMAIL = $xml->row[$i]->EMAIL; $EMVCELLPHONE = $xml->row[$i]->EMVCELLPHONE; $EMVUNROUTABLE = $xml->row[$i]->EMVUNROUTABLE; $HBQ_REASON = $xml->row[$i]->HBQ_REASON; $SMS_DATE_UNJOIN = $xml->row[$i]->SMS_DATE_UNJOIN; $SMS_EMVHBQ = $xml->row[$i]->SMS_EMVHBQ; $SMS_HBQ_REASON = $xml->row[$i]->SMS_HBQ_REASON; $FIRSTNAME = $xml->row[$i]->FIRSTNAME; $LASTNAME = $xml->row[$i]->LASTNAME; $TITLE = $xml->row[$i]->TITLE; $DATEOFBIRTH = $xml->row[$i]->DATEOFBIRTH; $ADRESSE = $xml->row[$i]->ADRESSE; $ANNEE_NAISSANCE = $xml->row[$i]->ANNEE_NAISSANCE; $CHAMP_DATE_1 = $xml->row[$i]->CHAMP_DATE_1; $CHAMP_DATE_2 = $xml->row[$i]->CHAMP_DATE_2; $CHAMP_DATE_3 = $xml->row[$i]->CHAMP_DATE_3; $CHAMP_DATE_4 = $xml->row[$i]->CHAMP_DATE_4; $CHAMP_DATE_5 = $xml->row[$i]->CHAMP_DATE_5; $CHAMP_NUM_1 = $xml->row[$i]->CHAMP_NUM_1; $CHAMP_NUM_2 = $xml->row[$i]->CHAMP_NUM_2; $CHAMP_NUM_3 = $xml->row[$i]->CHAMP_NUM_3; $CHAMP_NUM_4 = $xml->row[$i]->CHAMP_NUM_4; $CHAMP_NUM_5 = $xml->row[$i]->CHAMP_NUM_5; $CHAMP_TXT_3 = $xml->row[$i]->CHAMP_TXT_3; $CHAMP_TXT_4 = $xml->row[$i]->CHAMP_TXT_4; $CHAMP_TXT_5 = $xml->row[$i]->CHAMP_TXT_5; $CLIENTURN = $xml->row[$i]->CLIENTURN; $CODE = $xml->row[$i]->CODE; $CODEPOSTAL = $xml->row[$i]->CODEPOSTAL; $COUNTRY = $xml->row[$i]->COUNTRY; $CRENEAU_HORAIRE = $xml->row[$i]->CRENEAU_HORAIRE; $DATE_ABO_ALERT = $xml->row[$i]->DATE_ABO_ALERT; $DATE_ABO_AUTOPROMO = $xml->row[$i]->DATE_ABO_AUTOPROMO; $DATE_ABO_BESTOF_OBS = $xml->row[$i]->DATE_ABO_BESTOF_OBS; $DATE_ABO_BESTOF_WEEK = $xml->row[$i]->DATE_ABO_BESTOF_WEEK; $DATE_ABO_BESTOF_W_END = $xml->row[$i]->DATE_ABO_BESTOF_W_END; $DATE_ABO_NEWS = $xml->row[$i]->DATE_ABO_NEWS; $DATE_DEMANDE_MODIFICATION_PROF = $xml->row[$i]->DATE_DEMANDE_MODIFICATION_PROF; $DATE_DESABO_ALERT = $xml->row[$i]->DATE_DESABO_ALERT; $DATE_DESABO_AUTOPROMO = $xml->row[$i]->DATE_DESABO_AUTOPROMO; $DATE_DESABO_BESTOF_OBS = $xml->row[$i]->DATE_DESABO_BESTOF_OBS; $DATE_DESABO_BESTOF_WEEK = $xml->row[$i]->DATE_DESABO_BESTOF_WEEK; $DATE_DESABO_BESTOF_W_END = $xml->row[$i]->DATE_DESABO_BESTOF_W_END; $DATE_DESABO_NEWS = $xml->row[$i]->DATE_DESABO_NEWS; $DATE_ENVOI_PDM = $xml->row[$i]->DATE_ENVOI_PDM; $DATE_MODIFICATION_PROFIL = $xml->row[$i]->DATE_MODIFICATION_PROFIL; $DATE_MODIF_NEWS = $xml->row[$i]->DATE_MODIF_NEWS; $EMAIL_FORMAT = $xml->row[$i]->EMAIL_FORMAT; $EMAIL_ORIGINE = $xml->row[$i]->EMAIL_ORIGINE; $EMVADMIN1 = $xml->row[$i]->EMVADMIN1; $EMVADMIN2 = $xml->row[$i]->EMVADMIN2; $EMVADMIN3 = $xml->row[$i]->EMVADMIN3; $EMVADMIN4 = $xml->row[$i]->EMVADMIN4; $EMVADMIN5 = $xml->row[$i]->EMVADMIN5; $EMVDOUBLON = $xml->row[$i]->EMVDOUBLON; $FAI = $xml->row[$i]->FAI; $FREQUENCE = $xml->row[$i]->FREQUENCE; $GENDER = $xml->row[$i]->GENDER; $HEURE_ENVOI = $xml->row[$i]->HEURE_ENVOI; $LASTACTIVITY = $xml->row[$i]->LASTACTIVITY; $LG = $xml->row[$i]->LG; $LHE = $xml->row[$i]->LHE; $MESSAGEID_PDM = $xml->row[$i]->MESSAGEID_PDM; $MOBICLIP = $xml->row[$i]->MOBICLIP; $NEWS_MENU = $xml->row[$i]->NEWS_MENU; $OPTINALERT = $xml->row[$i]->OPTINALERT; $OPTINMONFRANCE = $xml->row[$i]->OPTINMONFRANCE; $OPTINPARTENAIRES = $xml->row[$i]->OPTINPARTENAIRES; $OPTIN_ACTU_AFRIQUE = $xml->row[$i]->OPTIN_ACTU_AFRIQUE; $OPTIN_ACTU_MONDE = $xml->row[$i]->OPTIN_ACTU_MONDE; $OPTIN_ACTU_MUSIQUE = $xml->row[$i]->OPTIN_ACTU_MUSIQUE; $OPTIN_AUTOPROMO = $xml->row[$i]->OPTIN_AUTOPROMO; $OPTIN_BESTOF_OBS = $xml->row[$i]->OPTIN_BESTOF_OBS; $OPTIN_BESTOF_WEEK = $xml->row[$i]->OPTIN_BESTOF_WEEK; $OPTIN_BESTOF_W_END = $xml->row[$i]->OPTIN_BESTOF_W_END; $OPTIN_MFI = $xml->row[$i]->OPTIN_MFI; $OPTIN_NEWSLETTER5 = $xml->row[$i]->OPTIN_NEWSLETTER5; $OPTIN_NEWSLETTERS = $xml->row[$i]->OPTIN_NEWSLETTERS; $OPTIN_OFFRE_PARTENAIRE = $xml->row[$i]->OPTIN_OFFRE_PARTENAIRE; $OPTIN_OFFRE_RFI = $xml->row[$i]->OPTIN_OFFRE_RFI; $OP_MARKETING = $xml->row[$i]->OP_MARKETING; $OP_WEBMARKETING = $xml->row[$i]->OP_WEBMARKETING; $PAYS = $xml->row[$i]->PAYS; $PROFESSION = $xml->row[$i]->PROFESSION; $SEED = $xml->row[$i]->SEED; $SEGMENT = $xml->row[$i]->SEGMENT; $SOURCE = $xml->row[$i]->SOURCE; $SYNCHRO_INSERT = $xml->row[$i]->SYNCHRO_INSERT; $SYNCHRO_UNJOIN = $xml->row[$i]->SYNCHRO_UNJOIN; $SYNCHRO_UPDATE = $xml->row[$i]->SYNCHRO_UPDATE; $TELEPHONE = $xml->row[$i]->TELEPHONE; $TEMP10_NBMAX = $xml->row[$i]->TEMP10_NBMAX; $TEMP10_TOPIC = $xml->row[$i]->TEMP10_TOPIC; $TEMP11_NBMAX = $xml->row[$i]->TEMP11_NBMAX; $TEMP11_TOPIC = $xml->row[$i]->TEMP11_TOPIC; $TEMP1_NBMAX = $xml->row[$i]->TEMP1_NBMAX; $TEMP1_TOPIC = $xml->row[$i]->TEMP1_TOPIC; $TEMP2_NBMAX = $xml->row[$i]->TEMP2_NBMAX; $TEMP2_TOPIC = $xml->row[$i]->TEMP2_TOPIC; $TEMP3_NBMAX = $xml->row[$i]->TEMP3_NBMAX; $TEMP3_TOPIC = $xml->row[$i]->TEMP3_TOPIC; $TEMP4_NBMAX = $xml->row[$i]->TEMP4_NBMAX; $TEMP4_TOPIC = $xml->row[$i]->TEMP4_TOPIC; $TEMP5_NBMAX = $xml->row[$i]->TEMP5_NBMAX; $TEMP5_TOPIC = $xml->row[$i]->TEMP5_TOPIC; $TEMP6_NBMAX = $xml->row[$i]->TEMP6_NBMAX; $TEMP6_TOPIC = $xml->row[$i]->TEMP6_TOPIC; $TEMP7_NBMAX = $xml->row[$i]->TEMP7_NBMAX; $TEMP7_TOPIC = $xml->row[$i]->TEMP7_TOPIC; $TEMP8_NBMAX = $xml->row[$i]->TEMP8_NBMAX; $TEMP8_TOPIC = $xml->row[$i]->TEMP8_TOPIC; $TEMP9_NBMAX = $xml->row[$i]->TEMP9_NBMAX; $TEMP9_TOPIC = $xml->row[$i]->TEMP9_TOPIC; $TEMPLATE_TYPE = $xml->row[$i]->TEMPLATE_TYPE; $UPLOAD_ID = $xml->row[$i]->UPLOAD_ID; $VILLE = $xml->row[$i]->VILLE; $ZONE = $xml->row[$i]->ZONE; /* DEBUG */ // print_r($node); /* MODEL QUERY */ /* INSERT INTO fsb_cpg_opened.member_list_index_full (id, campagne_id, member_id, client_id, emvhbq, emvisp, datejoin, dateunjoin, email, emvcellphone, emvunroutable, hbq_reason, sms_date_unjoin, sms_emvhbq, sms_hbq_reason, firstname, lastname, title, dateofbirth, adresse, annee_naissance, champ_date_1, champ_date_2, champ_date_3, champ_date_4, champ_date_5, champ_num_1, champ_num_2, champ_num_3, champ_num_4, champ_num_5, champ_txt_3, champ_txt_4, champ_txt_5, clienturn, code, codepostal, country, creneau_horaire, date_abo_alert, date_abo_autopromo, date_abo_bestof_obs, date_abo_bestof_week, date_abo_bestof_w_end, date_abo_news, date_demande_modification_prof, date_desabo_alert, date_desabo_autopromo, date_desabo_bestof_obs, date_desabo_bestof_week, date_desabo_bestof_w_end, date_desabo_news, date_envoi_pdm, date_modification_profil, date_modif_news, email_format, email_origine, emvadmin1, emvadmin2, emvadmin3, emvadmin4, emvadmin5, emvdoublon, fai, frequence, gender, heure_envoi, lastactivity, lg, lhe, messageid_pdm, mobiclip, news_menu, optinalert, optinmonfrance, optinpartenaires, optin_actu_afrique, optin_actu_monde, optin_actu_musique, optin_autopromo, optin_bestof_obs, optin_bestof_week, optin_bestof_w_end, optin_mfi, optin_newsletter5, optin_newsletters, optin_offre_partenaire, optin_offre_rfi, op_marketing, op_webmarketing, pays, profession, seed, segment, source, synchro_insert, synchro_unjoin, synchro_update, telephone, temp10_nbmax, temp10_topic, temp11_nbmax, temp11_topic, temp1_nbmax, temp1_topic, temp2_nbmax, temp2_topic, temp3_nbmax, temp3_topic, temp4_nbmax, temp4_topic, temp5_nbmax, temp5_topic, temp6_nbmax, temp6_topic, temp7_nbmax, temp7_topic, temp8_nbmax, temp8_topic, temp9_nbmax, temp9_topic, template_type, upload_id, ville, zone) VALUES (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); */ echo ('INSERT INTO fsb_cpg_opened.member_list_index_full (id, campagne_id, member_id, client_id, emvhbq, emvisp, datejoin, dateunjoin, email, emvcellphone, emvunroutable, hbq_reason, sms_date_unjoin, sms_emvhbq, sms_hbq_reason, firstname, lastname, title, dateofbirth, adresse, annee_naissance, champ_date_1, champ_date_2, champ_date_3, champ_date_4, champ_date_5, champ_num_1, champ_num_2, champ_num_3, champ_num_4, champ_num_5, champ_txt_3, champ_txt_4, champ_txt_5, clienturn, code, codepostal, country, creneau_horaire, date_abo_alert, date_abo_autopromo, date_abo_bestof_obs, date_abo_bestof_week, date_abo_bestof_w_end, date_abo_news, date_demande_modification_prof, date_desabo_alert, date_desabo_autopromo, date_desabo_bestof_obs, date_desabo_bestof_week, date_desabo_bestof_w_end, date_desabo_news, date_envoi_pdm, date_modification_profil, date_modif_news, email_format, email_origine, emvadmin1, emvadmin2, emvadmin3, emvadmin4, emvadmin5, emvdoublon, fai, frequence, gender, heure_envoi, lastactivity, lg, lhe, messageid_pdm, mobiclip, news_menu, optinalert, optinmonfrance, optinpartenaires, optin_actu_afrique, optin_actu_monde, optin_actu_musique, optin_autopromo, optin_bestof_obs, optin_bestof_week, optin_bestof_w_end, optin_mfi, optin_newsletter5, optin_newsletters, optin_offre_partenaire, optin_offre_rfi, op_marketing, op_webmarketing, pays, profession, seed, segment, source, synchro_insert, synchro_unjoin, synchro_update, telephone, temp10_nbmax, temp10_topic, temp11_nbmax, temp11_topic, temp1_nbmax, temp1_topic, temp2_nbmax, temp2_topic, temp3_nbmax, temp3_topic, temp4_nbmax, temp4_topic, temp5_nbmax, temp5_topic, temp6_nbmax, temp6_topic, temp7_nbmax, temp7_topic, temp8_nbmax, temp8_topic, temp9_nbmax, temp9_topic, template_type, upload_id, ville, zone) VALUES'); echo ('(NULL,'); echo ('\''.$MEMBER_num.'\','); echo ('\''.$CAMPAGNE_ID.'\','); echo ('\''.$MEMBER_ID.'\','); echo ('\''.$CLIENT_ID.'\','); echo ('\''.$EMVHBQ.'\','); echo ('\''.$EMVISP.'\','); echo ('\''.$DATEJOIN.'\','); echo ('\''.$EMAIL.'\','); echo ('\''.$EMVCELLPHONE.'\','); echo ('\''.$EMVUNROUTABLE.'\','); echo ('\''.$HBQ_REASON.'\','); echo ('\''.$SMS_DATE_UNJOIN.'\','); echo ('\''.$SMS_EMVHBQ.'\','); echo ('\''.$SMS_HBQ_REASON.'\','); echo ('\''.addslashes($FIRSTNAME).'\','); echo ('\''.addslashes($LASTNAME).'\','); echo ('\''.$TITLE.'\','); echo ('\''.$DATEOFBIRTH.'\','); echo ('\''.$ADRESSE.'\','); echo ('\''.$ANNEE_NAISSANCE.'\','); echo ('\''.$CHAMP_DATE_1.'\','); echo ('\''.$CHAMP_DATE_2.'\','); echo ('\''.$CHAMP_DATE_3.'\','); echo ('\''.$CHAMP_DATE_4.'\','); echo ('\''.$CHAMP_DATE_5.'\','); echo ('\''.$CHAMP_NUM_1.'\','); echo ('\''.$CHAMP_NUM_2.'\','); echo ('\''.$CHAMP_NUM_3.'\','); echo ('\''.$CHAMP_NUM_4.'\','); echo ('\''.$CHAMP_NUM_5.'\','); echo ('\''.$CHAMP_TXT_3.'\','); echo ('\''.$CHAMP_TXT_4.'\','); echo ('\''.$CHAMP_TXT_5.'\','); echo ('\''.$CLIENTURN.'\','); echo ('\''.$CODE.'\','); echo ('\''.$CODEPOSTAL.'\','); echo ('\''.$COUNTRY.'\','); echo ('\''.$CRENEAU_HORAIRE.'\','); echo ('\''.$DATE_ABO_ALERT.'\','); echo ('\''.$DATE_ABO_AUTOPROMO.'\','); echo ('\''.$DATE_ABO_BESTOF_OBS.'\','); echo ('\''.$DATE_ABO_BESTOF_WEEK.'\','); echo ('\''.$DATE_ABO_BESTOF_W_END.'\','); echo ('\''.$DATE_ABO_NEWS.'\','); echo ('\''.$DATE_DEMANDE_MODIFICATION_PROF.'\','); echo ('\''.$DATE_DESABO_ALERT.'\','); echo ('\''.$DATE_DESABO_AUTOPROMO.'\','); echo ('\''.$DATE_DESABO_BESTOF_OBS.'\','); echo ('\''.$DATE_DESABO_BESTOF_WEEK.'\','); echo ('\''.$DATE_DESABO_BESTOF_W_END.'\','); echo ('\''.$DATE_DESABO_NEWS.'\','); echo ('\''.$DATE_ENVOI_PDM.'\','); echo ('\''.$DATE_MODIFICATION_PROFIL.'\','); echo ('\''.$DATE_MODIF_NEWS.'\','); echo ('\''.$EMAIL_FORMAT.'\','); echo ('\''.$EMAIL_ORIGINE.'\','); echo ('\''.$EMVADMIN1.'\','); echo ('\''.$EMVADMIN2.'\','); echo ('\''.$EMVADMIN3.'\','); echo ('\''.$EMVADMIN4.'\','); echo ('\''.$EMVADMIN5.'\','); echo ('\''.$EMVDOUBLON.'\','); echo ('\''.$FAI.'\','); echo ('\''.$FREQUENCE.'\','); echo ('\''.$GENDER.'\','); echo ('\''.$HEURE_ENVOI.'\','); echo ('\''.$LASTACTIVITY.'\','); echo ('\''.$LG.'\','); echo ('\''.$LHE.'\','); echo ('\''.$MESSAGEID_PDM.'\','); echo ('\''.$MOBICLIP.'\','); echo ('\''.$NEWS_MENU.'\','); echo ('\''.$OPTINALERT.'\','); echo ('\''.$OPTINMONFRANCE.'\','); echo ('\''.$OPTINPARTENAIRES.'\','); echo ('\''.$OPTIN_ACTU_AFRIQUE.'\','); echo ('\''.$OPTIN_ACTU_MONDE.'\','); echo ('\''.$OPTIN_ACTU_MUSIQUE.'\','); echo ('\''.$OPTIN_AUTOPROMO.'\','); echo ('\''.$OPTIN_BESTOF_OBS.'\','); echo ('\''.$OPTIN_BESTOF_WEEK.'\','); echo ('\''.$OPTIN_BESTOF_W_END.'\','); echo ('\''.$OPTIN_MFI.'\','); echo ('\''.$OPTIN_NEWSLETTER5.'\','); echo ('\''.$OPTIN_NEWSLETTERS.'\','); echo ('\''.$OPTIN_OFFRE_PARTENAIRE.'\','); echo ('\''.$OPTIN_OFFRE_RFI.'\','); echo ('\''.$OP_MARKETING.'\','); echo ('\''.$OP_WEBMARKETING.'\','); echo ('\''.$PAYS.'\','); echo ('\''.$PROFESSION.'\','); echo ('\''.$SEED.'\','); echo ('\''.$SEGMENT.'\','); echo ('\''.$SOURCE.'\','); echo ('\''.$SYNCHRO_INSERT.'\','); echo ('\''.$SYNCHRO_UNJOIN.'\','); echo ('\''.$SYNCHRO_UPDATE.'\','); echo ('\''.$TELEPHONE.'\','); echo ('\''.$TEMP10_NBMAX.'\','); echo ('\''.$TEMP10_TOPIC.'\','); echo ('\''.$TEMP11_NBMAX.'\','); echo ('\''.$TEMP11_TOPIC.'\','); echo ('\''.$TEMP1_NBMAX.'\','); echo ('\''.$TEMP1_TOPIC.'\','); echo ('\''.$TEMP2_NBMAX.'\','); echo ('\''.$TEMP2_TOPIC.'\','); echo ('\''.$TEMP3_NBMAX.'\','); echo ('\''.$TEMP3_TOPIC.'\','); echo ('\''.$TEMP4_NBMAX.'\','); echo ('\''.$TEMP4_TOPIC.'\','); echo ('\''.$TEMP5_NBMAX.'\','); echo ('\''.$TEMP5_TOPIC.'\','); echo ('\''.$TEMP6_NBMAX.'\','); echo ('\''.$TEMP6_TOPIC.'\','); echo ('\''.$TEMP7_NBMAX.'\','); echo ('\''.$TEMP7_TOPIC.'\','); echo ('\''.$TEMP8_NBMAX.'\','); echo ('\''.$TEMP8_TOPIC.'\','); echo ('\''.$TEMP9_NBMAX.'\','); echo ('\''.$TEMP9_TOPIC.'\','); echo ('\''.$TEMPLATE_TYPE.'\','); echo ('\''.$UPLOAD_ID.'\','); echo ('\''.$VILLE.'\','); /* end */ echo ('\''.$ZONE.'\''); /* very end*/ echo (');'); echo "\n\n"; $i++; } }// EOI |
INSERT INTO fsb_cpg_opened.member_list_index_full (id, campagne_id, member_id, client_id, emvhbq, emvisp, datejoin, dateunjoin, email, emvcellphone, emvunroutable, hbq_reason, sms_date_unjoin, sms_emvhbq, sms_hbq_reason, firstname, lastname, title, dateofbirth, adresse, annee_naissance, champ_date_1, champ_date_2, champ_date_3, champ_date_4, champ_date_5, champ_num_1, champ_num_2, champ_num_3, champ_num_4, champ_num_5, champ_txt_3, champ_txt_4, champ_txt_5, clienturn, code, codepostal, country, creneau_horaire, date_abo_alert, date_abo_autopromo, date_abo_bestof_obs, date_abo_bestof_week, date_abo_bestof_w_end, date_abo_news, date_demande_modification_prof, date_desabo_alert, date_desabo_autopromo, date_desabo_bestof_obs, date_desabo_bestof_week, date_desabo_bestof_w_end, date_desabo_news, date_envoi_pdm, date_modification_profil, date_modif_news, email_format, email_origine, emvadmin1, emvadmin2, emvadmin3, emvadmin4, emvadmin5, emvdoublon, fai, frequence, gender, heure_envoi, lastactivity, lg, lhe, messageid_pdm, mobiclip, news_menu, optinalert, optinmonfrance, optinpartenaires, optin_actu_afrique, optin_actu_monde, optin_actu_musique, optin_autopromo, optin_bestof_obs, optin_bestof_week, optin_bestof_w_end, optin_mfi, optin_newsletter5, optin_newsletters, optin_offre_partenaire, optin_offre_rfi, op_marketing, op_webmarketing, pays, profession, seed, segment, SOURCE, synchro_insert, synchro_unjoin, synchro_update, telephone, temp10_nbmax, temp10_topic, temp11_nbmax, temp11_topic, temp1_nbmax, temp1_topic, temp2_nbmax, temp2_topic, temp3_nbmax, temp3_topic, temp4_nbmax, temp4_topic, temp5_nbmax, temp5_topic, temp6_nbmax, temp6_topic, temp7_nbmax, temp7_topic, temp8_nbmax, temp8_topic, temp9_nbmax, temp9_topic, template_type, upload_id, ville, zone) VALUES(NULL,'1','TT1114079764','9437858932541','1187635315','','','12/05/2011','barack.ndlf@lamaisonblanche.eu','','','','','','','Barack','N\'diang-Le floc\'h','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','1','1','False','','','','','','','','','','','','','','','','IHH','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); |
4. Injecter le contenu et nettoyer la BDD des corruptions liées au caractère encoding
Bon disons que vous êtes parvenu(e) à créer votre requête et à l’injecter.
-- se connecter à MySQL /Applications/MAMP/Library/bin/mysql -u root -p -- Utiliser à la BDD USE rfi_cpg_opened; -- Vider la table "aucazou" TRUNCATE TABLE member_list_index_full; -- Injecter le fichier .sql SOURCE /path_to_your_sql_file/insert_full_from_xml.sql; |
Vous pouvez désormais nettoyer les problèmes liés au mauvais encodage des caractères : pays, title, firstname, lastname, profession.
- Exemple simple de nettoyage du champ
pays
UPDATE `member_list_index_full` SET `pays` = REPLACE(`pays` ,'è','è');
- Exemple plus avancé de nettoyage du champ
ville
--- nettoyage du champ ville UPDATE `member_list_index_full` SET ville = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ville,'ü','ü'),'ô','ô'),'ó','ó'),'ê','ê'),'à','à'),'ã','ã'),'Ü','Ü'),'Ô','Ô'),'Ó','Ó'),'Ê','Ê'),'À','À'),'Ã','Ã'),'Ç','Ç'),'Ú','Ú'),'Õ','Õ'),'Í','Í'),'Í','Í'),'É','É'),'Â','Â'),'Á','Á'),'ç','ç'),'ú','ú'),'õ','õ'),'í','í'),'é','é'),'â','â'),'á','á'),'ã','ã'),'ç','ç'),'à ','à'),'à ','à'),'º','º'),'ª','ª'),'ç','ç'),'–','–'),'ó','ó'),'é','é'),'á','á'),'ê','ê'),'ã','ã'),'â','â'),'Ã','í'),'õ','õ'),'Ø','Ø'),'•','-'),'ú','ú'),'à ','À'),'Ã','Ã'),'Ç','Ç'),'â€','"'),'“','"'),'É','É');
Conclusion : Il est certain que c’est un peu fastidieux comme procédure mais c’est parfois un mal nécessaire pour pouvoir exploiter des données trop longtemps endormies.
En savoir plus
- SimpleXML Manipulation XML
http://php.net/manual/fr/book.simplexml.php - Introduction To SimpleXML With PHP
http://www.phpro.org/tutorials/Introduction-To-SimpleXML-With-PHP.html - PHP SimpleXML par w3schools.com
http://www.w3schools.com/php/php_xml_simplexml.asp