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

  1. #1
    Candidat au Club
    #galérien : insérer du des lignes dans un gros fichier
    Bonjour,
    j'ai un gros fichier txt de 300mo de data avec plusieurs champs par ligne
    je dois y ajouter un gros paquet de lignes (1000)

    il faut faire ça vite donc j'ai abandonné le batch pour le vbs que je maîtrise bcp moins.

    voici donc mon pb en illustration

    fichier dispo :
    fichier_complet.txt
    ligne_a_ajouter.txt

    le fichier_complet.txt est de la forme :
    #start
    champ1 champ2 champ3
    champ1 champ2 champ3
    champ1 champ2 champ3

    champ1 champ2 champ3
    #END

    Le fichier ligne_a_ajouter.txt
    champ1 champ2 champ3
    champ1 champ2 champ3
    champ1 champ2 champ3

    Vous l'avez bien compris il faut retirer le #end
    insérer les ligne a ajouter
    et remettre le #end a la fin

    et bah je n'y arrive pas !
    je sais supprimer une ligne
    insérer du texte mais pas plusieurs champs
    et après 5h de remue méninge, j’appelle à l'aide...

    merci

  2. #2
    Rédacteur

    bonjour,

    à l'énoncé du problème je comprends qu'il n'y a qu'un seul #start en début de fichier et un seul #end en fin de fichier, est-ce exact ?
    si je pose cette question, c'est qu'il arrive qu'un problème évolue au fil des propositions...
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Candidat au Club
    Bonjour.
    Oui c’est ça, 1 seule occurrence de la 1ere ligne et 1 seule de la dernière

  4. #4
    Rédacteur

    il y a plusieurs façons d'aborder ce genre de problème
    celui qui consiste à n'utiliser que les ressources par défaut du système doit passser par le FileSystemObject
    ce n'est pas le plus performant mais ça devrait tourner sur toutes les configurations

    cet exemple présuppose :
    qu'il s'agit de données ASCII
    qu'il n'existe aucun caractère y compris espace, CR et/ou LF après #end
    note: la 1ère ligne mise en commentaire permet de tester l'existence du composant ADO.Stream qui permettrait un code plus performant
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Set adost = CreateObject("ADODB.Stream")
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set sfile = fso.GetFile("fichier_complet.txt")
    Set stream = sfile.OpenAsTextStream(1,0)
    buffer = stream.Read(sfile.Size - 4)
    stream.Close
    Set dtastream = fso.OpenTextFile("ligne_a_ajouter.txt",1)
    Set stream = fso.OpenTextFile("fichier_encorepluscomplet.txt",2,True)
    stream.Write buffer
    stream.Write dtastream.ReadAll
    stream.Write vbCrLf & "#end"
    stream.Close
    dtastream.Close
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  5. #5
    Candidat au Club
    Respect...
    ça a l'air de fonctionner (je vais faire tester le gros fichier par le système mais il m'a l'air correct)
    par contre possible de commenter les lignes pour que je comprenne?
    De plus, peut-on renommer le fichier final comme celui d'origine?
    (j'ai bien compris qu'on ne modifie par l'original mais qu'on crée un 3ème fichier global)


    Mais sinon Bravo et un grand merci !!!

  6. #6
    Rédacteur

    par contre possible de commenter les lignes pour que je comprenne?
    De plus, peut-on renommer le fichier final comme celui d'origine?
    voilà :

    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
    'Set adost = CreateObject("ADODB.Stream")
    Set fso = CreateObject("Scripting.FileSystemObject")
    ' instanciation de l'objet File du fichier source "fichier_complet"
    ' sans ouverture directe pour pouvoir récupérer sa taille en octets (sfile.Size) et en faire une copie
    Set sfile = fso.GetFile("fichier_complet.txt")
    ' copie de sauvegarde avant traitement la précédente sauvegarde sera écrasée
    sfile.Copy "fichier_complet.bak"
    ' ouverture fichier source en lecture (format ascii)
    Set stream = sfile.OpenAsTextStream(1,0)
    ' lecture de la totalité du fichier source moins les 4 derniers caractères correspondant au trailer #end
    buffer = stream.Read(sfile.Size - 4)
    stream.Close
    ' ouverture en lecture du fichier contenant les données à ajouter (format ascii)
    Set dtastream = fso.OpenTextFile("ligne_a_ajouter.txt",1,False,0)
    ' création du nouveau fichier complet : le fichier source initial est écrasé d'où la sauvegarde préalable
    Set stream = fso.OpenTextFile("fichier_complet.txt",2,True,0)
    ' écriture du contenu initial sans le trailer #end
    stream.Write buffer
    ' écriture des données à ajouter
    stream.Write dtastream.ReadAll
    ' écriture du nouveau trailer #end
    stream.Write vbCrLf & "#end"
    stream.Close
    dtastream.Close
    ' en cas d'incident lors du traitement il suffit de renommer fichier_complet.bak en fichier_complet.txt
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  7. #7
    Candidat au Club
    j'ai tout compris !
    merci !

    Par contre je le lance seul, script direct, ça fonctionne.
    via un batch non, il démarre (création du bak) mouline et n'abouti pas ! (via "cscript.exe script.vbs")

    une idée ? Mémoire alloué par le batch? (rappel fichier >300Mo)

  8. #8
    Rédacteur

    Mémoire alloué par le batch? (rappel fichier >300Mo)
    c'est possible
    le fichier source original est-il conservé ou est-il écrasé et mis à zéro ?
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp