korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 2019
-
16 janv. 2013 à 22:23
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 2019
-
18 janv. 2013 à 21:47
[i]Préambule :
Le thread précédent a été fermé par un administrateur pour une raison tout à fait justifiée.
En effet, on ne vient pas ici pour chercher des solutions toutes faites qu'il suffirait de copier-coller.
Mais bon, je n'aime pas le gaspillage.
Et j'avais passé un petit moment là-dessus cet aprèm'.
En rajoutant quelques explications à visée pédagogique, et en espérant que la leçon a été entendue, je me permets donc de poster ceci./i
Quelqu'un a récemment posé une question concernant la marche à suivre pour extraire des champs d'un fichier contenant des données sous forme linéaire, et les enregistrer dans un fichier *.csv;
Delphi sait faire tout ça très bien, reste à bien poser le problème.
Nous pouvons utiliser pour cela 2 StringList, une pour ouvrir et parcourir le fichier d'origine, une pour inscrire les données recueillies et les enregistrer ensuite dans le fichier *.csv.
On peut remarquer que les lignes n'ont pas la même longueur, mais seul le premier
bloc est de longueur variable, les autres ne varient pas :
Il faut parcourir une par une chaque ligne du fichier au moyen d'une boucle.
En partant de la fin de la chaîne (Length(MaChaine)), le nombre de caractères à compter (et à retrancher) pour se positionner sur le bloc à extraire est toujours le même.
Pour extraire ce bloc, la fonction "Copy" fournie par Delphi est tout à fait indiquée :
function Copy(S; Index, Count: Integer): string;
"S" est la chaîne d'où on veut extraire nos champs, "Index" est la position initiale du champ à extraire, "Count" est sa longueur.
Pour récupérer le premier bloc correspondant au nom du pays, une des méthodes possibles consiste à se positionner en début de chaîne, puis à copier le bloc compris entre cette position et la position (longueur de chaîne - nombre de caractères à déduire pour se positionner sur le début de la partie invariable).
On utilise encore la fonction "Copy" pour cela.
Puis on élimine les parties vides (à droite de la chaîne obtnue) avec la fonction "TrimRight".
Voici le code :
procedure LinesToCsv(const LinesFileName, CsvFileName: string);
var
i : Integer;
ListLin : TStringList;
ListCsv : TStringList;
Tmp : string;
Country : string;
Curr : string;
Value : string;
FoundDS : Char;
Len : Integer;
begin
FoundDS := DecimalSeparator;
DecimalSeparator := '.';
ListLin := TStringList.Create;
try
ListLin.LoadFromFile(LinesFileName);
ListCsv := TStringList.Create;
try
for i := 0 to ListLin.Count - 1 do
begin
Tmp := ListLin[i];
Len := Length(Tmp);
Country := TrimRight(Copy(Tmp, 1, Len - 71));
Curr := Copy(Tmp, Len - 67, 3);
try
Value := FormatFloat('0.####', StrToFloat(Copy(Tmp, Len - 40, 12)) / 10000);
ListCsv.Append(Country + ';' + Curr + ';' + Value);
// il faudrait ajouter ici un test de validité des données
except
ListCsv.Append('< ligne non valide trouvée >');
end;
end;
ListCsv.SaveToFile(CsvFileName);
finally
ListCsv.Free;
end;
finally
ListLin.Free;
DecimalSeparator := FoundDS;
end;
end;
Il faudrair ajouter un test de validité des données lues, mais c'est un autre problème.
Avec Delphi, tout devient possible...
A voir également:
Extraire des données de chaînes et les enregistrer dans un fichier csv
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 17 janv. 2013 à 07:34
pour memo dans l'affaire précédente, ma solution répondait à la question posée, à savoir :
Ce que je veux est simple mais je bloque!!
1) Par exemple pour: 978EUR000000100000000000077918000001108361 je dois prendre les 7 derniers chiffres 1108361 pour les diviser/10 000 pour avoir = 110.8361 et ainsi de suite..
2) Prendre le code devise, du 4ème au 6ème caractère de la trame.
3) Mettre tous cela dans un fichier csv
qui ne mentionnait pas de récupérer le nom du pays en entête, d'ou la solution de repérer la longue chaine.
mais bon c'était avant !!!
il y a prescription maintenant
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 17 janv. 2013 à 10:55
Bonjour à tous,
Désolé pour ceux qui ont travaillé sur la question et qui auraient voulu posté leur solution.
j' ai effectivement fermé la question et je pense que je n' ai pas besoin de me justifier (je vais le faire quand même ):
Notez que "ce membre" est débutant depuis 2005!!!
Je trouve inadmissible prétextant d' être débutant, venir demander du code tout fait. Si on est débutant, le minimum sindical est d' apprendre le langage afin de nous présenter quelques chose.
Faire du copier/coller du code de Dubois chez nos confrères de developpez.com en disant qu' il l' a fait lui-même mériterait le ban!
Je déteste qu' on nous prenne pour des cons ...
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 17 janv. 2013 à 12:21
ATTENTION
Un fichier CSV (coma separated values) c'est ça -> a,b,c,d
ou encore ça -> "a","b","c","d"
les variantes avec subCSV -> a;"a,b,c,d";"0|1|2|3"
mais quand on a des valeurs séparée par un certain nombre d'espace c'est du FSV (Fixed Space Value)
et quand il s'agit de tabulation c'est du TSV (Tabed Separated Value)
bien que TSV puisse être assimilé a du CSV (séparateur = 1 seule Tabulation) certains utilise deux ou trois tabulation et ne peuvent plus être lus par une routine CSV de base, il s'agit alors d'un format spécifique proche du TSV.
FSV est encore différent et peut être lus avec du type Record avec tableau de caractère fixe à condition de savoir l'encodage Ansi ou Unicode du fichier texte.
Le meilleur format reste le CSV+subCSV avec protection de champs qui peut utiliser tout un panel de caractère de protection et de séparation :,;./!?{}()[]-_|\*+$%<>
<a,b,c,d<|<"texte"@"texte"@"texte"<|<%0.0%*%3.14%*%5.125%<
CSV p=< et s=|
(1) p=null et s=,
(2) p=" et s=@
(3) p=% et s=*
(3.1) p=null et s=.
impossible à faire avec uniquement des espaces ou des tabulations (trop sujet aux erreurs et quasi impossible à corriger à la main).
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917 16 janv. 2013 à 23:49
C'est beau ce que tu dis, cantador...
Surtout "l'ange qui fond sur la question dans un grand panache de lumière".
Un si beau compliment valait bien le coup que je me décarcasse.
Et s'il sait trouver le chemin de ce post, notre ami ameno_123 nous dira peut-être ce que tout cela lui inspire.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 17 janv. 2013 à 10:58
ameno_123 a ratissé large (mais ça fait partie du jeu..) et ne se prive pas de s'attribuer la solution des autres.
avec une telle attitude, il ne faut pas s'attendre à des remerciements de sa part..
et puis ce post est un peu alambiqué car la question n'est pas clairement posée et il nous donne seulement 3 enregistrements mais les autres sont-ils tous du même acabit ?
c'est la raison pour laquelle, je commence par tirer la pelote sur ce type de question..
ameno_123 à défaut d'apprendre quelque chose nous a surtout laissé un goût amer.
S'il n'arrive pas à percer en informatique, rien n'est perdu pour lui,
car il a en revanche toutes ses chances dans le métier de comédien !
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917 17 janv. 2013 à 11:24
La question posée était plus intéressante que la personne qui la posait, c'est évident.
De toute évidence, la bonne attitude est d'attendre au minimum un bout de code de la part du questionneur, en gage de bonne volonté.
Je m'en tiendrai dorénavant personnellement à cette procédure.
Mais que cela n'assombrisse pas notre humeur.
Gardons frais et intact notre plaisir de coder et continuons à partager notre passion.
Haut les coeurs !
cs_yanb
Messages postés271Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention 7 juillet 202214 17 janv. 2013 à 12:30
@Mauricio : Complètement d'accord !+++++++++1
@Cantador : Ah ! oui oui ! très large même chez embarcadero
Moi ce que je reproche c'est pas le fait de ratisser large mais le :
J'ai pu crée cette procedure qui marche à merveille:
Un peu les b***** pour ceux qui font avancer les choses sur le / les forums !
Mais comme dit korgis
Gardons frais et intact notre plaisir de coder et continuons à partager notre passion.
Vous le constaterai certainement, j'ai fait quelques nettoyages dans la discussion ouverte par ameno_123 sur Developpez.net.
J'ai laissé le lien sur le sujet Codes-Sources original (Rendons à Dubois ce qui est à Dubois) mais ai supprimé celui pointant sur celui-ci qui n'a franchement aucun intérêt ainsi que les remerciements plus qu'inutile de Mauricio(pt) !
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 17 janv. 2013 à 13:22
Salut annotor,
j' ai remarqué effectivement que mon post a été supprimé .
Je remarque que la politique de developpez.com est très différente de la notre, à moins que se soit un excès de zèle ...
Ici, on ne supprime pas les messages "inutiles" auquel cas on ne pourrait pas discuter de tutu et de poils se qui serait très regrettable.
D' ailleurs, je le prouve en ne supprimant pas ton post, qui, lui aussi, est inutile ...
Maintenant si casser du sucre sur le dos d'un intervenant (malgré ses propos maladroits) est bienvenu ici, ça ne l'ait pas sur DVP et les prémices de trolls sont systématiquement supprimés.
De plus, les différents commentaires sur la discussion présente ne font que retirer tout crédit à la "démo" de korgis qui tourne au règlement de compte contre l'un de vos membres...
Perso, je ne trouve pas ça acceptable, mais c'est toi le modo, c'est toi qui décide !
andnotor : Il me semble que dans ton nettoyage tu as oublié une petite notion de droit qui s'applique aussi sur la toile et aussi sur developpez : la liberté d'expression.
Ps : Quand on semble sous entendre que DEVELOPPEZ est un site plus sérieux qu'ici, et qu'on voit que le compte du membre source de polémiques n'a pas été envoyé aux abymes, perso ca me fait bondir.
Bon je suppose qu'apres le commentaire de Mauricio que tu as effacé, maintenant c'est mon compte qui va sauter ou t'es un peu plus intègre que ca ?
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 17 janv. 2013 à 15:13
Ici, on est sérieux et/ou on se marre tout en postant au même endroit!
Pour ce qui est de "notre membre", personne ne l' a "cassé" mais on l' a recadré sans troll ni règlement de compte comme tu dis.
On a pas dû lire les mêmes posts, je ne vois que cette explication!
"J'ai laissé le lien sur le sujet Codes-Sources original (Rendons à Dubois ce qui est à Dubois) mais ai supprimé celui pointant sur celui-ci qui n'a franchement aucun intérêt ainsi que les remerciements plus qu'inutile de Mauricio(pt) ! "
"les prémices de trolls sont systématiquement supprimés"
La liberté d' expression est la plus belle des libertés et on ne censure pas des remerciements ou un lien sur le sujet originel au nom de la prévention!
Entout cas, merci à Korgis pour son code source et j' en profite pour remercier yanb (qui fut attentif) ici vu que mes remerciements ont été censurés chez dvp !