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

Langage Delphi Discussion :

Comment reconnaitre une date dans une chaine ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut Comment reconnaitre une date dans une chaine ?
    salut
    j'ai du texte dans un mémo que je parcours en vue d'écrire dans un fichier.
    je souhaiterais pouvoir détecter toutes les dates en vue de les récrire au meme endroit sous un autre format.
    exemple
    contenu du fichier en entré
    9540553,9540553,0,0,,1,1,18,18,,366.666667,1,2008-08-22,2007-11-26,9503562,9503562,0


    contenu du fichier en sortie
    je veux avoir
    9540553,9540553,0,0,,1,1,18,18,,366.666667,1,22/08/2007,26/11/2007,9503562,9503562,0


    merci de me dépanner
    La patience est un Chemin d'or

  2. #2
    Membre confirmé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 537
    Points : 460
    Points
    460
    Par défaut
    Bonjour,
    tu trouveras la réponse dans la faq ici: http://delphi.developpez.com/faq/?page=typechaine

    Il y a une fonction pour remplacer une chaine dans une chaine.

    André
    Ils ne savaient pas que c'était impossible, alors ils l'ont fait !

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Dans ce cas tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maChaine:=StringReplace(maChaine, '-', '/', [rfReplaceAll]);
    pour reformatter directement ta chaine.
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut
    salut,
    merci pour la fonction ,peut -elle permuter l'année et le mois

    2008
    -09-06 avoir 06/09/2008


    merci
    a+
    La patience est un Chemin d'or

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    la fonction ,peut -elle permuter l'année et le mois
    ... non : SringReplace ne fait que remplacer les '-' par des '/'.
    ... excuses, je n'avais pas fait gaffe au fait que tu voulais formatter les dates en inversant l'ordre.
    ... du coup cela va être un peu plus compliqué.
    ... mais avant de passer à une solution je voudrais attirer ton attention sur les avantages du format des dates du fichier en entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          9540553,9540553,0,0,,1,1,18,18,,366.666667,1,2008-08-22,2007-11-26,9503562,9503562,0
          8157896,4822387,0,0,,1,1,16,15,,457.112358,1,2007-04-15,2004-10-22,9503562,9503562,0
    ... avec ce format où l'année précède le mois qui précède le jour tu te réserves la passibilité de pouvoir trier ton fichier dans l'ordre des dates avec routine de tri qui effectue les comparaisons entre les positions iChar1 et iChar2 correspondant au début et à la fin du champ des dates ... alors qu'avec ton format jj/mm/aaaa ce sera impossible ... donc t'es prévenu.

    Maintenant, pour permuter l'année et le mois afin de passer de 2008-09-06 à 06/09/2008 : si tous tes champs correspondant à la première date démarrent à la position iChar1:=46, la fin de la date correspond alors à iChar2:=55 donc tu peux faire comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        // Extraction des éléments de la première date :
        DateIn1:=copy(maChaine, 46, 55-46+1);
        AnIn1:=copy  (DateIn1, 1, 4);
        MoisIn1:=copy(DateIn1, 6, 2);
        JourIn1:=copy(DateIn1, 9, 2);
        // Reconstitution de la date avec reformattage :
        DateOut1:=JourIn1 + '/'+MoisIn1 + '/'+ AnIn1;
        // Supression de l'ancienne date dans la chaine :
        Delete(maChaine, 46, 55-46+1);
        // Insertion au même emplacement da la date reformattée :
        Insert(DateOut1, maChaine, 46);
     
        // Et idem pour la deuxième date présente dans tes chaînes
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut les positions des dates ne sont pas figées ...
    salut

    merci pour ton code.
    pour la position des dates ,j'ai juste mis un bout du contenu du fichier,
    en plus il ya des valeurs nulles.ce qui fait que je ne peux pas à priori de façon prédefinie situer l'emplacement de début et de fin des dates.

    Je pensais à une option qui consisterait à détecter la position exacte d'une date(exemple:dès qu'on detecte le caractère '-', on a une date ) et à partir de cette position faire la permutation.ainsi une autre date pourra etre recherché et ainsi de suite.

    merci de m'y mettre sur la voie
    La patience est un Chemin d'or

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Si la position des dates dans les chaines est variable tu peux effectivement repérer la position de son 1er Char avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        posDebCharDate1:= pos('-',maChaine) -5;
    ... et ensuite tu modifies le code d'hier en remplaçant la valeur de 46 par posDebCharDate1 et en modifiant les autres valeurs numériques en conséquence ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       DateIn1:=copy(maChaine, posDebCharDate1, 10);
       ...
       Delete(maChaine, posDebCharDate1, 10);
       Insert(DateOut1, maChaine, posDebCharDate1);
    ... le reste étant inchangé.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Cette fonction peut aussi convenir (je l'ai écrit sans tester mais le principe est là)

    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
     
    function TransformFormat(pDate : String) : String;
    var
      lFormatSettings : TFormatSettings;
      lDate : TDate;
    begin
      lFormatSettings.DateSeparator    := '-';
      lFormatSettings.ShortDateFormat  := 'yyyy-MM-dd';
     
      lDate := StrToDate(pDate, lFormatSettings);
     
      lFormatSettings.DateSeparator    := '/';
      lFormatSettings.ShortDateFormat  := 'dd/MM/yyyy';
     
      Result := DateToStr( lDate, lFormatSettings);
    end;
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    La position sur la ligne de tes 2 dates peuvent changer (certaines valeurs nulles ou non), mais est-ce qu'elles seront toujours les 13° et 14° données sur cette même ligne ?

    @+ Claudius

  10. #10
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut dates se trouvent au positions suivantes...
    salut

    en fait voila une des lignes du fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    9540553|9540553|0|0||1|1|1|1|0|0|0|0|0|0|1|1|18|18||366.666667|1|2008-08-22|2007-11-26||2008-09-06|0|0|2007-11-26|0|0||0|0|0|0|1|0
    disons que les dates se trouvent au positions suivantes(positions par rapport aux séparateurs)
    5
    20
    23 à 26
    29
    32
    La patience est un Chemin d'or

  11. #11
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut
    salut Linkin

    merci pour ta fonction,
    mais j'ai essayé de l'intégrer à mon code mais il ne marche pas trop bien.
    dit^peux-tu me guider et donner des précisions sur la façon de l'intégrer pour qu'elle marche....

    merci de répondre
    La patience est un Chemin d'or

  12. #12
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Tu peux te servir de la fonction ExplodeLazy de ShaiLeTroll. Cette fonction stocke les valeurs dans une tableau dynamique de chaine (array of string).

    Tu précise avec DateFieldIndex les positions de tes données Date, et tu utilises la fonction proposée par Linkin pour tranformer tes dates.

    Dans l'exemple suivant les dates passent du format YYYY-MM-DD à DD/MM/YYYY et le séparateur | est remplacé par une virgule.

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    const
      L = '9540553|9540553|0|0||1|1|1|1|0|0|0|0|0|0|1|1|18|18||366.666667|1|2008-08-22|2007-11-26||2008-09-06|0|0|2007-11-26|0|0||0|0|0|0|1|0';
     
    implementation
     
    {$R *.dfm}
     
    uses
      Types;
     
    function ExplodeLazy(const S: string; out A: Types.TStringDynArray; Separator: Char): Integer;
    var
      I, J, K: integer;
      iLenS: integer;
    begin
      iLenS := Length(S);
     
      if iLenS = 0 then
      begin
        SetLength(A, 1);
        Result := 0;
        A[Result] := '';
        Exit;
      end;
     
      Result := 0;
      for I := 1 to iLenS do
        if S[i] = Separator then
          Inc(Result);
     
      if S[iLenS] = Separator then
        SetLength(A, Result)
      else
        SetLength(A, Result + 1);
     
      K := 1;
      J := 0;
      for I := 1 to iLenS do
        if S[i] = Separator then
        begin
          if K <> I then
            A[J] := Copy(S, K, I - K);
     
          Inc(J);
          K := I + 1;
        end;
      if K <= iLenS then
        A[J] := Copy(S, K, MaxInt);
    end;
     
    function PerformLine(const L: string): string;
    var
      A: TStringDynArray;
      I: Integer;
    const
      // Emplacement des données date (0 based)
      DateFieldIndex: array[0..7] of Integer = (4, 19, 22, 23, 24, 25, 28, 31);
     
      function TransformFormat(pDate : String) : String;
      var
        lFormatSettings : TFormatSettings;
        lDate : TDate;
      begin
        if pDate = '' then
          result := ''
        else
        begin
          lFormatSettings.DateSeparator    := '-';
          lFormatSettings.ShortDateFormat  := 'yyyy-MM-dd';
     
          lDate := StrToDate(pDate, lFormatSettings);
     
          lFormatSettings.DateSeparator    := '/';
          lFormatSettings.ShortDateFormat  := 'dd/MM/yyyy';
     
          Result := DateToStr( lDate, lFormatSettings);
        end;
      end;
     
    begin
      // Stocker les données de la ligne L dans le tableau A
      ExplodeLazy(L, A, '|');
     
      // Changer les dates
      for I := Low(DateFieldIndex) to High(DateFieldIndex) do
        A[DateFieldIndex[I]] := TransformFormat(A[DateFieldIndex[I]]);
     
      // Construction de la ligne résultat
      result := A[0];
      for I := Low(A) + 1 to High(A) do
        result := result + ',' + A[I];
     
      // Libération de l'array of string
      SetLength(A, 0);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(L + #13#10 + PerformLine(L));
    end;
     
    end.
    @+ Claudius

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Vraiment sympa ce code, je ne le connaissais pas.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  14. #14
    Membre du Club Avatar de bigey3
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 124
    Points : 50
    Points
    50
    Par défaut salut
    merci pour le code,
    vraiment cool.

    merci
    La patience est un Chemin d'or

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/06/2015, 17h52
  2. [MySQL] insérer une date dans une table dans un format compréhensible
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 16/08/2014, 11h10
  3. insérer une date dans une table dans un format compréhensible
    Par laurentSc dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/08/2014, 16h31
  4. Réponses: 1
    Dernier message: 04/04/2008, 12h14
  5. Inserer une date d'une table dans une autre table
    Par petitetre dans le forum Langage SQL
    Réponses: 8
    Dernier message: 18/04/2007, 20h16

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