Double quote CSV

Résolu
cs_ckimoi Messages postés 15 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 mars 2010 - 14 mars 2008 à 11:53
cs_ckimoi Messages postés 15 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 mars 2010 - 14 mars 2008 à 15:56
Hello tous, je galère:
j' ai fichier csv extrait de ma base access qui contient les doubles quotes pour les champs nonn vide,
je l'ouvre sous excel pour le retravailler (format date, classement ....)
je l'enregistre en .CSV
le reouvre avec textpad ou notpad ou wordpad , mais les doubles quote ont disparu pour les champ non vide et j' en ai absolument besoin pour le réimporter dans une bas mysql

j'ai cherché , cherché et cherché et je ne m'en sors pas , qu'est ce que je peux rajouter à cette macro pour lors de l'enregistrement excel me rajoute des guillemets pour encadrer une valeur non nul dans le csv:

Code:
Sub test()
'
' test Macro
' Macro enregistrée le 14/03/2008 par e203112
'

'
    ActiveWorkbook.SaveAs Filename:= _
        "C:\Documents and Settings\e203112\Desktop\arcad\CSV\last\test12h.csv", _
        FileFormat:=xlCSV, CreateBackup:=False
End Sub

12 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
14 mars 2008 à 14:37
A toi de personnaliser la chose, mais voilà deja quelques bases

Sub test()
   ExportCSV ActiveSheet, "C:\a.csv"
End Sub<hr />
Sub ExportCSV(ByRef voSheet As Worksheet, ByRef vsCsvFilePath As String)
Dim nRow As Long
Dim nCol As Long
Dim nRows As Long
Dim nCols As Long
Dim xsParts() As String
Dim nIndex As Long
Dim iFile As Integer
Dim sBuffer As String
Dim bIsLineEmpty As Boolean
Const sSep = ";" '# On pourrais récupérer le separateur de liste spécifié dans les regioal settings
   '# On récupère le nombre de lignes et de colonnes reelement utilisées
   nRows = voSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
   nCols = voSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
   '# On créé un tableau pour contenir les données de la feuille Excel
   ReDim xsParts(nCols * nRows * 2 - 2)
   '# Ensuite, on parcoure chaque ligne
   For nRow = 1 To nRows
       '# On ne stockes pas les lignes vides...
       If bIsLineEmpty Then
           '# ... donc si on en rencontre une, on la suppriem du tableau
           nIndex = nIndex - nCols + 1
       ElseIf nRow > 1 Then
           '# Si on se trouve après la première ligne, on ajoute un saut de ligne
           xsParts(nIndex) = vbCrLf
           '# Et on décale le curseur d'ecriture
           nIndex = nIndex + 1
       End If
       '# On initialise le flag
       bIsLineEmpty = True
       '# Et pour chaque colonne de notre feuille...
       For nCol = 1 To nCols
           '# On ajoute un séparateur (";") entre les colonnes
           If nCol > 1 Then
               xsParts(nIndex) = sSep
               nIndex = nIndex + 1
           End If
           '# On récupère le texte de la cellule en cours
           sBuffer = voSheet.Cells(nRow, nCol)
           '# Si la cellule est non vide...
           If LenB(sBuffer) Then
               '# notre flag passe à False: la ligne doit être conservée
               bIsLineEmpty = False
               '# Ensuite, si on est dans la première colonne
               If nCol = 1 Then
                   '# On mémorise le contenu de la cellule tel quel
                   xsParts(nIndex) = sBuffer
               Else
                   '# Dans le cas contraire, on ajoute des guillemets
                   xsParts(nIndex) = """" & sBuffer & """"
               End If
           End If
           '# Et on décale le curseur d'ecriture
           nIndex = nIndex + 1
       Next nCol
   Next nRow
   
   '# Ici, on ecrit le tableau dans un fichier
   iFile = FreeFile
   Open vsCsvFilePath For Output As iFile
       Print #iFile, Join(xsParts, vbNullString)
   Close iFile
End Sub<hr />
, ----
By Renfield

