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 :

mettre à jour un csv depuis DGV


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Par défaut mettre à jour un csv depuis DGV
    Bonjour,

    je progresse doucement mais sûrement...

    Depuis mon précédent post, je parviens à charger le contenu d'un fichier csv qui me sert de base de données simple dans un DGV (csv -> datatable -> DGV)
    Je voudrais que les modifications faites dans les cellules du DGV par l'utilisateur soient répercutées dans le CSV, sans supprimer puis recréer le csv.

    Sachant que le csv n'est pas relié à la datatable, faut-il que je revois ma méthode de chargement des données (avec des dataset, dataAdapter dont je n'ai pas encore saisi les subtilités), ou me faut-il repérer les lignes qui ont été modifiées pour ensuite mettre à jour le csv source ?
    Qu'est-ce qui est le plus propre en terme de programmation ?

    Merci, Jérémy

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    727
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 727
    Par défaut
    Bonjour,

    Par définition, le CSV est un format de fichier texte, brut, sans clés.
    Il te sera donc difficile de mettre à jour le fichier sans l'écraser complètement.
    Si tu as une clé quelconque (un n° d'identification de l'enregistrement idéalement), tu peux passer tout le fichier en revue séquentiellement et ne modifier que l'enregistrement concerné, mais à moins d'une bonne surprise je pense que tu devras tout effacer et réécrire.

    Oublie les outils d'accès aux données (DataSet et autres). Le CSV n'est pas un format de base de données. Même si beaucoup l'utilise pour échanger des données, quand leurs BD ne sont pas compatibles, avec les risques de pertes et d'erreurs que çà comporte.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Par défaut
    bonjour,

    merci de m'avoir éclairé, je sais maintenant ce que je dois faire :
    numéroter les lignes du fichier csv.
    charger ces numéros de ligne dans le DGV.
    puis lors d'une modif du DGV, récupérer le numéro de ligne concerné pour aller modifier dans le csv.

    Si je ne m'abuse, au lieu d'un csv, si j'avais une base de données à une seule table, ce serait plus simple et rapide de modifier le contenu de la table ? La clé primaire permet un accès direct à l'enreg à modifier n'est-ce pas et ça évite de parcourir toutes les lignes ?

  4. #4
    Membre Expert 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
    Par défaut
    Bonsoir,

    Il s'agit d'un fichier de format "TXT", comme l'a indiqué m4k-Hurrican. Cela veut dire un fichier de lignes de textes et il n'est pas possible de modifier une donnée parmi d'autres. Pour faire cela, il faut utiliser des fichiers à accès relatif (on parle aussi de fichiers à accès direct). Ces fichiers ont des enregistrements de longueur identique, ce n'est pas le cas des TXT ni des CSV.

    Pour modifier un TXT ou un CSV, il faut "l'écraser" comme te l'indiquait encore m4k-Hurrican. Bien entendu, personne ne souhaite écraser un fichier au risque de perdre toutes les données.

    Voici une manière de faire.
    1. Créer un nouveau fichier avec un nom temporaire
    2. Y recopier le CSV ligne par ligne jusqu'avant la ligne à modifier
    3. Lire la ligne à modifier du CSV
    4. Enregistrer la ligne modifiée dans le fichier temporaire
    5. Continuer la copie des lignes du CSV, jusqu'à la fin du CSV
    6. Fermer le fichier temporaire (Close indispensable)
    7. Supprimer le fichier CSV
    8. Renommer le fichier temporaire avec le nom qu'avait le CSV.


    Cette manière de faire donne l'impression d'avoir modifié le CSV, ou bien de l'avoir "écrasé" avec les données modifiées : ce n'est ni l'un ni l'autre, mais c'est comme si ...

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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Par défaut
    Bonjour Phil,

    oui, cela m'aide beaucoup à comprendre le fonctionnement général, merci beaucoup.
    je vais le mettre en oeuvre pour apprendre à traiter ce type de fichier.

    Je déduis de tes explications que, dans le cas où plusieurs utilisateurs feraient des modifications simultanées, il vaut mieux un fichier à accès direct pour éviter de perdre les modifications faites par un autre user.


    Dans l'appli que j'imagine, je charge une liste d'informations que chaque utilisateur doit traiter (commenter/modifier) si nécessaire via le DGV.
    La liste provient dufichier csv, créé automatiquement et dont le contenu change partiellement d'un jour sur l'autre ce qui amène l'utilisateur à traiter de nouvelles info.
    Puis-je créer ce fichier à accès direct depuis mon csv ou faudrait-il que je remplace le fichier csv par autre chose comme source de ma liste ?

  6. #6
    Membre Expert 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
    Par défaut
    Bonjour,

    Clair que l'algorihtme que j'ai décrit est valable pour une application mono-poste.

    ... dans le cas où plusieurs utilisateurs feraient des modifications simultanées, il vaut mieux un fichier à accès direct ...
    Le problème des accès simultanés sera le même avec les fichiers à accès direct : si tu modifies la ligne 27 et que, pendant le même temps, je modifie aussi la ligne 27, le 2ème de nous eux à provoquer l'enregistrement effectif de la ligne modifiée écrasera la modif faite par l'autre. Bref, cela ne se peut.

    Une première opération à faire dans l'environnement multi-poste consiste à bloquer (et débloquer) l'accès au fichier concerné (ou à l'enregistrement à modifier). Cela peut être fait par usage d'instructions systèmes de modification des attributs des fichiers (un fichier ReadOnly ne peut être modifié). Mais ce n'est pas tout ...

    Je dois bien avoir le principe algorithmique nécessaire dans mes "cartons", je le chercherai si tu veux. Mais je ne crois pas avoir sus la main le nécessaire pour mettre cela en oeuvre.

    ...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Par défaut
    Bonjour Phil et bonne année à toi et tes proches.

    Oui, le principe algorithmique m'intéresse, mais n'y passe pas des heures à le chercher !
    Pour ce qui est des enreg simultanés, chaque utilisateur ayant ses info dédiées à traiter, donc ils ne modifieront pas simultanément le même enreg.
    Seul le fichier source risque d'être modifié en simultané dans ce cas.

    Donc je pense qu'au moment de l'enregistrement des modifications, il faut vérifier si le fichier csv est ouvert pour mise à jour et faire patienter le cas échéant.

    PS : la marche est un peu haute entre mes connaissances vba excel et l'intention de créer des petites appli Windows Form !

  8. #8
    Membre Expert 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
    Par défaut
    Bonne année chez aussi Jeremy

    Pour l'ago, je le chercherai demain matin et je t'informerai ...

  9. #9
    Membre Expert 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
    Par défaut
    Bonjour Jeremy,

    Voici un document qui traite du problème qui nous occupe : FileAndRecordLocking.pdf.
    L'algorihtme est décrit en VB 6.0 et concerne le Record Locking qui ne s'applique bien évidemment qu'au fichier à accès relatif (ou direct) puisqu'il faut désigner le(s) enregistrement(s) à contrôler.
    Heureusement, VB.Net possède encore les méthodes Lock et Unlock nécessaires. Tu trouveras leur emploi dans cet exemple : http://www.java2s.com/Code/VB/File-D...nlockafile.htm.

    Tu pourrais donc utiliser le Record Locking si le fichier était à accès direct. La conversion d'un fichier de textes (CSV) en fichier à accès direct présente (à mon avis) la principale difficulté suivante : tous les enregistrements doivent être de même longueur.
    L'accès direct au fichier ne se fait pas sur base d'une clé mais sur base de la position du premier octet à lire. L'accès direct au fichier est en réalité, réalisé par la lecture (ou écriture) d'un lot d'octets prédéfinis. Si un enregistrement contient 100 octets, le premier enregistrement commence à 0 et occupe 100 octets, le 2ème commence à 100 et occupe 100 octets, le 3ème commence à 200 ...
    Il est ainsi possible d'accèder directement à 30ème enregistrement puisqu'on sait qu'il commence à la position 2900 du fichier et qu'il contient 100 octet.
    Voici un document qui traite des fichiers à accès aléatoire (accès relatif, accès direct, accès aléatoire, ... : on parle toujours de la même chose) : AccesDirect.pdf

    Peut-être peux-tu allonger chaque ligne du CVS avec des caractères "improbables" (des tiltes ~, par exemple) qui seraient systématiquement ôtés des lignes lues (TrimEnd ("~")) pour te restituer la ligne CSV d'origine ...

    C'est du chipo ...

    Bonne journée

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 130
    Par défaut
    Salut jerem7w et Phil Rob, bonne année à vous deux

    Voici un code illustrant exactement les propos de Phil Rob, il est écrit en VBScript mais devrait être très facilement addaptable en vb.net.
    Code VBScript : 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
    Option Explicit
    Dim TblLgns, Tbl2d(), RetourStatut
     
    Sub ConstruitTableau2D(ChemNomFichier,SepLgn,SepCol,Statut)
    	Dim fso, fichier, T, U, D2max
    	Dim ContenuFichier, TblCol
     
    	Set fso = CreateObject("Scripting.FileSystemObject")
    	Statut = fso.FileExists(ChemNomFichier)
    	If Statut = False Then Set fso = Nothing: Exit Sub
     
    	Set fichier = fso.opentextfile(ChemNomFichier, 1)
    	ContenuFichier = fichier.ReadAll
    	fichier.Close
    	Set fichier = Nothing
    	Set fso = Nothing
     
    	D2max = 1 'pour trouver la ligne d'enregistrement qui a le plus de mots (colonnes)
    	TblLgns = Split(ContenuFichier,SepLgn) 'on récupère le tableau de lignes
    	For T = 0 To UBound(TblLgns)
    		TblCol = Split(TblLgns(T), SepCol, -1, 1)
    		If D2max < UBound(TblCol) Then D2max = UBound(TblCol)
    	Next
    	'maintenant que l'on a les 2 dimensions du tableau ... 
    	Redim Tbl2d(UBound(TblLgns), D2max)' on le dimensionne
     
    	For T = 0 To UBound(TblLgns)
    		TblCol = Split(TblLgns(T), SepCol, -1, vbTextCompare)' on optient chaque mots de la ligne
    		For U = 0 To UBound(TblCol)' on boucle pour ....
    			Tbl2d(T,U)= TblCol(U) 'remplissage du tableau 2D
    		Next
    	Next
     
    End Sub
     '-------------------------------------------
    	ConstruitTableau2D "C:\MesProgs\En VBScript et HTA\Lire fichier sortie Tableau2D\FichierDemo.txt",vbNewline, " ", RetourStatut
     If RetourStatut Then
        Msgbox "1er ligne:" & vbNewline & TblLgns(0) & vbNewline & vbNewline & "dernière ligne:" & vbNewline & TblLgns(UBound(TblLgns))
     
        Msgbox "Affichage du quatrième mot de la troisième ligne: " & vbNewline &  Tbl2d(2,3)
        Else
        Msgbox "Fichier non trouvé"   
    End If
    	ConstruitTableau2D "C:\MesProgs\En VBScript et HTA\Lire fichier sortie Tableau2D\FichierDemo2.txt","|", "~", RetourStatut
     If RetourStatut Then
        Msgbox "Affichage du cinquième paramètre du deuxième champ d'enregistrement: " & vbNewline &  Tbl2d(1,4),,"Fichier Demo2.txt"
        Else
        Msgbox "Fichier non trouvé"   
    End If
    Le fichier FichierDemo.txt
    FichierDemo exemple
    quelques lignes pour la démonstration
    du programme de construction d'un tableau 2D
    à partir d'un
    fichier texte.
    Le fichier Fichier Demo2.txt
    FichierDemo~exemple|quelques~lignes~pour~la~démonstration|du~programme~de~construction~d'un~tableau~2D|à~partir~d'un~|fichier~texte.
    A la limite, la variable D2max n'est pas nécessaire si le nombre de colonnes est connue et fixe, les lignes 18 à 23 peuvent être éliminées.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  11. #11
    Membre Expert 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
    Par défaut
    Bonne année à toi ProgElect.
    Et aussi bon week-end pour bien commencer ...

Discussions similaires

  1. Mettre à jour un composant depuis le bean
    Par troubleshooting dans le forum JSF
    Réponses: 21
    Dernier message: 23/04/2009, 14h25
  2. Mettre à jour un enregistrement depuis FCKeditor
    Par amamildor dans le forum ASP.NET
    Réponses: 10
    Dernier message: 29/02/2008, 16h09
  3. Réponses: 5
    Dernier message: 10/07/2007, 21h43
  4. Mettre à jour un JPanel depuis la classe main
    Par Zorgloub dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 03/04/2006, 11h14
  5. Mettre à jour une table depuis une autre
    Par rsc dans le forum SQL
    Réponses: 4
    Dernier message: 09/07/2004, 10h08

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