Retrouver le contenu du champ à partir de son indice

cs_manudel Messages postés 63 Date d'inscription lundi 29 avril 2002 Statut Membre Dernière intervention 7 mars 2005 - 16 mai 2002 à 19:54
cs_Amadeus Messages postés 123 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 15 mars 2004 - 17 mai 2002 à 14:15
je dispose d'un fichier texte avec des champs de longueur délimités,
je souhaiterais trouver, avec une fonction, le contenu de chaque champ, en spécifiant la source de données, et le numéro du champ.

J'ai écris la fonction suivante, malheureusement, cela ne marche pas, j'aimerais
pouvoir comprendre....

Si vous avez une idée, n'hésitez pas !

function TfmMain.GetChamp(Source : String; Champ : Integer) : String;
type TStructFich = array[1..6] of Integer;
var i, idx : Integer;
sf : TStructFich;
begin
// idx := 0;
sf[1] := 2;
sf[2] := 16;
sf[3] := 7;
sf[4] := 6;
sf[5] := 2;
sf[6] := 5;

for i := 1 to (Champ-1) do
begin
idx := idx + sf[i];
Result := Copy(Source, idx+1, sf[Champ]);
end;
end;

3 réponses

cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
16 mai 2002 à 21:42
Ta procédure fonctionne bien sauf pour le champ 1 car le copy() est dans la boucle For. Or dans le cas du champ 1, la boucle n'est pas exécutée.

Il faut écrire :
idx := 0;
for i := 1 to (Champ-1) do idx := idx + sf[i];
Result := Copy(Source, idx+1, sf[Champ]);

;) Remarque : tu peux écrire directement sf dans le csource pour éviter les affectations manuelles :
Const sf:array[1..6] of Integer = (2,16,7,6,2,5);

--- :sleepy) Nono du Moulin :sleepy) ---
0
cs_Amadeus Messages postés 123 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 15 mars 2004 2
17 mai 2002 à 10:46
function DonneChamp(const S: string; Seperateur: Char; iNumSeg: Integer): string;

var
J, I: Integer;

begin
Result := '';
J := 1;
I := 0;

while (I <= iNumSeg) and (J <= Length(S)) do
begin
if (S[J] = Seperateur) then
Inc(I)
else if (I = iNumSeg) then
Result := Result + S[J];

Inc(J);
end;

Result := Trim(Result);
end;
0
cs_Amadeus Messages postés 123 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 15 mars 2004 2
17 mai 2002 à 14:15
Tu donne la ligne, le séparateur et le numéro de segment que tu veux et la fonction renvoie la chaine concerné
Ex:
s:= azerty;qsdfg;wxcvb;ghjkl
Donnesegment(s,';',1) renvoie qsdfg
0
Rejoignez-nous