Extraire et additionner les chiffres d'un Memo [Résolu]

Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Dernière intervention
11 mars 2014
- - Dernière réponse : nabil351974
Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Dernière intervention
11 mars 2014
- 22 févr. 2013 à 09:20
bonsoir,

voilà, j'ai un Memo1 qui contient des chaînes comme :

6010-6012 [3]
2702-2703 [2]
2051-2070 [20], 2091-2180 [90], 2188-2600 [413]
2654 [1]
2-9 [8], 11-20 [10]
2604 [1]



Je veux extraire et additionner seulement les chiffres de chaque ligne qui sont entre crochets [] et mettre le résultat dans un autre Memo(Memo2):

exemple:
3
2
523 (résultat de : 20 + 90 + 413 )
1
18 (résultat de : 8 + 10 )
1


Donc Memo2 recevra:

3
2
523
1
18
1



Merci de votre aide

NABIL1974
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
102
Date d'inscription
mardi 13 novembre 2007
Dernière intervention
19 août 2018
3
Merci
Bonjour,
Voici une solution simple qui peut être optimisée au niveau des variables dans les fonctions. J'ai mis ces variables pour que ce soit plus lisible.

Function RtnData(cLigne: string): Integer;
Var nDebutData, nFinData, nNbCarData: Integer;
Begin
  nDebutData := Pos('[', cLigne);
  nFinData   := Pos(']', cLigne);
  nNbCarData := nFinData - (nDebutData +1);
  Result := StrToInt(Copy(cLigne, (nDebutData +1), nNbCarData));
end;

Function SommeLigne(cLigne: string): Integer;
Var nTotal, nLen: Integer;
Begin
  nTotal := 0;
  Repeat
    nLen := Length(cLigne);
    nTotal := nTotal + RtnData(cLigne);
    cLigne := Copy(cLigne, Pos(']', cLigne) +1, nLen);
  until Length(cLigne) = 0;
  Result := nTotal;
end;

// ********************************************************************

procedure TForm1.BtnVideMemo2Click(Sender: TObject);   // Vidage du memo2
begin
  Memo2.Clear;
end;

procedure TForm1.BtnFillMemo2Click(Sender: TObject);  // Remplissage du Memo2
Var i: Integer;
begin
   For i := 0 to Memo1.lines.Count -1 do
      Memo2.Lines.Add(IntToStr(SommeLigne(Memo1.Lines[i])));
end;

end.  




pierrot

Merci pierrotk10d 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de pierrotk10d
Messages postés
423
Date d'inscription
samedi 17 mai 2003
Dernière intervention
4 août 2018
0
Merci
Salut,

Tu veux une réponse standard et rigoureuse, ou une méthode imbuvable ?

Moi je fais plutôt dans l'imbuvable...
Commenter la réponse de korgis
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
Salut,
Pourquoi ne pas penser le problème autrement et remplir ton memo2 en même temps que le 1 ? Ça me semble plus facile à faire non ? Vu que tu affiche les chiffres dans memo1, tu peux les mettre en mémoire, les additionner et les afficher dans memo2 dès que tu as un changement de ligne dans memo1

Simon
Commenter la réponse de sp40
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
0
Merci
Salut,

utilise la fonction pos() pour trouver '[' sur chaque ligne et ainsi extraire la valeur!

Tu peux aussi utiliser la fonction String_copy(taligne, '[', true, ']', true) de l' unité cyStrUtils.pas des compos Cindy!

a+


Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
@Mauricio : ou StrBeetwen de la jcl...
J'ai vu que tu avais un compteur d'occurence de substring dans cyStrUtils... Il manque plus qu'un paramètre à String_copy pour atteindre une occurence particulière de la substring !

Simon
Commenter la réponse de sp40
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
StrBetween, pardon.


Simon
Commenter la réponse de sp40
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
0
Merci
@Simonpelloquin:
"J'ai vu que tu avais un compteur d'occurence de substring dans cyStrUtils"
- Oui, c' est SubString_Count()

"Il manque plus qu'un paramètre à String_copy"
- Tu as SubString_Get()!

a+


Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
Super ! Je ne l'avais pas vu... Désolé

Simon
Commenter la réponse de sp40
Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Dernière intervention
11 mars 2014
0
Merci
Merci les gars,

j'ai utilisé la fonction pos() que m'a conseillé MAURICIO, ça marche bien sauf quant il s'agit de plusieurs occurrences dans la même ligne, elle capture seulement la 1ère occurrence et loupe les autre.
ex:

2051-2070 [20], 2091-2180 [90], 2188-2600 [413]

ceux qui sont rouges sont loupé.


voici mon code:

function ExtractDelimitedString(const s: string): string;
var
p1, p2: Integer;
begin
p1 := Pos('[', s);
p2 := Pos(']', s);
if (p1<>0) and (p2<>0) and (p2>p1) then begin
Result := Copy(s, p1+1, p2-p1-1);
end else begin
Result := '';
end;
end;

l'appel de la fonction:

procedure TForm1.LMDButton2Click(Sender: TObject);
var i:integer;
begin

for i:= 0 to Memo1.Lines.Count do
begin
Memo2.Lines.Add(ExtractDelimitedString(Memo1.Lines[i]) );
end;

comment faire pour extraire toutes les occurrences de la même ligne et de compter les valeurs de cette ligne?

Merci




NABIL1974
Commenter la réponse de nabil351974
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
Nabil, je me permets d'insister, mais pourquoi ne remplis tu pas le memo2 en même temps que le 1 ?
Au moment où tu mets tes nombres entre crochet, tu les as sous la main pour les aditionner...
Ça te simplifierait la vie (et ton code) !

Simon
Commenter la réponse de sp40
Messages postés
76
Date d'inscription
mardi 18 décembre 2007
Dernière intervention
11 mars 2014
0
Merci
Bonjour à tous,

[i]"Nabil, je me permets d'insister, mais pourquoi ne remplis tu pas le memo2 en même temps que le 1 ?
Au moment où tu mets tes nombres entre crochet, tu les as sous la main pour les aditionner...
Ça te simplifierait la vie (et ton code) ! "/i

Oui Simon tu as entièrement raison, mais comme j'ai de très longues boucles avec des Query de selection et d'insertion, je me suis perdu dans tout ça!

Merci à tous pour votre aide.

NABIL1974
Commenter la réponse de nabil351974

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.