Convertir fichiers html en CSV

Bonjour Forum,

Je sollicite votre aide pour m'aider avec du VBA à convertir des fichiers HTML en format CSV.

Je joins un exemple de ces fichiers à ce message comportant quelques lignes pour vous donner une idée sur la structure html. Une structure qui est un peu complexe. Certains fichiers comportent juste 2 tables, soit la table de requête (les éléments de recherche), et la table des produits. D’autres comportent 4, 6, etc.

Ce qui m’intéresse ce sont la ou les tables des produits. Je cherche donc à supprimer d'abord les tables contenant les limites/requêtes d'extraction de données (fournisseur, produit, tri....); et convertir que les autres tables contenant les produits en forme de tableau structuré ou en csv exportable directement après la fin de l’exécution de la macro.

Quelques précisions :

À part le numéro de produit qui est quasiment présent dans toutes les lignes, les autres colonnes pourraient ne pas contenir des données.

J’aimerais ajouter une nouvelle colonne "Modèle" et copier le numéro de modèle de la colonne (produit / modèle) et l'insérer dans cette nouvelle colonne, si existe. Il est affiché toujours sous le nom de produit.

Important: Pour certaines lignes, le nom de produit comporte plusieurs modèles, j'aimerais que le nom de produit soit dupliqué pour chaque modèle.

Aussi, créer des cellules vides dans le CSV pour les informations manquantes dans certaines cases des tables html.

Si c'est possible aussi avoir les données dans cet ordre : No produit, En Stock, produit, modèle, date d'achat, date de fabrication, et que le séparateur soit pipe |

Je joins aussi un exemple du résultat souhaité en CSV.

Merci beaucoup à l'avance de votre aide.

41htmltocsv.zip (2.61 Ko)

Bonjour,

En mettant ton fichier html sur serveur distant ...

Sub Maj()
Dim URL$, obj As New DataObject
    DoEvents
    URL = [www]
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        If .Status = 200 Then
            For i = 1 To UBound(Split(.responseText, "<table"))
                txt = "<table" & Split(Split(.responseText, "<table")(i), "</table>")(0) & "</table>"
                If InStr(txt, "Produit / ") > 0 Then
                    obj.SetText txt
                    obj.PutInClipboard
                    ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
                    ActiveSheet.Paste
                    ActiveSheet.Name = "Table #" & i
                    csv
                    Application.DisplayAlerts = False
                    ActiveSheet.Delete
                    Application.DisplayAlerts = True
                End If
            Next
        End If
    End With
MsgBox "Fin !"
End Sub

Sub csv()
    Close #1
    Open ThisWorkbook.Path & "\" & ActiveSheet.Name & ".csv" For Output As #1
    For li = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        txt = ""
        For co = 1 To Cells(li, Columns.Count).End(xlToLeft).Column
            txt = txt & Cells(li, co) & "|"
        Next
        Print #1, txt
    Next
    Close #1
End Sub

Le problème que je rencontre est un problème de codage du fichier html comportant des caractères accentués et mal interprétés par CreateObject("MSXML2.XMLHTTP") même si ton fichier est déclaré en "charset=ISO-8859-1". Il faudrait que par exemple les é soient écrits é ou é !

La solution serait alors de lire directement le code source ! Est-ce que ton fichier est sur serveur distant ou disponible sur PC ?

23html2csv.xlsm (20.92 Ko)

Bonjour

A noter qu'il s'agit d'un multipost.

J'ai donné une solution PowerQuery sur un des post

Pour Steelson : j'avais le même problème pour les caractères accentués. En fait le charset est faux : c'est de l'utf-8

Cela m'intéresse de voir ton code pour le fichier sur ddur

@Steelson

Bonjour,

J'ai testé le code, mais il ne fonctionne pas. Il ne génère même pas un fichier csv pour vérifier.

Mes fichiers sont sur PC.

Pour l'encodage, voici une solution qui pourrait contourner ce problème.

Ouvrir le fichier avec Bloc-notes

Changer l'encodage dans meta charset="UTF-8"

Enregistrer-sous le fichier et choisir UTF-8 dans Encodage

Voir p.j.

Merci pour ton aide!

encodage

@78chris

Bonjour,

La structure de ces fichiers est différente. J'ai appliqué ta solution PowerQuery, mais ca n'a pas fonctionné.

Pour le problème d'encodage, voir ma réponse précédente.

Merci

Solution locale quelque soit le charset

Erreur de fichier

18html2csv-copie.xlsm (22.03 Ko)

Un peu plus de détail sur cette solution pour laquelle j'ai mis en choix le fichier html d'origine :

  • Choix du fichier html
  • Ouverture du fichier et lecture ligne à ligne pour en récupérer la "source"
  • Découpage pour ne retenir que les tables
  • Copie des tables pertinentes dans un onglet via le presse-papier (excel dans ce cas traduit très bien les tables html)
