Découpage de liste intelligent

Découpage de liste intelligent - Algo - Programmation

Marsh Posté le 18-05-2005 à 14:49:15    

Bonjour,
 
Je dois découper un fichier texte (que je nommerai "A" ) de 360.000 lignes en plusieurs fichiers texte d'environ 20.000 lignes chacun (20.000 étant un nombre approximatif car saisi par l'utilisateur et compris entre 15000 et 30000, mais peu importe).
Chaque ligne de "A" commence par un code fournisseur en " lettres (disons CAR pour Carrefour par exemple).
 
Dans les 360.000 lignes, il y a environ 100 codes fournisseurs différents mais triés dans l'ordre alphabétique : exemple du fichier (en plus petit) :
 
AABgqregeazgzerget
AABrhjyrjyejyjyeru
AABdkzghelkghekhlo
CDEzraelghreihamki
CDErezagmhezrgahuj
DATioazyrzpeioygak
DATfrzrthrznrtyhhy
DATzeagvzregaezgee
DATzargzrgazgrezgy
DATzregazrgrezgaze
ZENrzayjuutkukukut
ZENerazgzervyjeryj
ZENfjdvjkhfjhqsjkv
ZIMezqbgtrhzethrth
ZIMuyktyukrykukrkk
ZIMopreuiioerzeiou
ZIMazdsahjvxhjahjg
 
(dans cet exemple, il n'y a que 5 codes fournisseur : AAB, CDE, DAT, ZEN et ZIM)
 
Je souhaite découper ce fichier (ou tableau car j'en ai fait un tableau de structure) en sous-fichiers ou sous-tableaux dont la taille s'approche le plus possible de 20000 lignes.
 
Evidemment, la difficulté du problème c'est que je souhaite ne pas séparer un même fournisseur dans 2 fichiers ou tableaux différents.
 
Ici, dans notre exemple, si le nombre de lignes n'était pas 20.000 mais 7, ça donnerait des sous-tableaux comme ceci :
 
Sous-tableau1 :
 
AABgqregeazgzerget
AABrhjyrjyejyjyeru
AABdkzghelkghekhlo
CDEzraelghreihamki
CDErezagmhezrgahuj
 
Sous-tableau2 :
 
DATioazyrzpeioygak
DATfrzrthrznrtyhhy
DATzeagvzregaezgee
DATzargzrgazgrezgy
DATzregazrgrezgaze
ZENrzayjuutkukukut
ZENerazgzervyjeryj
ZENfjdvjkhfjhqsjkv
 
Sous-tableau3 :
 
ZIMezqbgtrhzethrth
ZIMuyktyukrykukrkk
ZIMopreuiioerzeiou
ZIMazdsahjvxhjahjg
 
J'espère avoir été clair.
Le résultat de l'algo ne doit pas forcément être plusieurs sous-tableaux, mais un tableau récapitulatif de cette forme :
 
TR[1]="ABB-CDE"
TR[2]="DAT-ZEN"
TR[3]="ZIM-ZIM"
 
Je cherche, je cherche, mais je ne suis pas assez intelligent pour trouver cet algo...
Si quelqu'un pouvait m'aider un peu, c'est avec grand plaisir.
 
Merci d'avance.

Reply

Marsh Posté le 18-05-2005 à 14:49:15   

Reply

Marsh Posté le 18-05-2005 à 23:44:44    

> A vue de nez, je construirais un dictionnaire associant chaque code fournisseur à un nombre, le nombre de fois où apparaît ce code dans le fichier.
On obtient alors un dictionnaire D du type :
    D(1) : ABB=75,  
    D(2) : ABD=86,
    ...
    D(n) : ZIM = 82.
 
Puis tu ajoutes les valeurs numériques de D(1)+D(2)+... jusqu'à tomber sur 20000 -> disons que tu t'arrête par exemple à D(250) et tu obtiens un premier fichier.
Puis tu recommences à partir de D(251)+D(252)+... jusqu'à obtenir à nouveau 20000, etc.
 
Qu'en penses-tu ?

Reply

Marsh Posté le 19-05-2005 à 08:17:02    

C'est une très bonne idée. Au moins je suis sûr de ne pas scinder un fournisseur dans deux fichiers différents. Pas bête du tout, je vais essayer ça. Merci.
 
edit: Jamais je n'aurais cru qu'un prof de lettre puisse m'en apprendre en programmation  :D  Comme quoi... Internet n'a pas fini de m'étonner :-)


Message édité par $@m le 19-05-2005 à 08:21:22
Reply

Marsh Posté le 21-05-2005 à 15:20:08    

Pour info, c'est grace à la méthode de suizokan que j'ai réussi cet algo. La petite différence quand même c'est que je ne devais pas m'arrêter sur 20.000 mais le plus près de 20.000 possible... là résidait la difficulté.
 
J'aurais bien mis le code, mais il est tellement spécifique qu'il ne serait pas exploitable par quelqu'un d'autre.

Reply

Marsh Posté le 22-05-2005 à 12:48:19    

est-ce que chaque ligne fait exactement la même taille ?

Reply

Marsh Posté le 06-06-2005 à 00:22:19    

moi j'aurais tout simplement utiilisé une méthode "seuillage" des lignes : je coupe au bon endroit tout en étant le plus proche possible de 20000 lignes...je ne pense pas qu'il faille bien chercher plus loin. [:spamafote]. Il faut donc en gros voir combien de lignes j'ai si je coupe en défaut et si je coupe en excès. Je garde la valeur seuil qui me convient le mieux.
 
Exemple :
 
AABgqregeazgzerget
AABrhjyrjyejyjyeru
AABdkzghelkghekhlo
CDEzraelghreihamki
CDErezagmhezrgahuj
DATioazyrzpeioygak
DATfrzrthrznrtyhhy
DATzeagvzregaezgee
DATzargzrgazgrezgy
DATzregazrgrezgaze
 
Ci-dessus, avec 7 lignes, soit tu prends  
 
AABgqregeazgzerget
AABrhjyrjyejyjyeru
AABdkzghelkghekhlo
CDEzraelghreihamki
CDErezagmhezrgahuj
 
= 5 lignes
 
ou bien tout
 
= 10 lignes
 
Bon comme 7 est plus proche de 5, tu gardes le paquet de 5 ; sinon ca serait ete le contraire, Sinon, si c t pile poil au milieu, tu prends un paquet au pif.


Message édité par Giz le 06-06-2005 à 00:26:37
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed