IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

fonction pour scinder un tableau en plusieurs parties


Sujet :

VB 6 et antérieur

  1. #1
    HoB
    HoB est déconnecté
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Mai 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2004
    Messages : 58
    Points : 42
    Points
    42
    Par défaut fonction pour scinder un tableau en plusieurs parties
    Bonjour à tous,

    je cherche une fonction qui permet de couper un tableau pour obtenir plusieurs sous tableaux de la meme taille.
    j'ai trouvé la fonction Array.copy(sourceArray As Array, sourceIndex As Integer, destinationArray As Array, destinationIndex As Integer, length As Integer) qui prend length elements du tableauSourceArray à partir de l'index SourceIndex et les copie dans le tableau DestinationArray à l'index destinationIndex, mais le problèmem c'est que ca fonctionne en vb.net et pas en vb6.
    vous ne connaitriez pas un equivalent ? ou un algo assez optimisé pour le faire ?

    je dois faire un programme qui scinde des fichier de donnée en plusieurs partie et comme ces fichiers contiennent des millions d'enregistrements ca m'arrangerais d'avoir une fonction qui soit plus optimisé qu'une boucle de recopie

    merci d'avance pour vos reponse

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par HoB Voir le message
    Bonjour à tous,
    .../...
    je dois faire un programme qui scinde des fichier de donnée en plusieurs partie et comme ces fichiers contiennent des millions d'enregistrements ca m'arrangerais d'avoir une fonction qui soit plus optimisé qu'une boucle de recopie
    .../..
    En tout état de cause pour un résultat véritablement optimisé,
    je ne vois pas le faire en VB (... ni même en VB.net)

  3. #3
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 105
    Points : 16 626
    Points
    16 626
    Par défaut
    qui prend length elements du tableauSourceArray à partir de l'index SourceIndex et les copie dans le tableau DestinationArray à l'index destinationIndex
    moi j'ai bien une petite idée , mais (ce fameux mais) tout depend de ce que contient ton tableau, peux-tu nous mettre 2 ou 3 elements (pas plus) de ce tableau, ou du fichier de donnée ?
    Sans boucle For ... Next, j'ai un bout de source pense-bête qui pourrai eventuellement être utilisé.

  4. #4
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Peut être l'algo de tronçonnage des séquences ADN?

  5. #5
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Code HoB : Sélectionner tout - Visualiser dans une fenêtre à part
    (...) je dois faire un programme qui scinde des fichier de donnée en plusieurs partie (...)

    Dans quel format, le fichier de données ? Texte ? Binaire ? Excel ? Table d'une base de données ?

  6. #6
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Bonjour zaza, il est une coutume en france de monter un canular le premier avril de chaque année. On appelle çà un poisson d'avril. Je pense que c'est le cas ici

  7. #7
    HoB
    HoB est déconnecté
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Mai 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2004
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    Bonjour à tous,

    deja merci pour vos reponse.

    en fait mon fichier de donnée contient une liste de ROW_ID db2, donc ca donne un truc dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ROW_ID         
    ---------------
    1-2U2DVW       
    1-2U2DVY       
    1-2U2DW0       
    1-2U2DW2       
    1-2U2DW4       
    1-2U2DW6
    cette liste me permettra ensuite d'acceder aux enregistrements correspondants dans la base dans un second traitement : dans ce second traitement je me connecte a notre progiciel pour migrer toutes les données client. c'est pour pouvoir parraleliser le second traitement qui est tres long que j'ai besoin de scinder mon fichier.

    j'etais parti sur du VB pour faire ca parce que pour le second traitement je suis obligé de faire un code VB pour me connecter au progiciel, j'ai pas la DLL qu'il faut pour pouvoir me connecter avec un autre langage. mais pour la partie ou je scinde mon fichier de donnée, eventuellement je peux passer par du C, c'est vrai que ca serait peu etre plus rapide. lke probleme est que j'ai pas les droits pour installer un compilo C sur mon poste et que je sais pas quand on pourra venir m'en installer un.

    Pour en revenir à mon programme, Pour l'instant ce que je fais c'est que j'ouvre mon fichier en Binaire et que je recupère toutes les données en une fois dans un tableau avec un Get et un split.
    ensuite je comptais scinder mon tableau en plusieurs sous partie (c'est ma question) et recréer pour chacun de ces sous tableau un fichier de donnée avec un join et un put.

  8. #8
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Si tes donnees sont toutes de la même taille (d'après l'exemple 8 octets), il est possible d'ouvrir ton fichier en mode Random avec une longeur d'enregistrement qui serait un multiple de la taille de la donnée

    Quelque chosse comme çà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Private Sub Command1_Click()
      Dim hFichIn As Integer
      Dim hFichOut As Integer
      Dim TailleDonnée As Integer
      Dim NbDonnées As Integer
      Dim Buffer As String
      Dim NumFichier As Integer
      Dim MonFichier As String
     
      MonFichier = App.Path & "\MesDonnes.txt"
      TailleDonnée = 8
      NbDonnées = 4000
      Buffer = String(TailleDonnée * NbDonnées, 0) 'taille maxi 32767
      NumFichier = 1
      hFichIn = FreeFile
      Open MonFichier For Random As #hFichIn Len = Len(Buffer)
        Do While Not EOF(hFichIn)
          hFichOut = FreeFile
          Get #hFichIn, NumFichier, Buffer
          Open App.Path & "\Split" & NumFichier For Output As #hFichOut
            Print #hFichOut, Buffer
          Close #hFichOut
          NumFichier = NumFichier + 1
        Loop
      Close #hFichIn
    End Sub
    Ou même avec une ouverture en mode binaire

  9. #9
    HoB
    HoB est déconnecté
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Mai 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2004
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    merci pour ta réponse.
    en fait mes données varient entre 6 et 15 caracteres.

    je ne suis pas sur de comprendre le Open MonFichier For Random As #hFichIn Len = Len(Buffer) :
    ca ouvre le fichier de donnée et permet de récupérer des bloc de la taille du buffer ? et tant que l'on récupére un bloc de cette taille on ecrit un nouveau fichier avec le buffer, c'est bien cela ?

  10. #10
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    c'etait çà l'idée, a jetter à la poublelle puisque tes données n'ont pas de taille fixe.

  11. #11
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 105
    Points : 16 626
    Points
    16 626
    Par défaut
    Je n'aurrai pas proposé autre chose que se qui a ete proposé par Delbeke, c'est pourquoi je demendai des precisions sur les données à traiter.
    (en passant, Delbeke, quand on (je) fait des conn.... dans la proposition de reponse a un post, heureusement qu'il y a un autre qui corrige )

  12. #12
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    donc tu cherches par exemple, si on dit que dans ton fichier initial tu as 500 entrées, à faire 2 x 250 c'est ça ?

    Si c'est le cas,

    0/ définir la taille à partir de laquelle un sous-fichier doit être créé
    1/ Tout charger en mémoire à partir du fichier d'origin
    2/ Repérer les positions des retours de chariot (ou je ne sais quel séparateur) grâce à INSTRB
    3/ lorsque INSTRB > la taille définie en 0/, stocker tout ce qui précède le résultat de INSTRB dans un nouveau fichier
    4/ loop

    C'est certainement optimisable.
    A+

  13. #13
    HoB
    HoB est déconnecté
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Mai 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2004
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    merci je vais essayer ca

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    fait gaffe à INSTRB
    Ca va plus vite que instr, mais faut interpréter la position après.

    INSTR(X) = INSTRB(X) * 2 +1 je crois, ou un truc comme ça

    Vérifie !

  15. #15
    HoB
    HoB est déconnecté
    Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Mai 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2004
    Messages : 58
    Points : 42
    Points
    42
    Par défaut
    bon j'ai pas eu le termps de poster une réponse avant mais je m'en suis finalement sorti avec une seule boucle grace à INSTRB

    Pour ceux à qui ca pourrais servir, voila ce que ca donne (le nombre de sous fichier à créer est passé en parametre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
     
       Dim sDataTemp As String
       Dim sSubDataTemp As String
       Dim sDataTab() As String
       Dim lNbLines As Long
       Dim lNbFic As Integer
       Dim iIndDep As Integer
       Dim i As Integer
       Dim lTailleMax As Long
       Dim lPosFinSousFichier As Long
       Dim lPosDebSousFichier As Long
       Dim ifile As Integer
       Dim lTailleSubFile As Long
       Dim lTailleSubTemp As Long
       Dim lTailleFicOrig As Long
       Dim lTailleMaxOrNbFic As Long
       Dim sTailleOuNb As String
       Dim sNomObjet As String
       Dim NBOctetMax As Long
       Dim f As Integer
     
    '1/lecture du fichier d'origine
     
        ' trappe les erreurs
        On Error GoTo Err_ReadFileToBuffer
     
        ' Ouverture du fichier en Binaire
        f = FreeFile
        Open sFile For Binary Access Read As #f
            ' préallocation d'un buffer à la taille du fichier
            sDataTemp = Space$(LOF(f))
            ' lecture complète du fichier
            'je commence à lire à partir de l'octet iIndDep (calculé avant) pour ne recupérer que les 
            'infos utiles du fichier
            Get #f, iIndDep, sDataTemp
        Close #f
     
    '2/comptage du nombre d'enregistrement dans le fichier d'origine
     
        sDataTab() = Split(sDataTemp, vbCrLf)
        lNbLines = UBound(sDataTab()) + IIf(LBound(sDataTab()) = 0, 1, 0)
     
    '3/ calcul de la taille d'un sous fichier (en nombre d'enregistrement) et du nombre d'octet à 
    'inserer dans un sous fichier
        'lnbfic est le nombre de fichier à créer passé en parametre
        lTailleMax = lNbLines \ lNbFic 'division entière
        If (lTailleMax * lNbFic) < lNbLines Then
           lTailleMax = lTailleMax + 1
        End If
     
        'pour obtenir le nombre d'octet max, on multiplie ce nombre par 15 car il y a 15 caractère 
        'max par ligne
        NBOctetMax = lTailleMax * 15
     
    '3/ boucle de création des sous fichier
        lPosFinSousFichier = 0
        For i = 1 To lNbFic
            'j'ajoute 2 caractère à la position de fin pour obtenir la position de debut du fichier 
            'suivant, pour eviter de récupérer une ligne vide (le caractère VbCrLf prend 2 caractères :
            'saut de ligne et retour chariot
            lPosDebSousFichier = lPosFinSousFichier + 2
            'je recherche la dernière occurence de fin de ligne de mon sous fichier
            'pour cela je commence à chercher à partir du debut de la dernière ligne de mon sous fichier, grace à la fonction INSTRB : 
            'j'ajoute à la position du premier enregistrement de mon nouveau sous
            'fichier dans le fichier origine le nombre d'octet max par fichier (moins 15
            'pour etre sur que le fichier n'ai pas plus de NBOctetMax octets) et je recherche
            'l'occurence de fin de ligne suivante
            lPosFinSousFichier = InStrB((lPosDebSousFichier + NBOctetMax - 15), sDataTemp, vbCrLf, 0)
            'je recupere les données de mon sous fichier
            lTailleFicOrig = Len(sDataTemp)
            lTailleSubFile = lPosFinSousFichier - lPosDebSousFichier
            sSubDataTemp = Space$(lTailleSubFile)
            sSubDataTemp = Mid(sDataTemp, lPosDebSousFichier, lTailleSubFile)
            lTailleSubTemp = Len(sSubDataTemp)
     
            'ecriture du sous fichier
            ' Ouverture du fichier en Binaire
            f = FreeFile
            Open sSubFile & "_" & i For Binary Access Write As #f
                ' ecriture complète du fichier
                Put #f, , sSubDataTemp
            Close #f
     
        Next i
    voila, ca marche mis à part un petit probleme de compteur qui fait que je commence quand meme mes fichiers par une ligne vide et je vois vraiment pas pourquoi, mais bon je ne desespère pas de trouver. si quelqu'un a une idée la dessus, elle est la bienvenue.

Discussions similaires

  1. fonction pour remplir un tableau de char *
    Par saidus dans le forum C
    Réponses: 3
    Dernier message: 02/05/2009, 10h28
  2. [Tableaux] Fonction pour remplir un tableau
    Par renaud26 dans le forum Langage
    Réponses: 10
    Dernier message: 27/01/2008, 10h19
  3. Réponses: 3
    Dernier message: 08/08/2007, 09h47
  4. [SQL] Fonction pour trier un tableau
    Par ciel65 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/02/2007, 16h43
  5. Réponses: 9
    Dernier message: 17/02/2006, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo