Importation fichier csv multi-lignes

hlife

XLDnaute Nouveau
Bonjour,

J'ai un fichier .csv que je désire importer dans EXCEL.
Mon problème est qu'il contient des champs texte qui peuvent comporter plusieurs lignes.
Ces champs sont délimités par des ".

Exemple (voyez l'adresse de Jean):

Nom,Adresse,Téléphone
Jean,"2 rue de la Paix
75002 Paris",606060606
Pierre,"17 rue des Fleurs",102030405

L'importation dans EXCEL génère bien sûr 4 lignes, alors que j'en voudrais 3, comme dans la pièce jointe.

Avez-vous des solutions pour moi? J'ai cherché en vain comment générer via l'import le <Alt><Entrée> de EXCEL.

Merci d'avance

Henri
 

Pièces jointes

  • Xls.jpg
    Xls.jpg
    10.4 KB · Affichages: 100
  • Xls.jpg
    Xls.jpg
    10.4 KB · Affichages: 103
  • Xls.jpg
    Xls.jpg
    10.4 KB · Affichages: 103
  • xls.docx
    10.1 KB · Affichages: 53
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Importation fichier csv multi-lignes

Bonjour hlife,

Bienvenue sur XLD,

Je pense qu'il nous faudrait un exemple de CSV (une ou 2 lignes suffit, sans données confidentielles) pour voir le type de retour à la ligne qu'il y a dedans (il y a 2 types de retours à la ligne LF et CR)

Edit : Bonjour Michel :)
 

hlife

XLDnaute Nouveau
Re : Importation fichier csv multi-lignes

Michel, je viens de rajouter dans mon post un fichier xls.docx (il semble que je ne puisse pas télécharger un fichier .csv ou .txt), qui correspond à mon exemple.
Dans la réalité, mon fichier est le résultat d'un export fait à partir de Google Contacts.

Je devrais pouvoir tester et adapter une solution potentielle suivant que mon fichier d'entrée contienne des CR, LF ou CR/LF.
 

MJ13

XLDnaute Barbatruc
Re : Importation fichier csv multi-lignes

Re , Bonjour Tototiti

Pour joindre un .Csv, il faut le zipper.

Avec un .doc, on ne peux pas faire grand chose car ce n'est pas géré pareil avec Excel.

Donc, un .csv, c'est mieux :).
 

hlife

XLDnaute Nouveau
Re : Importation fichier csv multi-lignes

En pièce jointe, un fichier xls.zip qui contient xls.csv

Merci
 

Pièces jointes

  • Xls.zip
    246 bytes · Affichages: 46
  • Xls.zip
    246 bytes · Affichages: 44
  • Xls.zip
    246 bytes · Affichages: 48
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Importation fichier csv multi-lignes

Re

En effet, ce n'est pas simple. Le mieux serait d'ouvrir le fichier en mode séquentiel avec Input et de tester si on a 1 ou 2 Guillemets. Actuellement, je n'ai pas le temps de le faire.

Mais si quelqu'un veut essayer (très bon Travaux pratiques :eek:).
 

hlife

XLDnaute Nouveau
Re : Importation fichier csv multi-lignes

Je me sens capable d'écrire un petit programme qui re-concatène tout cela, mais comment faut-il coder le caractère de saut de ligne pour qu'il soit interprété comme ALT/ENTREE au moment de l'import dans EXCEL ?
 

hlife

XLDnaute Nouveau
Re : Importation fichier csv multi-lignes

Ce que je cherche aujourd'hui, c'est une procédure qui automatise l'opération (à la différence de la manip dans WORD) et qui ne se contente pas de supprimer les CR/LF mais qui insére à la place, à l'intérieur de la cellule EXCEL, le caractère de saut de ligne (ALT/ENTREE).
 

tototiti2008

XLDnaute Barbatruc
Re : Importation fichier csv multi-lignes

Bonsoir,

Peut-être un truc du genre (à adapter)

VB:
Sub ImportCSV()
Dim FSO As Object, F As Object, F1 As Object, Ligne As String, VraieLigne As String, CompteGuillemets As Long
Dim Wkb As Workbook
    Set FSO = CreateObject("Scripting.Filesystemobject")
    'F est le fichier CSV original --CHEMIN A ADAPTER--
    Set F = FSO.opentextfile("C:\xls.csv", 1, False, -2)
    'F1 est une version modifiée de celui-ci où on enlève les retour à la ligne gênants --CHEMIN A ADAPTER--
    Set F1 = FSO.createtextfile("C:\xls2.csv", True)
    Ligne = ""
    VraieLigne = ""
    'Compteguillemets représente le nombre de guillemets double dans tout le texte du fichier CSV
    CompteGuillemets = 0
    Do Until F.atendofstream
        Ligne = F.readline
        For i = 1 To Len(Ligne)
            If Mid(Ligne, i, 1) = Chr(34) Then
                CompteGuillemets = CompteGuillemets + 1
            End If
        Next i
        'Si retour à la ligne gênant, on le remplace par "µ$§"
        'et on concatène les lignes dans la variable VraieLigne
        VraieLigne = VraieLigne & IIf(Len(VraieLigne) > 0, "µ$§", "") & Ligne
        'Si le compte de guillemets est pair, on écrit la ligne dans F1
        If CompteGuillemets Mod 2 = 0 Then
            F1.writeline VraieLigne
            VraieLigne = ""
        End If
    Loop
    'On ferme les fichiers CSV
    F1.Close
    F.Close
    Set F1 = Nothing
    Set F = Nothing
    Set FSO = Nothing
    'On ouvre le fichier modifié
    Set Wkb = Workbooks.Open(Filename:="C:\xls2.csv", local:=False)
    With Wkb.ActiveSheet
        'On remplace dedans les caractères "µ$§" par des retours dans les cellules
        .Cells.Replace What:="µ$§", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
        .Cells.EntireRow.AutoFit
    End With
    Set Wkb = Nothing
End Sub
 

hlife

XLDnaute Nouveau
Re : Importation fichier csv multi-lignes

Merci beaucoup tototiti2008, je devrais pouvoir me débrouiller avec ce code, tester et poster le résultat des courses pour information. Chr(10) doit être le caractère que je cherchais.

Merci encore
Henri
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Importation fichier csv multi-lignes

Re

Félicitations à Tototiti pour son superbe code :eek:.

Une autre technique si tu as bien une séparation par une virgule entre chaque champs. En considérant que tu as ouvert le fichier xls.csv via l'expolrateur.

Code:
Public zone
Sub test()
Sheets("Xls").Copy After:=Sheets(1)
derl = Range("A65536").End(xlUp).Row
Range("A2:A" & derl).Select
zone = Selection.Address
For Each cell In Selection
n = 0
For i = 1 To Len(cell)
If Mid(cell, i, 1) = "," Then n = n + 1
Next
cell.Offset(0, 1) = n
Next
For Each cell In Selection
cell.Select
If cell.Offset(0, 1) = 3 Then GoTo suite
If cell.Offset(0, 1) = 2 Then GoTo suite Else Concatene
suite:
Next
Supprime_Lignes
MEF
End Sub
Sub Concatene()
'Stop
a = ActiveCell: b = ActiveCell.Offset(1, 0)
c = a & " " & b
ActiveCell = c
ActiveCell.Offset(1, 1) = 3
End Sub
Sub Supprime_Lignes()
Range(zone).Select
For Each cell In Selection
cell.Select
If cell.Offset(0, 1) = 3 Then Rows(cell.Row & ":" & cell.Row).Delete Shift:=xlUp
Next
End Sub
Sub MEF()
    Columns("B:B").Select
    Selection.Delete Shift:=xlToLeft
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=True, FieldInfo:= _
        Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
        Cells.Select
    Cells.EntireColumn.AutoFit
    Range("A1").Select
End Sub
 
Dernière édition:

Membres actuellement en ligne

Statistiques des forums

Discussions
314 499
Messages
2 110 250
Membres
110 711
dernier inscrit
chmessi