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

Composants VCL Delphi Discussion :

Utilisation de FDBatchMove


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    senior scientist
    Inscrit en
    Mai 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : senior scientist

    Informations forums :
    Inscription : Mai 2003
    Messages : 82
    Billets dans le blog
    1
    Par défaut Utilisation de FDBatchMove
    Je développe actuellement un logiciel (Delphi Alexandria) qui doit remplir une table Firebird à partir de fichiers CSV lus depuis un serveur REST.
    J'ai pensé à utiliser un composant FDBatchMove pour effectuer facilement la conversion avec les "reader" et "writer" qui vont bien.
    Comme le résultat n'était pas satisfaisant (seule la première colonne de données était transférée), j'ai simplifié le problème en écrivant le petit test suivant qui lit un CSV et en fabrique un autre, juste en changeant les séparateurs :

    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
    procedure TForm16.FormCreate(Sender: TObject);
    var fTest: TFileStream; fCopy: TMemoryStream;
    begin
      fTest := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'test.txt', fmOpenRead);
      Original.Lines.LoadFromStream(fTest);
      fCopy := TMemoryStream.Create;
      try
        FDBatchMove.Mode := dmAlwaysInsert;
        with TFDBatchMoveTextReader.Create(FDBatchMove) do begin
         Stream := fTest;
          DataDef.Separator := ',';
          DataDef.Delimiter := ',';
          DataDef.WithFieldNames := true;
        end;
        with TFDBatchMoveTextWriter.Create(FDBatchMove) do begin
          Stream := fCopy;
          DataDef.Separator := ';';
          DataDef.Delimiter := '/';
          DataDef.WithFieldNames := false;
        end;
        FDBatchMove.GuessFormat();
        FDBatchMove.Execute;
        fCopy.Position := 0;
        Copy.Lines.LoadFromStream(fCopy);
      finally
        fTest.Free;
        fCopy.Free;
      end;
      with FDBatchMove do StatusBar.SimpleText := 'Read: ' + IntToStr(ReadCount)
        + '   Inserted: ' + IntToStr(InsertCount) + '   Written: ' + IntToStr(WriteCount);
    end;
    Pour le fichier initial suivant (stream fTest):

    nom,date,ville
    Dupont,2000-01-01,Fouilly-les-Oies
    Durand,2000-02-02,Lons-le-Saunier
    Martin,2000-03-03,Paris

    J'obtiens (stream fCopy):
    /nom/;//;//
    /Dupont/;//;//
    /Durand/;//;//
    /Martin/;//;//

    Le format a bien été changé, mais seule la première colonne est renseignée et l'intitulé des champs semble ne pas avoir été compris.
    Merci d'avance si vous pouvez m'aider à trouver mon erreur !

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Le 1er séparateur semble OK puisqu'il reconnaît 3 champs.
    Mais avoir fixé le délimiteur à la même valeur ( ',' ) alors qu'il n'y en a pas semble le perturber !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre confirmé

    Profil pro
    senior scientist
    Inscrit en
    Mai 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : senior scientist

    Informations forums :
    Inscription : Mai 2003
    Messages : 82
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Le 1er séparateur semble OK puisqu'il reconnaît 3 champs.
    Mais avoir fixé le délimiteur à la même valeur ( ',' ) alors qu'il n'y en a pas semble le perturber !
    Merci, mais malheureusement ce n'est pas cela, car l'erreur (de frappe) avait déjà été corrigée et ne change pas le résultat.
    Dans les données originales, il y a en effet un délimiteur ("), en principe à spécifier, mais il n'y en a pas dans les données du test.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    le delimiter du TFDBatchMoveTextReader me parait étrange.

    Je me suis amusé à le faire au runtime en posant les composants et j'obtiens
    "Dupont";01/01/2000;"Fouilly-les-Oies"
    "Durand";02/02/2000;"Lons-le-Saunier"
    "Martin";03/03/2000;"Paris"
    à remarquer que guessformat change de format des dates

  5. #5
    Membre confirmé

    Profil pro
    senior scientist
    Inscrit en
    Mai 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : senior scientist

    Informations forums :
    Inscription : Mai 2003
    Messages : 82
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    le delimiter du TFDBatchMoveTextReader me parait étrange.

    Je me suis amusé à le faire au runtime en posant les composants et j'obtiens
    "Dupont";01/01/2000;"Fouilly-les-Oies"
    "Durand";02/02/2000;"Lons-le-Saunier"
    "Martin";03/03/2000;"Paris"
    à remarquer que guessformat change de format des dates
    Bonsoir,
    Je suis étonné par votre résultat.
    D'une part, parce que je n'arrive pas à le retrouver !
    D'autrepart, parce que ça m'étonnerait que le GuessFormat cherche à reconnaître les types (en l'occurrence un TDate).
    C'est le BatchMove qui va s'en occuper si la sortie est un DataSet ou s'il y a un Mapping défini ? Ici la sortie est du texte.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par _alx_ Voir le message
    Je suis étonné par votre résultat.
    Et pourtant, je n'ai fait, comme d'habitude avec du Batchmove, une simple exécution au designtime
    J'ai posé sur une fiche un FDBatchmove, un FDBatchmoveTextReader pointant sur le petit fichier CSV , un FDBatchmoveTextReader pointant sur un fichier à créer, j'ai tout laissé par défaut et utilisé le menu contextuel du fdbatchmove : fait un guessformat puis un execute.

    Rien de plus

    à remarquer que guessformat change de format des dates
    je ne vois que cette instruction qui ait pu changer le format de la date de yyyy-mm-dd à dd/mm/yyyy

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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