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

korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 16 janv. 2013 à 22:23 - Dernière réponse : korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention
- 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...
Afficher la suite 

37 réponses

Répondre au sujet
dubois77 689 Messages postés jeudi 17 avril 2008Date d'inscription 9 mars 2018 Dernière intervention - 17 janv. 2013 à 07:34
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de dubois77
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscriptionModérateurStatut 15 décembre 2014 Dernière intervention - 17 janv. 2013 à 10:55
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_MAURICIO
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscriptionModérateurStatut 9 mars 2018 Dernière intervention - 17 janv. 2013 à 12:21
+3
Utile
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).

________________________________________________________
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 17 janv. 2013 à 22:47
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de korgis
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 16 janv. 2013 à 23:49
0
Utile
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.
Commenter la réponse de korgis
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 17 janv. 2013 à 08:30
0
Utile
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
@+
Commenter la réponse de cs_yanb
dubois77 689 Messages postés jeudi 17 avril 2008Date d'inscription 9 mars 2018 Dernière intervention - 17 janv. 2013 à 08:48
0
Utile
salut yanb
c'est marrant ça me rapelle quelque chose

Dubois77
site perso
Commenter la réponse de dubois77
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 17 janv. 2013 à 10:21
0
Utile
Salut à tous,
bon ben voilà ce qu'il a fait Ici
Mais j'aime bien le :
[quote]J'ai pu crée cette procedure qui marche à merveille:
/quote

Et bien comme ça, on sait à qui on a affaire...
Commenter la réponse de korgis
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscriptionModérateurStatut 27 mars 2018 Dernière intervention - 17 janv. 2013 à 10:58
0
Utile
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
Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscriptionModérateurStatut 27 mars 2018 Dernière intervention - 17 janv. 2013 à 11:02
0
Utile
je rejoins tout à fait Mauricio et il me semble justifié et nécessaire de prendre une sanction vis à vis de ameno_123.

cantador
Commenter la réponse de cs_cantador
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 17 janv. 2013 à 11:24
0
Utile
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...
Commenter la réponse de korgis
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 17 janv. 2013 à 12:30
0
Utile
@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.

@+
Commenter la réponse de cs_yanb
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 17 janv. 2013 à 12:34
0
Utile
J'en profite pour dire merci à fOxi pour sont explications sur les fichiers CSV,TSV,FSV...encore très instructif
@+
Commenter la réponse de cs_yanb
0
Utile
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
Commenter la réponse de andnotor
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscriptionModérateurStatut 15 décembre 2014 Dernière intervention - 17 janv. 2013 à 13:22
0
Utile
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.
Commenter la réponse de cs_MAURICIO
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 17 janv. 2013 à 13:53
0
Utile
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.
Commenter la réponse de korgis
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 17 janv. 2013 à 13:55
0
Utile
"professionnel" (mon "o" s'était barré)
Commenter la réponse de korgis
0
Utile
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+
Commenter la réponse de andnotor
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 17 janv. 2013 à 14:32
0
Utile
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".
Commenter la réponse de korgis
Utilisateur anonyme - 17 janv. 2013 à 15:08
0
Utile
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 ?
Commenter la réponse de Utilisateur anonyme

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.

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