IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Caractere vbLf en vb 2010


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut Caractere vbLf en vb 2010
    Bonjour,
    Je travaille dans une appli de traitement de fichier excel en VB 2010 converti en csv.
    Je suis débutant en vb et je n'arrive pas à éliminer le caractère "0A" qui se trouve à l'intérieur des cellules du tableur à l'origine et qui reste après la conversion en csv.
    cordialement

  2. #2
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Comment sais-tu qu'il s'agit du caractère 0A ? Serait-il visible dans le CVS ?

    S'il est visible, il doit être possible d'ouvrir le CVS avec Notepad et de faire un Recherche-Remplace (<CTRL><H>) de ce caractère spécial par rien. Tous les 0A seraient ainsi ôtés du CVS.

    Ne peux-tu nous fournir un extrait du fichier CVS ?

    ...


  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut Caractere vbLf
    Re,
    J'ai vérifié avec le logiciel WinHex.Nom : Dump.jpg
Affichages : 106
Taille : 312,9 Ko
    merci

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Tu as effectivement des 0A dans le fichier mais attention, certains sont consécutifs de 0D : 0A 0D représente une séquence de retour chariot ...

    Peut-être que ce n'est pas une bonne idée de lire un fichier de type TXT (CVS est un TXT) avec un éditeur hexadécimal.

    Je pourrai peut-être t'aider davantage si tu m'envoies un morceau de ce fichier CVS (même avec des données fictives) et si tu expliques en quoi ces caractères 0A te dérangent (alors que le 0D ne te gêne pas).


  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Bonjour et merci pour ta réponse.
    Voici deux exemples correspondant au fichier dump : xls et csv.
    Nom : xls.jpg
Affichages : 98
Taille : 110,9 Ko
    Nom : csv.jpg
Affichages : 101
Taille : 103,6 Ko
    Mon travail part d'un fichier PDF que je converti en XLS et CSV pour aboutir par traitement VB 2010 en un fichier texte (Format GedCom) utilisé par les généalogiste pour intégrer des données dans leur arbre généalogique.
    Les "0D 0A" sont à la fin de chaque enregistrement ou ligne XLS et CSV et ne me gêne pas. Par contre les "0A" qui ont été mis inutilement et volontairement par le site à l'origine du PDF me gênent.
    Dans mon traitement VB je charge le CSV et je le met dans une DataTable et un DataGridView et c'est là que je butte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
       Public Function Read() As DataTable
            '
            RaiseEvent StartRead(Me, New System.EventArgs)
            '
            Dim Table1 As New DataTable
            Dim fs As FileStream = Nothing
            Dim sr As StreamReader = Nothing
            Dim Initialized_Columns As Boolean
            '
            Try
                'Déclarations
                fs = New FileStream(NomFichier, FileMode.Open)
                sr = New StreamReader(fs, System.Text.Encoding.UTF8)
                Dim Ligne As String = ""
                '
                'Création des colonnes
                If EnteteColonnes Then
                    Ligne = sr.ReadLine
                    Dim ColumnsName() As String = Split(Ligne, Separateur)
                    For Each Column As String In ColumnsName
                        Table1.Columns.Add(Column, GetType(String))
                    Next
                End If
                '
                While Not sr.EndOfStream
                    '
                    'Lecture de la ligne et séparation des champs
                    Ligne = sr.ReadLine
                    MsgBox(Ligne)
                    Dim Cells() As String = Split(Ligne, Separateur)
                    '
                    'Crée les entêtes de colonnes par défaut si la première ligne ne comporte pas le nom des colones
                    If Not EnteteColonnes And _
                       Not Initialized_Columns Then
                        For i = 0 To Cells.Length - 1
                            Table1.Columns.Add("Colonne " & i, GetType(String))
                        Next
                        Initialized_Columns = True
                    End If
                    '
                    'Ajout des champs dans la table
                    Dim Row As DataRow = Table1.NewRow
     
                    For i = LBound(Cells) To UBound(Cells)
     
                        If InStr(Cells(i), vbLf) <> 0 Then
                            Replace(Cells(i), vbLf, " ")
                        End If
     
                        Row.Item(i) = Cells(i)
                    Next
                    Table1.Rows.Add(Row)
                    '
                End While
                '
                RaiseEvent EndRead(Me, New CSVEventArgs)
                '
                Return Table1
                '
            Catch ex As Exception
                '
                Dim EA As New CSVEventArgs
                EA.Error = ex
                RaiseEvent EndRead(Me, EA)
                Return Table1
                '
            Finally
                '
                'Libération des ressources
                If sr IsNot Nothing Then sr.Close()
                If sr IsNot Nothing Then sr.Dispose()
                If fs IsNot Nothing Then fs.Dispose()
                '
            End Try
            '       
        End Function
    Ce code provient de CodeSources et je n'arrive pas à l'adapter : J'ai rajouté inStr(Cellls(i)... dans la boucle LBound Ubound mais ça ne marche pas.
    Si tu as une idée, je suis preneur.
    Cordialement.

  6. #6
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Salut

    As-tu essayé de détecter vbNeLine ou vbCrLf plutôt que vbLf et dans se cas, éliminer les 2 derniers caractères de la phrase.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Bonjour ProgElect
    Je cherche à éliminer le carac vbLf(0A) situé entre "Grégoire" et "BOISSIERE" en B2 et ainsi de suite dans toutes les cellules comportant plusieurs lignes. Le vbCtrLf (0D0A) se trouve à chaque fin de ligne du tableur et pour l'instant ne me gêne pas.

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Je te propose d'essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ' ... ... ...
                    For i = LBound(Cells) To UBound(Cells)
     
      ' ***                   If InStr(Cells(i), vbLf) <> 0 Then
      ' ***                       Replace(Cells(i), vbLf, " ")
      ' ***                   End If
     
                        Row.Item(i) = Cells(i).Replace(Chr(10), "")
                    Next
    ' ... ... ...

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    merci Phil
    Malheureusement ça n'a pas résolu le pb. voici le résultat.
    Nom : csv modifié.jpg
