Fichier csv

Bonjour à tous,

je possède un fichier UTF-8 qui est généré par un outil externe que je ne peux pas paramétrer autrement.

Quand j'ouvre le fichier avec Bloc Note, je vois les accents français correctement.

si je l'ouvre avec excel (comme un classeur), excel reconnait un UTF-8 et arrive à me traduire correctement les fins de ligne et les colonnes (délimitées par des ; )

Cependant, il me faut une lecture ligne par ligne du fichier pour pouvoir effectuer des traitement dessus (recherche et extraction de certaines lignes)

j'utilise le code suivant :

num_fich = FreeFile
       fich_in = Application.GetOpenFilename("Fichier salaries (*.csv), *.csv", , "Choisir le fichier contenant les données salariés", "Sélectionner le fichier salariés", False)
       Open fich_in For Input As #num_fich
    liste_champs = Split(entete, ";")

MsgBox(" contenu de l'entête : " & entete )
    For i = 0 To UBound(liste_champs, 1)
              ** traitement sur l'entête pour déterminer les colonnes à analyser **
   Next i

Quand j'exécute le code, la MsbBox me montre que l'entête est "mal" lu puisque j'ai les caractère accentués qui sont mal affichés

J'ai également l'impression que les fins de ligne ne sont pas gérés.

Par conte si j'ouvre le fichier csv dans excel puis que je le réécrit au format csv via excel, la lecture du noveau fichier ne pose aucun problème.

j'en déduis un problème de lecture du format UTF-8

=> je n'arrive pas à savoir quel est le format utilisé lorsqu'on utilise les fonctions Open / Line

=> je n'arrive pas à savoir ce que je dois modifier dans un fichier UTF-8 pour le rendre lisible "ligne par ligne" par la fonction Line (ou une autre)

Vu la taille du fichier il n'est pas possible de charger dans un tableau (ou même dans une feuille de classeur) la totalité du fichier

actuellement la seule solution que je vois c'est de couper le fichier en plusieurs morceaux, chargés manuellement dans excel, faire la sauvegarde de chaque partie en csv puis recoller les morceaux de fichier ensemble...

Comme je dois faire la manipulation plusieurs dizaines de fois par semaine... je cherche une solution plus "automatique"

Merci

Bonjour,

Pour ça, il y a l'excellent module de Cyberpat92 (ci-joint)

Par ailleur, si tu lis le csv sans modif, il vaux mieux le lire en Read (et pour ma part je lis toujours en binaire)

En collant le code de Cyberpat92 dans un module quelconque de ton projet, ton code devient alors :

'...
Dim S As String
    '...

    num_fich = FreeFile
    fich_in = Application.GetOpenFilename("Fichier salaries (*.csv), *.csv", , "Choisir le fichier contenant les données salariés", "Sélectionner le fichier salariés", False)
    Open fich_in For Binary Access Read As #num_fich
    Get #num_fich, , S
    Close #num_fich
    S = Decode_UTF8(S)
    '... puis traitement du S récupéré ...

Pierre

12utf8.zip (1.00 Ko)

Au fait à relire ton post, pour découper le résultat "S", il faut d'abord le scinder selon le retour ligne puis selon le ";"

Pour ça je me suis fait ma p'tite fonction :

Function TXT2T(Txt As String, Delim As String) As Variant
' Auteur Pierrep56
Dim Ttk As Variant, T1 As Variant, T2 As Variant
Dim lg As Long, Cl As Long, i As Long, j As Long

    T1 = Split(Txt, vbCrLf)
    lg = UBound(T1)
    T2 = Split(T1(0), Delim)
    Cl = UBound(T2) + 1

    ReDim Ttk(1 To lg, 1 To Cl)
    For i = 0 To lg - 1
        T2 = Split(T1(i), Delim)
        For j = 0 To Cl - 1
            Ttk(i + 1, j + 1) = T2(j)
        Next j
    Next i
    TXT2T = Ttk
End Function

Avec ça, il suffit d'ajouter à ton code :

Dim T as variant
    T=TXT2T(S, ";")

De cette façon le contenu de ton csv est placé dans le tableau T

PS : avec ce code je place un csv de 110Mo de 26 colonnes sur 40 000 lignes dans un tableau (T as Variant)

Mon nombre le ligne de fichier est de l'ordre de 200 000 lignes avec 57 colonnes

D'où la crainte d'avoir un soucis surtout que l'ordinateur en question n'est pas un foudre de guerre

je pars ensuite de ce fichier pour extraire en fonction de certains paramètres une cinquantaine de lignes "utiles"

Je vais tenter avec un tableau pour voir

Bonjour,

Peux-tu préciser la version Excel que tu utilises ? Excel 2017 n'existe pas…

Cdlt.

bonjour à tous

l'extraction et préparation de données (ETL) se fait maintenant avec Power Query

selon la version d'Excel, on le trouve dans le menu Données "récupérer"

trèèèèèès puissant et bourré de fonctions de traitement (j'en découvre tous les jours ! )

des millions de lignes ne lui font pas peur pour ensuite ajouter au modèle de données (mais au cas où on veut "charger" se limiter à qq 100 000 lignes)

J'ai le pack office 2016

J'ai vu la fonction qui permet de faire des tcd à partir de csv

Dans mon cas j'ai 3 fichier avec des champs différent sauf la 1er colonne qui est une clef commune

À partir d'une liste de clefs je lis les 3 fichiers pour extraire les données correspond à cette liste

Mon soucis c'est la lecture ces 3 csv qui sont en utf-8

Si je les ouvre sous excel, excel les lit sans soucis

Je les sauvegarde en csv, là l'utf-8 disparaît . Je ne sais pas le Charest utilisé par excel

Et à partir de ces nouveaux fichiers la macro d'analyse fonctionne

Le pb c'est vraiment cette conversion au départ car cela veut dire que pour un utilisateur lambda cela ne sera pas juste un téléchargement des nouveaux fichiers mais une manipulation plus lourde... Ce que je cherche à éviter

Bonjour à tous,

Fabienne, est-ce que tu veux bien faire un test avec ton csv.

Voici un fichier Démo. Sur la feuille un bouton à cliquer pour choisir un fichier csv (délimité par point-virgule).

Ensuite, si tout va bien, le code lit le csv décode l'UTF8 et colle les 10 premières lignes sur la feuille courante.

142lire-csv-utf8.xlsm (34.66 Ko)

Est-ce que tu peux dire si ça fonctionne?

en tout cas avec mes csv en UTF8 ça marche exemple =>

24presta.csv (663.00 Octets)

A te lire

Pierre

Bonjour et merci

je dois avoir un problème de bibliothèque car quand j'exécute le fichier il ne trouve pas la fonction Left ...

J'ai essayé de mettre en commentaire cette ligne pour voir ce que cela donnait

Après c'est la fonction Space$ qui n'est pas trouvée.

Je n'arrive pas à trouver quelle bibliothèque je dois éventuellement ajouter dans ma configuration.

Bonjour

je n'ai toujours pas compris pourquoi j'avais eu un problème avec l'instruction Left..

j'ai repris ce WE et cela fonctionne

j'ai du reprendre un peu la fonction mais la conversion UTF8 marche parfaitement.

Merci

Rechercher des sujets similaires à "fichier csv"