Extraire des données de chaînes et les enregistrer dans un fichier csv

Résolu
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 - 16 janv. 2013 à 22:23
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Derniè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 :
   variable      |3| |3| |         24           | |    12    | |1| |           28             |
France           978 EUR 000000100000000000077918 000001108361     0000000000000000000000001212
French Guiana    978 EUR 000000100000000000077918 000001108361     0000000000000000000000001212
French Polynesia 953 XPF 000011933170000009298132 000000009288     0000000000000000000000001212


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...

36 réponses

dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
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

Dubois77
site perso
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
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 ...

a+



Composants Cindy pour Delphi
Faites une donation.
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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).

________________________________________________________
3
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
17 janv. 2013 à 22:47
Pour revenir au sujet qui nous préoccupe (), Andrew Teal sur le site d'Embarcadero nous donne une alternative intéressante avec l'utilisation des expression régulières.
Ça se passe ici : https://forums.embarcadero.com/thread.jspa?messageID=525508&tstart=0

J'ai bien fait de l'ouvrir, ce topic...
3

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

Posez votre question
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
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.
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
17 janv. 2013 à 08:30
Salut à tous,
bon ben voilà ce qu'il a fait Ici
Mais j'aime bien le :
J'ai pu crée cette procedure qui marche à merveille:

Merci qui
@+
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
17 janv. 2013 à 08:48
salut yanb
c'est marrant ça me rapelle quelque chose

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
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 !

cantador
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
17 janv. 2013 à 11:02
je rejoins tout à fait Mauricio et il me semble justifié et nécessaire de prendre une sanction vis à vis de ameno_123.

cantador
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
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 !

Pratiques, ces smileys...
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
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.

@+
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
17 janv. 2013 à 12:34
J'en profite pour dire merci à fOxi pour sont explications sur les fichiers CSV,TSV,FSV...encore très instructif
@+
0
Salut à tous,

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) !

Salutations particulière à Dr. f0xi.

Cdt,
Andnotor
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
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 ...

Que veux-tu, on tous des hippies ...

a+


Composants Cindy pour Delphi
Faites une donation.
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
17 janv. 2013 à 13:53
D' ailleurs, je le prouve en ne supprimant pas ton post, qui, lui aussi, est inutile ...

Excellent, Mauricio... la classe, on l'a ou on l'a pas.
Qu'on soit "professinnel" ou qu'on le soit pas.
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
17 janv. 2013 à 13:55
"professionnel" (mon "o" s'était barré)
0
Nous avons une rublique particulière pour les histoires de poils

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 !

ps: désolé de t'avoir vexé korgis !

A+
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
17 janv. 2013 à 14:32
ps: désolé de t'avoir vexé korgis !

C'est pas grave.
Chacun son style.
D'ailleurs ta "démo" à toi ne manque pas d'intérêt.

D'ailleurs, l'utilisation de pointeurs, ça fait tout de suit plus "pro".
0
Utilisateur anonyme
17 janv. 2013 à 15:08
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 ?
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
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 !

a+


Composants Cindy pour Delphi
Faites une donation.
0
Rejoignez-nous