dates JJ/MM/AA et fichier CSV

jhofman

XLDnaute Occasionnel
Bonjour


j'essaye par tous les moyens (depuis des mois) à lire des données dates stockées dans un fichier CSV.

Ces dates sont parfois inversées : 12/01/2010 -> 01/12/2010. et donc mes traitements perdent en fiabilité !!!

Comment éviter ce problème ?
Doit-on comme je l'ai lu faire en sorte que les date dans le fichier csv soient exportées systématiquement au mm/jj/aaaa ???
Merci de votre aide. je ne vois pas de solutions sans changer format fichier csv en entrée dont je ne suis pas maître.
 

mromain

XLDnaute Barbatruc
Re : dates JJ/MM/AA et fichier CSV

Re bonjour à vous deux ;)

jhofman : je viens de te proposer une solution ici.

Par contre, j'ai supposé que toutes les dates présentes dans le fichiers csv sont de la forme mm/jj/aaaa.

Ci certaines sont de cette forme et d'autres du type jj/mm/aaaa, ça risque être un peu plus lourd. - dans ce cas, la macro (dans cet état) devrais planter.

Sinon, si tu peux jouer sur le format d'export des dates lors de la création du fichier csv c'est une autre histoire.
Personnellement, j'aime bien les dates au format aaaammjj (ou aaaa.mm.jj, aaaa-mm-jj). En effet, il est assez facile de les convertir en Date (à proprement parler) dans Excel, mais surtout, ça évite les confusions et permet de trier les données avec un simple tri alphabétique.



@ JM: un gros cap approche ;)

a+
 

jhofman

XLDnaute Occasionnel
Re : dates JJ/MM/AA et fichier CSV

mromain

Le fichier initial mets les dates en format date en jj/mm/aaaa mais lors de la lecture il semble qu'il y ait une conversion des dates ou jj < 13 !! Pour ne faire des dates anglaises mm/jj/aaaa mais je n'ai pas moyen de le déterminer.

J’aurais évidement préféré des dates au format texte 8c : JJMMAAAA mais cela aurait été trop simple !!!!


la macro ajustée ne marche pas dans mon cas. ne pourait-elle pas marcher en supposant entrée jjmmaaaa ? je vais essayer de a modifier.
 

jhofman

XLDnaute Occasionnel
Re : dates JJ/MM/AA et fichier CSV

Mromain

j'ai modifié le code ainsi et cela semble mieux fonctionner.
je te tiens informé


Code:
Sub ImportCsv(destSheet As Worksheet, csvFilePath As String, Optional delimiter As String = ";")
Dim myFso As Object, csvFile As Object, ligne As Integer, colonne As Integer, tabStr() As String
Set myFso = CreateObject("Scripting.FileSystemObject")
Set csvFile = myFso.OpenTextFile(csvFilePath)
While Not csvFile.AtEndOfStream
    ligne = ligne + 1
    tabStr = Split(csvFile.ReadLine, delimiter)
    For colonne = LBound(tabStr) To UBound(tabStr)
        'si l'élément ressemble à une date, la "reformater"
        If tabStr(colonne) Like "??/??/????" Then
            destSheet.Range("A" & ligne).Offset(0, colonne) = [B]DateSerial(Right(tabStr(colonne), 4), Mid(tabStr(colonne), 4, 2), Left(tabStr(colonne), 2))[/B]        
        'sinon, copier l'élément tel quel
        Else
            destSheet.Range("A" & ligne).Offset(0, colonne) = tabStr(colonne)
        End If
    Next colonne
Wend
End Sub
 

mromain

XLDnaute Barbatruc
Re : dates JJ/MM/AA et fichier CSV

Re bonjour,


Si les deux formats (jj/mm/aaaa et mm/jj/aaaa)sont mélangés, cela risque poser un problème. En effet, si tu as :
30/01/2010 --> pas de problème on peut deviner de quel format il s'agit,
01/30/2010 --> idem,
02/03/2010 --> comment savoir si il s'agit du 2 Mars ou du 3 Février ?

a+
 

jhofman

XLDnaute Occasionnel
Re : dates JJ/MM/AA et fichier CSV

Mromain, le forum

une nouvelle remarque

cette procédure ne sait pas interpréter une données entre quotte avec un séprateur au mileir : exemple si séparateur = ; alors le texte suivant "Alors ; Ca va ?" est interprété en "Alors , puis. je ne sais pas eu lieu de restituer sur une seule cellule Alors ; Ca va ?
Merci de votre aide.
 

jhofman

XLDnaute Occasionnel
Re : dates JJ/MM/AA et fichier CSV

mromain


pour répondre à ton post
Re bonjour,


Si les deux formats (jj/mm/aaaa et mm/jj/aaaa)sont mélangés, cela risque poser un problème. En effet, si tu as :
30/01/2010 --> pas de problème on peut deviner de quel format il s'agit,
01/30/2010 --> idem,
02/03/2010 --> comment savoir si il s'agit du 2 Mars ou du 3 Février ?

a+

j'attends du jj/mm/aaaa mais lors de la lecture cela est transformé automatiquement par excel en mm/jj/aaa quand c'est possible (3ième cas) !!

et je le vois maintentant car mes dates ne doivent pas dépasser la date du jour et j'ai pour le 12 octobre 2010 la date du 10 décembre 2010 qui est donc un signe de la transformation
 

mromain

XLDnaute Barbatruc
Re : dates JJ/MM/AA et fichier CSV

Mromain, le forum

une nouvelle remarque