Renfield
Admin CodeS-SourceS- MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
14 mars 2008 à 12:05
Pas nativement, j'ai l'impression...
cependant, tu peux toujours générer ce fichier par toi même, formatté comme tu le souhaites

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_ckimoi Messages postés 15 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 mars 2010
14 mars 2008 à 13:41
Merci,

j'ai testé aussi ,
 en rajoutant des guillemets dans mes cellules contenant du non vide mais j'obtiens dans le CSV du triple quote
ex: "garage dupont"  me donne en csv """garage dupont""" et moi j'ai besoin d'obtenir "garage dupont"

Mon gros soucie c'est que j'ai 150 colonnes et 20000 lignes (dur dur)

testé également tous les script que j'ai pu trouvé en VBS en sql ... mais appart modifié un quote anglais "," en euro ";" rien y fait

help me please
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
14 mars 2008 à 13:46
je te parlais pas de modifier tes cellules, mais bien d'exporter le fichier toi même, sans passer par SaveAs.

donne moi quelques lignes exemples de ce que tu cherches a obtenir, je vais voir ce que je peux faire de mon coté (sous entendu testes du tiens)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ckimoi Messages postés 15 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 mars 2010
14 mars 2008 à 13:58
Merci,

voilà un exemple de ligne de mon fichier excel:

colonne 1   colonne2   colonne3               colonne4
ER                              garage dupont         SAS

ce que j'obtient en csv:
ER;;garage dupont;SAS;

ce qu'il me faut en csv:
"ER";;"garage dupont";"SAS"

et la cerise ce serait de ne pas avoir les guillemets pour la colonne 1:
ER;;"garage dupont";"SAS"

<col style=\"width: 60pt;\" span=\"3\" width=\"80\" /><col />----
ER, , , SARLAT AUTOS, , SAS, <col style=\"width: 419pt;\" width=\"559\" /><col style=\"width: 78pt;\" width=\"104\" /><col style=\"width: 60pt;\" width=\"80\" />
<col style=\"width: 60pt;\" span=\"3\" width=\"80\" /><col />----
ER, , , SARLAT AUTOS, , SAS, <col style=\"width: 419pt;\" width=\"559\" /><col style=\"width: 78pt;\" width=\"104\" /><col style=\"width: 60pt;\" width=\"80\" />
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
14 mars 2008 à 14:08
NB: "Réponse acceptée" c'est juste quand ton probleme est solutionné, pour indiquer les posts qui t'ont aidé...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_ckimoi Messages postés 15 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 mars 2010
14 mars 2008 à 14:22
Ok je debute , lol, 1000 excuses
0
cs_ckimoi Messages postés 15 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 mars 2010
14 mars 2008 à 14:42
super ,

je vais bosser la dessus et pondre un script pour ceux que ca interesse ,

encore merci
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
14 mars 2008 à 14:45
si tu te demande pourquoi je compliques la chose avec un tableau, c'est pour accélerer le traitement... j'évite de me trainer une chaine que j'agrandirait n fois, j'evite aussi de faire n accès au fichier...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_ckimoi Messages postés 15 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 mars 2010
14 mars 2008 à 14:50
De la folie,

toi t' es un pro , j'ai rien a modifier c'est exactement le resultat escompté,

je vais analyser le script pour mieux le comprendre mais tu m'enleve un Glaive du pied

Thanks again
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
14 mars 2008 à 14:55
l'important c'est que tu le comprenne, effectivement.
ravi de voir que tu aprécie le cote plug & <strike>play</strike> run

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_ckimoi Messages postés 15 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 mars 2010
14 mars 2008 à 15:56
Compliqué la chose, c'est pas le mot, je prefers toujours en avoir trop que pas assez,
et effectivement pour 20000 lignes et 130 colonnes, le traitement a duré moins d'une minute!!!

PS: je me suis penché dessus et j'avoue que ce script est parfais même la cerise y est:
If nCol = 1 Then
                   '# On mémorise le contenu de la cellule tel quel
                   xsParts(nIndex) = sBuffer
               Else
                   '# Dans le cas contraire, on ajoute des guillemets
                   xsParts(nIndex) = """" & sBuffer & """"

tu meriterai un salaire pour ça ;)
0
Rejoignez-nous