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 :

Problème lecture fichier csv sous windows XP


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème lecture fichier csv sous windows XP
    Bonjour à tous,

    j'ai un problème sur lequel je me casse les dents depuis plusieurs jours. Je dois créer un programme qui lit un fichier csv et affiche les résultats dans un datagridview.
    Le problème est mes lignes de codes sont fonctionnelles lorsque je teste le programme sous windows 7 et 8 mais le programme doit fonctionner sur des PC sous XP......et ça pas moyen de changer.
    Sous windows 8, lorsque je lance mon programme, les données s'affichent bien dans le datagridview par colonne (77 au total) et avec le nombre de ligne correct, mais sous windows XP ça n'apparait que sur une seule colonne.

    Pouvez-vous m'aider svp ? Je programme en vb.net.

    Merci d'avance pour votre aide

    Voici les lignes de codes:

    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
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim dt As DataTable
            '*** Read CSV to DataTable ***'
            dt = CsvCreateDataTable("F:\", "ExportAnomalies2300.csv")
     
            ' verif(dt)
     
            DataGridView2.DataSource = dt
     
            '*** Insert to Database ***'
            '     InsertToDatabase(dt)
     
        End Sub
     
    '*** Convert CSV to DataTable ***'
        Function CsvCreateDataTable(ByVal strPath, ByVal strFilesName) As DataTable
            Dim objConn As New OleDbConnection
            Dim dtAdapter As OleDbDataAdapter
            Dim dt As New DataTable
     
            Dim strConnString As String
            strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\;Extended Properties='TEXT;HDR=Yes;FMT=Delimited;Format=Delimited(,)'"
            objConn = New OleDbConnection(strConnString)
            objConn.Open()
     
            Dim strSQL As String
            strSQL = "SELECT * FROM " & strFilesName
     
            dtAdapter = New OleDbDataAdapter(strSql, objConn)
            dtAdapter.Fill(dt)
     
            dtAdapter = Nothing
     
            objConn.Close()
            objConn = Nothing
     
            Return dt '*** Return DataTable ***'
     
        End Function
    Pour info, je charge le fichier dans un datagridview filtré car le traitement est beaucoup plus rapide que d'attendre le chargement dans une base access (le fichier csv comporte 80000 lignes environs ).

    J'ai sinon crée un prog pour lancer directement l'import du fichier csv dans access, ce qui est très rapide mais ça implique que chaque poste qui utilise le programme est access installé et ce n'est pas possible.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Points : 293
    Points
    293
    Par défaut
    Salut

    pour ma part j'utilise cette façon pour lire un fichier csv
    et c'est très rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Chemin As String = My.Settings.MonPath & "\" & M & "\" & symbtmp & "\Fichier\" & RapTyp & Prd & ".csv"
                                Dim StrRap() As String = File.ReadAllLines(Chemin)
    For y As Integer = 0 To StrRap.Count - 1
    Dim StrDat() As String = StrRap(y).Split(","c) 'pour séparer les colonnes de chaque ligne
    ....code pour ajouter au datatable ....
    Next

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour ton code, mais je n'arrive pas à mettre ces valeurs au datatable

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Points : 293
    Points
    293
    Par défaut
    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
     
    'Sous Public Class 
    Dim DtMoy As DataTable
    'Dans le FormLoad tu ajoute
    DtSetUp
     
     
    Sub DTSetUp()
            DtMoy = Nothing
            DtMoy = New DataTable
            DtMoy.Columns.Add("DateMoy", GetType(Date))
            DtMoy.Columns.Add("Moy50", GetType(Double))
            DtMoy.Columns.Add("Moy200", GetType(Double))
    End Sub
     
    'Dans ton Bouton_Click
    Dim Chemin As String = My.Settings.MonPath & "\" & M & "\" & symbtmp & "\Fichier\" & RapTyp & Prd & ".csv"
                                Dim StrRap() As String = File.ReadAllLines(Chemin)
    For y As Integer = 0 To StrRap.Count - 1
    Dim StrDat() As String = StrRap(y).Split(","c) 'pour séparer les colonnes de chaque ligne
    ....code pour ajouter au datatable ....
    DtMoy.rows.add(Cdate(strDat(0)),Cdbl(strDat(1)),Cdbl(strDat(2)))
    Next
    ça doit ressembler à ça

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Ce code permet de construire une DataTable en interprétant la première ligne (nom des colonnes) du csv:
    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
    using Microsoft.VisualBasic.FileIO; 
    string csv_file_path=@"C:\MyData\test.csv";
    DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);
             
            private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
            {
                DataTable csvData = new DataTable();
                using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
                {
                        csvReader.SetDelimiters(new string[] { "," });
                        csvReader.HasFieldsEnclosedInQuotes = true;
                        string[] colFields = csvReader.ReadFields();
                        foreach (string column in colFields)
                        {
                            DataColumn datecolumn = new DataColumn(column);
                            datecolumn.AllowDBNull = true;
                            csvData.Columns.Add(datecolumn);
                        }
                        while (!csvReader.EndOfData)
                        {
                            string[] fieldData = csvReader.ReadFields();
                            //Making empty value as null
                            for (int i = 0; i < fieldData.Length; i++) if(fieldData[i] == "") fieldData[i] = null;
                            csvData.Rows.Add(fieldData);
                        }
                }
                return csvData;
            }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Candidat au Club
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup à vous.
    j'ai réussi à obtenir des données de mon fichier csv dans mon datagrid.
    Toutefois, je n'obtiens pas le même résultat que sur mes lignes de codes fonctionnant sous 7 ou 8. (Précision que j'ai oublié de dire, le sépateur de mon csv est bien "," mais j'ai aussi des "" dans le fichiers)

    Sous mon code d'origine, le nombre de colonne est respecté, pour toute la lecture du fichier. Avec ces lignes de codes, comme la lecture se fait ligne par ligne, je me suis retrouvé avec des erreurs hors de plage d'index. (Les données de mon csv ne tiennent pas forcément sur une ligne)

    J'ai du retravailler le code en ne prenant en compte que certaines lignes

    Je ne sais pas si j'ai été très clair dans mon explication.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Points : 293
    Points
    293
    Par défaut
    salut

    ok j'ai eu ce problème la l'an dernier et avant de séparer ma ligne par le split(","), je passe ma ligne dans un regex qui retire les virgules dans un phrase. Car dans mon car le séparateur divisait des nombres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For y As Integer = 0 To StrRap.Count - 1
                                        Dim Rg As New Regex("[a-zA-Z]\,\s")
                                        Dim mac As MatchCollection = Rg.Matches(StrRap(y))
                                        For Each mch As Match In mac
                                            'Console.WriteLine(mch.Value & " en position " & mch.Index)
                                            'Console.WriteLine(StrTmp.Chars(mch.Index + 1))
                                            StrRap(y) = StrRap(y).Remove(mch.Index + 1, 1)
                                        Next
                                        Rg = Nothing
                                        mac = Nothing
                                    Next

  8. #8
    Candidat au Club
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour ces lignes.
    Le regex me crée une panne lors de la lecture du fichier.
    Du coup j'ai adapté mon code pour prendre en compte la structure de mon fichier source et l'adapter correctement à mon datagridview.
    Je vais mettre ce sujet en résolu même si je ne sais pas pourquoi j'ai cette différence entre windows 8 et windows XP.

    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème lecture fichier .csv
    Par sugarmountain dans le forum Scilab
    Réponses: 3
    Dernier message: 19/12/2013, 16h41
  2. Réponses: 3
    Dernier message: 22/04/2010, 17h12
  3. Réponses: 8
    Dernier message: 25/02/2009, 15h52
  4. Problème pour télécharger fichier .csv sous IE
    Par julie4207 dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 12/02/2009, 10h08
  5. Réponses: 2
    Dernier message: 06/08/2007, 13h54

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