Affichages : 93
Taille : 150,0 Ko

  10. #10
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Curieux ...

    J'avais fait le test suivant (tu peux le refaire avec et sans le Replace, il suffit d'exécuter la fonction) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Private Sub Test_Trim()
            Dim S As String = "Azerty" & Chr(10) & "."
            MessageBox.Show(S.Replace(Chr(10), ""))
            '   MessageBox.Show(S)
        End Sub
    Mais j'ai un problème avec tes codes : tu montres une feuilles XLS mal formatée (sans doute à cause de 0A), mais le code que tu nous envoies remplit un DataSet et nous ne voyons pas comment tu remplis la feuille XLS.

    Pour continuer à rechercher une solution à ce problème, pourrais-tu envoyer un extrait du fichier CVS (en ZIP attaché, pas en screenshot) que je puisse récrire "ta" fonction Read avec un code de remplissage correct d'une feuille XLS ?
    Et, s'il te plait dis-moi, ta fonction Read retourne un DataTable. Est-il utile ou bien est-il là seulement parce que tu l'as trouvé ainsi en CodeSource ?

    J'ai un peu de temps cet après-midi ...


    ATTENTION !!!
    Depuis mon message ci-dessus, j'ai tenté de reproduire ton problème chez moi ... et j'ai réussi

    Je constate que le problème vient de la manière donc le passage à la ligne a été encodé dans XLS.
    Si on utilise la mise en forme des cellules (de toute la colonne, par exemple) et que dans "Alignement" on coche "Passage à la ligne automatique", il n'y a aucun problème à la lecture du CSV produit.
    Mais si on encode un <ALT><ENTER> dans la cellule, alors celle-là donnera les 0A embêtants dans le CSV.

    D'où, nouvelle question : est-il permis de travailler sur la feuille XLS avant de produire le CSV ? Si oui, je chercherai comment formater correctement la XLS avant CVS.


  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Je n'ai pas trouvé de changement en fonction du paramétrage du "Retour à la ligne" dans le fichier converti en csv. L'affichage change bien dans le fichier xls mais pas dans le csv.

    Au fait ta fonction fonctionnait parfaitement en solo mais adapté dans la classe ça ne marche pas.
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  12. #12
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Voici une solution qui devrait te dépanner.

    Vois d'abord la vidéo : https://www.dropbox.com/s/2skjr4rjtg...siere.mp4?dl=0
    Tu verras le mauvais fonctionnement dû au 0A et ensuite le bon fonctionnement après nettoyage du fichier CSV.

    Les codes de nettoyage sont "derrière" le bouton "Enlève les caractères spéciaux". Tu pourras les récupérer aisément dans mon projet de tests que voici : CSV_0A.zip

    Bonne soirée ...

    ps; Si tu pouvais obtenir une feuille XLS plus proprement remplie, ce serait plus simple.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Merci Phil
    Ca marche et en plus avec une vidéo.
    Bravo et encore merci pour le temps passé.
    Je n'ai pas pris le temps de réfléchir, et je pense que je vais pouvoir remplacer la partie du programme que j’utilisais par le tien car en fin de compte, mon but était d'obtenir un fichier csv nettoyé du caractère "0A".
    Je vais pouvoir faire la suite : traiter les données et les mettre en forme pour mon fichier Gedcom.
    Dans la vidéo tu crée le fichier csv dos, mais moi j'ai fait l'essai avec mon fichier csv avec séparateur ; et ça a marché. La différence c'est les champs entre "".

  14. #14
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Merci pour le retour.

    Attention, je choisis le CSV DOS parce que l'autre (le CSV MAC) ne place pas les retours-chariots de fin de ligne.
    Cela peut poser problème lors des lectures du CSV avec ReadLine().
    Pour ce qui est du séparateur, c'est le ; pour l'un comme pour l'autre.

    Bonne nuit ...

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut Caractere vbLf
    Bonjour,
    Après avoir réglé le problème grâce à Phil, et avoir avancé dans mon développement, je me trouve confronté à une anomalie toujours avec les retour à la ligne pour laquelle je n'ai pas de réponse aussi je la pose sur le forum pour voir si quelqu'un à une réponse.
    Je dois insérer dans un fichier texte un string comportant des caractères slash (/) au milieu et au bout et ce slash me provoque un retour à la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public vbCrLf As String = Environment.NewLine
    strTemp = "0 @I" & cptIndividu & "@ INDI" & vbCrLf & "1 NAME " & Prenom & "/" & Nom & "/" & vbCrLf & "2 GIVN " & Prenom & "2 SURN " & Nom
    sw = File.AppendText(FichierPath)
    sw.WriteLine(strTemp)
    sw.Flush()
    sw.Close()
    et voici ce que j'ai en résultat dans mon fichier texte :
    0 @I1@ INDI
    1 NAME Barthélémy
    /RICHIOUD/
    2 GIVN Barthélémy
    2 SURN RICHIOUD
    au lieu de :
    0 @I1@ INDI
    1 NAME Barthélémy/RICHIOUD/
    2 GIVN Barthélémy
    2 SURN RICHIOUD
    Merci par avance.

  16. #16
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Je viens de faire le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim vbCrLf As String = Environment.NewLine   ' A noter par rapport au code que tu as envoyé : vbCrLf  ne peut être déclaré Public à l'intérieur d'un Sub
            Dim cptIndividu As String = "Blabla"
            Dim Prenom As String = "Phil"
            Dim Nom As String = "Rob"
            Dim strTemp As String = "0 @I" & cptIndividu & "@ INDI" & vbCrLf & "1 NAME " & Prenom & "/" & Nom & "/" & vbCrLf & "2 GIVN " & Prenom & "2 SURN " & Nom
            Dim sw As StreamWriter = File.AppendText(NomFichier)
            sw.WriteLine(strTemp)
            '      sw.Flush()  ' Pas besoin d'un Flush si on ferme le fichier aussitôt
            sw.Close()
        End Sub
    Et en ouvrant le fichier avec NotePad pour ne vérifier le contenu, j'ai ceci :
    0 @IBlabla@ INDI
    1 NAME Phil/Rob/
    2 GIVN Phil2 SURN Rob


    Je ne vois là, que l'effet des vbCRLF que tu as placés dans ta ligne de code Dim strTemp As String = "0 @I" & cptIndividu & ... ... ....

    Si ces informations doivent être enregistrée sur une seule ligne, il convient de retirer tous les vbCrLf de ce code.

    Mais peut-être que c'est à la lecture du fichier qu'il y a un bug ....
    Je te suggère de vérifier le fichier produit avec NotePad pour t'assurer du résultat de l'écriture dans ce fichier.

    J’espère que ceci t'aidera ...

  17. #17
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Désolé Phil, à force de modification, je ne me suis pas aperçu que la fonction qui traitait le caractère LF du début de la discussion avait subit une modification et que je retrouvais ce fameux caractère LF.
    vbCrLf a été déclaré Public dans un entête de module.
    Encore une fois un grand merci avec mes excuses pour cette étourderie.

  18. #18
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Pas de problème
    Bon travail pour la suite.

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/05/2017, 18h41
  2. Obligatoire : lisez les règles du forum : MAJ 06/08/2010
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 0
    Dernier message: 03/07/2008, 13h46
  3. Réponses: 3
    Dernier message: 12/06/2002, 21h15
  4. Réponses: 2
    Dernier message: 29/05/2002, 20h43
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo