Recherche sur le blog

lundi 16 novembre 2015

[Java] Jsoup HTML Parser

Il arrive parfois que l'on retrouve des fichiers dans un format Excel qui ne le sont pas vraiment. En y regardant de plus près et même si l'extension est "xls", on peut tomber nez-à-nez avec un fichier HTML qui contient un tableau. Dans notre cas il a fallu transformer le fichier suivant en un fichier CSV (séparateur ";"). Avec Jsoup, c'est beaucoup plus facile à réaliser ! Il va "parser" le contenu du fichier donné en paramètre... il ne reste plus qu'à manipuler et traiter les différents éléments.
<html xmlns:x="urn:schemas-microsoft-com:office:excel"> 
<table border="1" columns="3"> 
 <tr> 
  <th>Header1</th> 
  <th>Header2</th> 
  <th>Header3</th> 
 </tr> 
 <tr> 
  <td>LaDonnee1</th> 
  <td>LaDonnee2</th> 
  <td>LaDonnee3</th> 
 </tr> 
</table> 
</html>
Ensuite nous allons simplement utiliser l'API Jsoup pour manipuler les différents éléments afin de tout mettre dans un fichier CSV (encodage ANSI). Ici chaque ligne du tableau en HTML va être copiée dans le CSV avec, entre chaque "colonne", le séparateur ";". Une ligne dans le fichier texte = une ligne du tableau HTML.
File input = new File(args[0]); 
File outpt = new File(args[1]); 
Document doc = Jsoup.parse(input, "UTF-8"); 
Elements tbl = doc.select("tr"); 
try (FileOutputStream fos = new FileOutputStream(outpt); 
 BufferedWriter bw = new BufferedWriter(
 new OutputStreamWriter(fos,"UTF-8"))) { 
  for (Element trb : tbl) 
  { 
    Elements td = trb.children(); 
    i = 1; 
    for (Element tdb : td) 
    { 
       if(i==1) { 
         bw.write(tdb.text());
       } else { 
         bw.write(";"+tdb.text()); 
       } 
       i++; 
    } 
    bw.newLine(); 
  } 
}
En résumé, voici ce qu'on a réalisé :
  • Parsing du document avec la fonction Jsoup.Parse(). Les paramètres sont le fichier source et le jeu d'encodage (charset). Elle renverra une exception si le fichier n'a pas pu être chargé.
  • Sélection de tous les éléments "tr" avec la méthode Document.select(). Celle-ci doit être appelée directement par l'instance qui a été créée ci-dessus. 
  • On va créer un flux de sortie pour le fichier destination (FileOutputStream) et l'objet qui va nous permettre d'y écrire (BufferedWriter). On en profite pour déterminer le jeu d'encodage de caractères.
  • On parcourt l'ensemble des lignes à l'aide de l'instruction "for". 
  • On récupère les éléments "enfants". 
  • Parmi ces éléments on va considérer qu'il s'agit des lignes. Il faut vérifier plus attentivement mais il semblerait que la méthode "children()" renvoie les éléments qui devraient logiquement apparaitre selon les spécifications de la syntaxe. En effet, durant mes tests, j'ai vu l'élément "tbody" apparaitre, or il n'existe pas dans mon fichier source.
  • Parcourir l'ensemble des cellules (instruction "for").
  • Écriture des données des cellules à l'aide de la fonction bw.write().  
  • On rajoute une nouvelle ligne dans notre CSV avant le prochain tour de boucle à l'aide de la méthode bw.newLine().
  • Les ressources sont automatiquement libérées avec cette syntaxe de "try" Rien n'empêche d'écrire tout ça à l'ancienne!
Et voilà... bien sûr, cela reste très basique et ce code pourrait être amélioré afin de répondre à d'autres cas plus spécifiques. Bon développement et bonne découverte à tous.

samedi 14 novembre 2015

[Social] Facebook active Safety Check

Suite aux récents événements ayant touchés Paris, Facebook a réactivé son service Safety Check qui permet de se signaler comme étant en sécurité (ou de vérifier que vos amis sont sains et saufs). Cette fonctionnalité avait été mise en place en octobre 2014 et devait être activé lors de catastrophes naturelles. Il semblerait que le réseau social ait décidé de le mettre en place pour des situations plus graves comme celle-ci.


