Copier chaine d'un TMemo

Résolu
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014 - 9 févr. 2013 à 20:36
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014 - 20 févr. 2013 à 20:32
Bonsoir à tous,

j'ai un petit souci sur un traitement à partir d'un Tmemo.
Sur ma fiche un Memo1 dans lequel il y a des mots et des chiffres.

exemple:

Jojo, 5100
Robert, 2701
Foufou, 2651
Sara, 1, 21-29, 31-60, 990-1000

je veux copier les mots comme :Jojo,Robert,Foufou,Sara dans un Memo2

et seulement les chiffres dans un autre Memo3.
Memo2=
Jojo (1ère ligne)
Robert (2e ligne)
Foufou (3e ligne)
Sara (4e ligne)

et
Memo3=
5100
2701
2651
1, 21-29, 31-60, 990-1000

comment le faire svp?

Merci





NABIL1974

11 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
11 févr. 2013 à 18:47
Quand on traite ce genre de données, il faut être un minimum standard et rigoureux pour eviter à avoir à pondre des méthode imbuvables.

bon par contre oui, la première virgule semble être le déclencheur de coupure.

on peu considérer la donnée comme étant "clef", "valeur"

soit la fonction suivante :

procedure splitDatas(Lines, Keys, Values: TStrings);
var N, P1, P2, L: integer;
    S, K, V: string;
begin
  Keys.BeginUpdate;
  Values.BeginUpdate;
  try
    Keys.Clear;
    Values.Clear;

    for N := 0 to Lines.Count - 1 do
    begin
      S  := Lines[N];
      P1 := 1;
      P2 := pos(',', S);
      L  := Length(S);
      K  := '';
      V  := '';
      // no invalid row
      if P2 <> 0 then
      begin
        // copy Key
        K := copy(S, P1, P2-P1);

        P1 := P2+1;
        P2 := L;
        // trim left
        while (S[P1] in #9) and (P1 <= L) do
          inc(P1);
        // trim right
        while (S[P2] in #9, #10, #13) and (P2 > 1) do
          dec(P2);

        if (P1 <= P2) and (P2<>0) then
          // copy Value
          V := copy(S, P1, P2-P1+1);

        // no null key and value
        if (K <> '') and (V <> '') then
        begin
          Keys.Add(K);
          Values.Add(V);
        end;
      end;
    end;
  finally
    Values.EndUpdate;
    Keys.EndUpdate;
  end;
end;


utilisation :

splitDatas(MemoDatas.Lines, MemoKeys.Lines, MemoValues.Lines);


________________________________________________________
besoin de câbles audio, vidèo, informatique pas cher ?
3
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
10 févr. 2013 à 10:59
Salut
dans le cas particulier que tu donnes, tu peux essayer un truc comme cela :
procedure TForm1.Trucmuche;
var z:string;
begin
memo2.clear;
memo3.clear;
for i:=0 to memo1.Lines.Count-1 do
  begin
    z := memo1.lines[i];
    memo2.lines.add(copy(z,1,pos(',',z)-1);
    memo3.lines.add(trim(copy(z,pos(',',z)+1,length(z))));
  end;
end;


à vérifier car je n'ai pas testé !


Dubois77
site perso
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
10 févr. 2013 à 11:21
tu as du rectifier toi même : il fallait mettre :
var z:string; i:integer;


Dubois77
site perso
0
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014
11 févr. 2013 à 14:26
Bonjour,
Merci pour ta réponse, mais cette fonction copie toutes les lignes avec les caractères et les chiffres.

NABIL1974
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
11 févr. 2013 à 16:34
bonjour,

fait un peu à l'arrache mais ça semble marcher :

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, test: integer;
  ligne, concaN, concaC: string;
begin

  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    for j := 1 to length(Memo1.Lines.Strings[i]) do
    begin
      ligne := Memo1.Lines.Strings[i];

      case TryStrToInt(Ligne[j], test) of
        true: concaN := concaN + Ligne[j];

        false: concaC := concaC + Ligne[j];
      end;

      if (Ligne[j] = ' ') or (j = length(Ligne)) then
      begin
        if concaN <> '' then
          Memo2.Lines.Add(concaN)
        else
          if concaC <> '' then
            Memo3.Lines.Add(concaC);
            
        concaN := '';
        concaC := '';
      end;
    end;
  end;
end;





cantador
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
11 févr. 2013 à 17:33
Hi guys,

Allez, voici le mien :

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  s: string;
  CommaPos: Integer;
  P: PChar;
begin
  Memo2.Clear;
  Memo3.Clear;
  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    s := Memo1.Lines[i];
    CommaPos := Pos(',', s);
    s[CommaPos] := #0;
    Memo2.Lines.Add(s);
    P := @s[CommaPos + 2];
    Memo3.Lines.Add(P);
  end;
end;


Delphi, à agiter avant de servir...
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
11 févr. 2013 à 17:37
Merci pour ta réponse, mais cette fonction copie toutes les lignes avec les caractères et les chiffres.

c'est doc que ton memo1 de départ ne contient pas ce que tu donnes en exemple :
Jojo, 5100
Robert, 2701
Foufou, 2651
Sara, 1, 21-29, 31-60, 990-1000


dans la procédure , c'est la virgule qui est testée donc obligatoire !!

Dubois77
site perso
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
12 févr. 2013 à 07:46
Nabil, je me permets d'insister : ton memo1 contient quoi exactement ?
car avec ce que tu donnes dans ta question :

Jojo, 5100
Robert, 2701
Foufou, 2651
Sara, 1, 21-29, 31-60, 990-1000


et la proc qui suit :

procedure TForm1.Trucmuche;
var z:string; i:integer;
begin
memo2.clear;
memo3.clear;
for i:=0 to memo1.Lines.Count-1 do
  begin
    z := memo1.lines[i];
    memo2.lines.add(copy(z,1,pos(',',z)-1));
    memo3.lines.add(trim(copy(z,pos(',',z)+1,length(z))));
  end;
end;

j'ai testé, ça fonctionne parfaitement le résultat dans les memo2 et memo3 sont conformes à ce que tu veux avoir dans ta première question.


Dubois77
site perso
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
12 févr. 2013 à 07:51
preuve à l'appui :





Dubois77
site perso
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
18 févr. 2013 à 14:22
Bonjour,

Dans cet exercice tout le monde a bon, mais il faut
voir celui qui a su généraliser au maximum la procédure et
dans cette optique, f0xi est le champion,
car rien n'est codé en dur..

l'avantage ?

Sa méthode peut-être intégrer
dans un autre programme sans difficulté en adaptant simplement
les paramétrages.

bravo !

merci à nabil351974 d'accepter cette réponse

cantador
0
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014
20 févr. 2013 à 20:32
Bonsoir,

Merci les gars pour votre précieuse aide.ça m'a vraiment aidé!

Comme a dit cantador tout le monde a bon.

encore une fois merci à tous.




NABIL1974
0
Rejoignez-nous