cette procédure ne sait pas interpréter une données entre quotte avec un séprateur au mileir : exemple si séparateur = ; alors le texte suivant "Alors ; Ca va ?" est interprété en "Alors , puis. je ne sais pas eu lieu de restituer sur une seule cellule Alors ; Ca va ?
Merci de votre aide.
Re,

Un exemple de fichier csv avec tous ces cas d'erreurs possibles, ainsi que le fichier excel souhaité serait une bonne base pour pouvoir t'aider.


Edit:
j'attends du jj/mm/aaaa mais lors de la lecture
Dans tes fichiers csv, la date est toujours au format jj/mm/aaaa ?


a+
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : dates JJ/MM/AA et fichier CSV

Bonjour à tous,

sans vouloir insister, comme je l'avais déjà proposé sur l'autre fil (et non pas que je n'apprécie pas à leur juste valeur les efforts de mromain pour prendre en compte tous les cas) : le plus simple est de changer l'extension de ton fichier en ".txt" puis de l'ouvrir avec OpenText

L'assistant d'ouverture des fichiers textes permet de :
préciser que ce qui est entre guillements est du texte
préciser que tel champ est une date dans l'ordre JMA...

Je ne peux pas ouvrir les zip donc je ne peux pas donner le code exact mais l'enregistreur de macro le fera plutôt bien

Pour changer l'extension, il suffira d'utiliser "Name" qui permet de renommer un fichier, par exemple

Edit : Autre chose, si l'extension ne doit absolument pas être modifiée, il existe encore une autre possibilité : Passer par les données externe (en XL2003 Menu données - Données externes - Importer des données) et là même si l'extension est CSV, l'assistant d'import de texte apparaît
 
Dernière édition:

mromain

XLDnaute Barbatruc
Re : dates JJ/MM/AA et fichier CSV

Re,

Je ne peux qu'être d'accord avec tototiti. Ça commence à devenir une usine à gaz.
Si Excel peut le faire proprement sans macro, ça vaut mieux.
Cependant, vu que la macro est écrite, je la poste :
VB:
Sub ImportCsv(destSheet As Worksheet, csvFilePath As String, Optional delimiter As String = ";")
Dim myFso As Object, csvFile As Object, ligne As Long, colonne As Long, tabStr() As String, tabStr2() As String, nbI As Long, i As Long, flag As Boolean
Set myFso = CreateObject("Scripting.FileSystemObject")
Set csvFile = myFso.OpenTextFile(csvFilePath)
While Not csvFile.AtEndOfStream
    ligne = ligne + 1
    tabStr = Split(csvFile.ReadLine, delimiter)
    flag = False: nbI = -1: ReDim tabStr2(0 To 0)
    For i = LBound(tabStr) To UBound(tabStr)
        If Not flag Then
            If Left(tabStr(i), 1) = """" Then
                flag = True
                tabStr(i) = Right(tabStr(i), Len(tabStr(i)) - 1)
            End If
            nbI = nbI + 1: ReDim Preserve tabStr2(0 To nbI)
            tabStr2(nbI) = tabStr(i)
        Else
            If Right(tabStr(i), 1) = """" Then
                flag = False
                tabStr(i) = Left(tabStr(i), Len(tabStr(i)) - 1)
            End If
            tabStr2(nbI) = tabStr2(nbI) & delimiter & tabStr(i)
        End If
    Next i
    For colonne = LBound(tabStr2) To UBound(tabStr2)
        'si l'élément ressemble à une date, la "reformater"
        If tabStr2(colonne) Like "??/??/????" Then
            destSheet.Range("A" & ligne).Offset(0, colonne) = DateSerial(Right(tabStr2(colonne), 4), Mid(tabStr2(colonne), 4, 2), Left(tabStr2(colonne), 2))
        
        'sinon, copier l'élément tel quel
        Else
            destSheet.Range("A" & ligne).Offset(0, colonne) = tabStr2(colonne)
        End If
    Next colonne
Wend
End Sub
a+
 
Dernière édition:

mromain

XLDnaute Barbatruc
Re : dates JJ/MM/AA et fichier CSV

Re,

Edit : Autre chose, si l'extension ne doit absolument pas être modifiée, il existe encore une autre possibilité : Passer par les données externe (en XL2003 Menu données - Données externes - Importer des données) et là même si l'extension est CSV, l'assistant d'import de texte apparaît
Ou créer une copie à la racine du classeur, la renommer en txt et la supprimer après le traitement.

a+
 

jhofman

XLDnaute Occasionnel
Re : dates JJ/MM/AA et fichier CSV

Mromain & tototiti2008

Merci de votre aide


je suis content de la solution de Mromain qui marche (je n'ai pas encore testé sa dernière version) et suis certaienement pour une solution plus intégrée proposée par tototiti2008 mais mon dernier essai n'était pas concluant. je vais essayer à nouveau cette voie.

Désolé pour le zip, tototiti2008, mais le forum n'accespte pas les csv. de touet façon fichier de test.
Cordialement

je vous tiens informé.
 

jhofman

XLDnaute Occasionnel
Re : dates JJ/MM/AA et fichier CSV

Merci à tototiti2008


Voici le résultat sous forme de fonction adaapté à mon cas sans qu'il soit nécessire de renomer le fichier csv !
Quel soulagement les dates sont bien prises en compte.:)

La solution de mromain marche aussi également dans sa dernière version.

Code:
Sub ImportTXT(destSheet As Range, csvFilePath As String)
 With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & csvFilePath _
        , Destination:=destSheet)
        .Name = "fichierlu"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 4, _
        1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
    
    End Sub
 

Discussions similaires

Réponses
13
Affichages
1 K

Statistiques des forums

Discussions
312 196
Messages
2 086 098
Membres
103 116
dernier inscrit
kutobi87