Twitter et Snapshat ont également mis ce dispositif en place.

Sources

Les Inrocks.
PureBreak.

[Livre] Et sans lien avec l'informatique

Alors que le monde part totalement en sucette (#ParisAttacks), je vous propose de découvrir le 1er livre d'un ami, destiné aux enfants dès 3 ans. Il s'agit de "La nuit du Lion", édité par Alice et écrit par Rachpunzel. L'ami dont je vous parle, Christophe Antoine, en est l'illustrateur. Aucun rapport avec l'informatique donc, mais c'est l'occasion de vous faire découvrir un dessinateur très doué dans son domaine.

Voici une image tirée du bouquin et le résumé de celui-ci : "Le soleil se couche sur la savane africaine. Timéo le grand lion et Keena la petite souris se blottissent l'un contre l'autre pour dormir. Mais Timéo ne trouve pas le sommeil. Comme tous les soirs, il a peur du noir..."


Le livre est disponible à la Fnac au prix de 12,90 €. Dommage qu'ils n'aient pas jugé utile d'afficher la couverture. N'hésitez pas à l'offrir à vos enfants pour Saint-Nicolas ou même pour Noël.

mardi 10 novembre 2015

[WD20] Remplir plusieurs cellules Excel par OLE

Cette technique permet de gagner en performances lorsqu'on cherche à piloter Excel à l'aide d'OLE Automation. En effet, si par exemple on cherche à alimenter les cellules A1 à B5 (soit 10 cellules, sur deux colonnes distinctes), on va pouvoir utiliser un tableau de variants à 2 dimensions. La solution a été proposée sur les forums de PC SOFT par Jurassic Pork.

Si vous ne vous souvenez plus de la manière dont il faut déclarer les différentes variables afin de piloter Excel, vous pouvez consulter l'article "Pilotage Excel via OLE" sur le blog. Dans notre exemple nous allons déclarer des objets supplémentaires qui représenteront respectivement une feuille spécifique et une plage de cellules.
MaFeuille est un objet automation dynamique
MaPlage est un objet automation dynamique
MonTableauAutomation est un tableau de 5 par 2 Variant

MaFeuille = objXLApp>>Worksheets("Feuil1")
POUR i = 1 A 5
  MonTableauAutomation[i,1]="Donnée_A_" + i
  MonTableauAutomation[i,2]="Donnée_B_" + i
FIN

MaPlage = MaFeuille>>Range("A1:B5")
MaPlage>>Value = MonTableauAutomation
Dans le code ci-dessus on a volontairement supprimé l'ouverture du classeur et le test pour vérifier s'il a bien été chargé. La déclaration de l'objet "objXLApp" n'est d'ailleurs pas présente ici. Bon développement à tous.

mercredi 4 novembre 2015

[Cloud] Microsoft change sa politique OneDrive

C'est ce qui a été décidé pour début 2016 : les nouveaux comptes OneDrive, ainsi que les existants, ne bénéficieront plus des 15 Go gratuits. Il faudra désormais se contenter de 5 Go et même le bonus de 15 Go lié à la "pellicule" ne sera plus attribué. Cela va même plus loin : Microsoft a décidé d'arrêter le stockage illimité pour Office 365 Home, University et Personnal, et de supprimer les options de stockage de 100 et 200 Go pour passer à 50 Go à 1,99 € / mois. Pour plus d'informations vous pouvez consulter la note officielle publiée sur le blog lié à OneDrive. Inutile de dire que ça ne plait pas à grand monde...


Sources

[Info] Mise à jour de la section Logithèque

Si vous ne l'avez pas encore remarqué, j'ai mis à jour la page Logithèque. Désormais, plutôt que de retrouver tous les logiciels sur une page unique, j'ai séparé en différentes catégories. Ainsi il ne sera plus nécessaire de faire défiler toute la page pour trouver ce que l'on cherche. C'est par ici que ça se passe : vers la logithèque. N'oubliez pas que vos commentaires sont les bienvenus : critiques, suggestions d'utilitaires à rajouter, etc.