Sub lire()
Dim obj As New DataObject, fichier As Variant

    fichier = Application.GetOpenFilename("Fichiers html (*.htm*), *.htm*")
    If fichier = False Then Exit Sub

    filenumber = FreeFile
    recup = ""
    Open fichier For Input As filenumber
    Do Until EOF(filenumber)
        Line Input #1, ligne
        recup = recup & ligne & Chr(10)
    Loop
    Close filenumber

    n = 1
    For i = 1 To UBound(Split(recup, "<table"))
        txt = "<table" & Split(Split(recup, "<table")(i), "</table>")(0) & "</table>"
        If InStr(txt, "Produit / ") > 0 Then
            obj.SetText txt
            obj.PutInClipboard
            ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
            ActiveSheet.Paste
            ActiveSheet.Name = "Table #" & n
            n = n + 1
            csv True
            Application.DisplayAlerts = False
            ActiveSheet.Delete
            Application.DisplayAlerts = True
        End If
    Next

    MsgBox "Fin !"

End Sub

Sauvegarde dans une fichier csv avec comme séparateur | comme demandé.

Sub csv(ok As Boolean)
    Close #1
    Open ThisWorkbook.Path & "\" & ActiveSheet.Name & ".csv" For Output As #1
    For li = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        txt = ""
        For co = 1 To Cells(li, Columns.Count).End(xlToLeft).Column
            txt = txt & Cells(li, co) & "|"
        Next
        Print #1, txt
    Next
    Close #1
    MsgBox """" & ThisWorkbook.Path & "\" & ActiveSheet.Name & ".csv"" sauvegardé !"
End Sub
34html2csv-local.xlsm (22.17 Ko)
10table-1.csv (428.00 Octets)
13table-2.csv (1.05 Ko)

@Steelson

Bonjour,

J'ai testé le code, mais il ne fonctionne pas. Il ne génère même pas un fichier csv pour vérifier.

Mes fichiers sont sur PC.

J'avais bien précisé que la solution était pour serveur distant.

@debenexcel

merci de nous faire un retour sur les propositions.

Bonjour Steelson

J'ai de mon côté testé mais le résultat n'est pas correct

Cela doit donner un seul CSV mais surtout l'agencement des données n'est pas correct car il faut mélanger des données de plusieurs lignes pour avoir les données d'une seul appareil

Avec PQ j'obtiens a priori les bons résultats.

Comme je l'avais dit il s'agit d'un multipost et debenexcel a continué sur l'autre (ou un autre ?) forum

Mais je garde ton code intéressant pour d'autres cas

Bonjour à tous,

D'un autre côté Chris, peu importe le forum qu'on est en train de parcourir, on tombe sur toi qui donne un coup de main ...

On peut en arriver à penser que tous les forums ne forment qu'une seule et même entité

l'agencement des données n'est pas correct car il faut mélanger des données de plusieurs lignes pour avoir les données d'une seul appareil

Ce qui est tout à fait possible (et simple) avec VBA aussi. Sauf qu'a priori les instructions ne sont pas ici ... j'ai cru apercevoir un autre post qui traitait de cela. J'attends en fait que debenexcel se manifeste et donne son avis + ses besoins complémentaires.

RE

Sauf qu'a priori les instructions ne sont pas ici ...

En fait il faut se baser sur le csv joint au 1er post pour comprendre la logique par rapport au fichier html du même zip

A noter en plus que libellés d'appareils peuvent commencer par un nombre...

ok merci

Dans ce cas la partie csv devient

Sub csv(ok As Boolean)
    Close #1
    Open ThisWorkbook.Path & "\" & ActiveSheet.Name & ".csv" For Output As #1
    For li = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        txt = ""
        If Cells(li, Columns.Count).End(xlToLeft).Column = 1 Then
            PROD = Cells(li, 1)
        Else
            txt = Cells(li, 2) & "|" & Cells(li, 4) & "|" & PROD & "|" & Cells(li, 1) & "|" & Cells(li, 3) & "|" & Cells(li, 5)
            Print #1, txt
        End If
    Next
    Close #1
    MsgBox """" & ThisWorkbook.Path & "\" & ActiveSheet.Name & ".csv"" sauvegardé !"
End Sub

Re @Steelson

Bonjour,

Je viens de tester ton dernier code, et le résultat n'est pas correct, malheureusement.

Il génère 2 fichiers csv, et ne traite que 11 lignes. Le total de codes dans le fichiers HTML est 13.

Il ne traite pas la dernière ligne (code 6107 dans la 1ere table, et le code 75328 dans la 2e table).

PS: J'attendais quelques ajustements de @Chris dans l'autre forum, mais le résultat obtenu avec PQ est parfaite.

Merci

Si tu as ce qui te convient c'est parfait,

Il génère 2 fichiers csv, et ne traite que 11 lignes.

Le total de codes dans le fichiers HTML est 13.

J'ai rassemblé en un seul fichier csv (désolé, je n'avais pas pu deviner)

J'ai corrigé l'erreur due au fait que le dernier item de chaque tableau n'avait pas de code

Rechercher des sujets similaires à "convertir fichiers html csv"