Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/12/2011, 12h52   #1
Membre habitué
 
Inscription : janvier 2005
Messages : 527
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 527
Points : 134
Points : 134
Par défaut Déterminer le séparateur d'un csv

Bonjour,

Les données de ma base sont importées à partir d'un csv obtenu à partir d'un autre logiciel:
- Quand l'utilisateur clique sur exporter/enregistrer depuis l'autre logiciel, le séparateur est la virgule.
- Quand l'utilisateur clique sur exporter/ouvrir depuis l'autre logiciel, puis enregistrer sous, le séparateur est le point virgule.

Pour ne pas obliger l'utilisateur à choisir l'une ou l'autre méthode, j'ai créé 2 fichiers de spécification, 1 pour la virgule, 1 pour le point virgule. Mon problème est de déterminer en vba le séparateur du csv.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub FindSep()
    Dim xlApp As Excel.Application
    Dim xlSheet As Excel.Worksheet
    Dim xlBook As Excel.Workbook
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.application")
    If Err <> 0 Then
        Set xlApp = CreateObject("Excel.application")
    End If
    Err.Clear
    On Error GoTo 0
    Set xlBook = xlApp.Workbooks.Open("Import.csv")
    If xlApp.Sheets("Import").Columns("A:A").DelimiteurChamp = virgule Then     'je ne sais pas quelle est la variable correspondnat au séparateur de champ
	DoCmd.TransferText acImportDelim, "Import_V", "D_TMP", "Import.csv", False 'spec avec virgule
    Else
	DoCmd.TransferText acImportDelim, "Import_PV", "D_TMP", "Import.csv", False 'spec avec point virgule
    End If
End Sub

Merci de votre aide
debdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 15h11   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 479
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 479
Points : 7 568
Points : 7 568
Est-ce que tu connais la structure de ton fichier à l'avance ?

Peux-tu raisonnablement penser qu'il n'y aura pas de ; dans tes données ?

Si oui tu peux simplement ouvrir le fichier en lecture séquentielle, lire la 1ère ligne et regarder si elle contient un ;. Si oui à priori le séparateur est ; sinon c'est virgule.

Autre solution plus élaborer :
ouvrir le fichier en lecture séquentielle
lire la 1ère ligne
découper la ligne sur les ;
compter le nombre d'éléments obtenus
comparer ce nombre avec le nombre attendu de champs.

Pour ouvrir un fichier en lecture séquentielle :

Code :
1
2
3
4
5
6
7
8
9
10
dim numfic as long:numfic=freefile()
dim nomFic as string:nomFic="X:\Chemin\NomTonFichier.csv"
dim lf as string
open nomFic for input as #numfic
 
if not eof(#numfic) then
   line input #numfic, lf
end if
 
close #numfic
Test simple si ;

Code :
1
2
3
4
5
if instr(lf,";") <>0 then
     'Le séparateur est un ;
   else
     'Le séparateur probablement est un ,
end if
Test plus compliqué si ;

Code :
1
2
3
4
5
6
7
dim t as variant:t=split(lf,";")
 
if ubound(t)+1=NombreChamps then
    'C'est un ;
  else
    'C'est probablement une ,
end if
A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 16h40   #3
Membre habitué
 
Inscription : janvier 2005
Messages : 527
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 527
Points : 134
Points : 134
Salut marot_r,

Je n'ai pas encore testé ton code mais je te remercie déjà de m'avoir répondu.

Je connais le nombre de champs du csv à l'avance. Par contre, il se peut qu'il y ait des points virgules dans les données elles-mêmes (saisie libre pour certaines variables).

Ce que je me dis en voyant ta proposition, c'est que je peux appliquer ta 1ère solution en ne lisant que la 1ère ligne du fichier correspondant aux entêtes: cette ligne n'a pas de point virgule dans le nom des colonnes, donc si j'en trouve un en lisant la 1ère ligne du fichier, c'est que le séparateur est le point virgule.

Je pars en congés quelques jours, je teste ça vite et je reviens vers toi pour te dire où j'en suis.

Bonnes fêtes de fin d'année !
debdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 09h07   #4
Membre Expert
 
Homme Michel
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 1 584
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2005
Messages : 1 584
Points : 2 143
Points : 2 143
Bonjour,
Citation:
...il se peut qu'il y ait des points virgules dans les données
Alors le point virgule ne pas être un séparateur discriminant suffisant !
sinon il faut l'interdire dans les données.
__________________
"tout le monde veut sauver la planète, mais personne ne veut descendre les poubelles." J Yanne
micniv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 11h38   #5
Membre habitué
 
Inscription : janvier 2005
Messages : 527
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 527
Points : 134
Points : 134
Bonjour à tous !

Et merci

De retour de congés, j'ai pu tester le code et ça fonctionne parfaitement. Donc un grand merci à toi marot_r.

@micniv: peut etre que le point virgule est interdit dans la saisie, je n'en sais rien, les données ne sont pas issues de mon application.
Le code ici fonctionne bien car je regarde la 1ère ligne, ligne d'entête où je suis 100% sur qu'il n'y a pas de points virgules.

Voilà.
Bonne journée !
debdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h09.


 
 
 
 
Partenaires

Hébergement Web