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 86 87 88 89 90 91 92 93 94 95
| 'Copyright BenGolgoth
'Script qui permet de découper un fichier en plusieurs fichiers de x lignes.
'Utilisation :
' On passe le fichier à découper en paramètre du script (par un drag and drop)
' Le script demande alors à l'utilisateur le nombre de lignes qu'il veut par fichier et
' s'il y a des en-têtes (l'en-tête ne peut faire qu'une ligne).
' Le traitement est terminé une fois que le message de fin de traitement est apparu.
' Les fichiers créés ont le même nom que le fichier passé en paramètre sauf qu'ils ont
' un numéro juste avant l'extension.
'Constantes pour l'utilisation des fichiers
Const ForReading = 1, ForWriting = 2, SFSO = "Scripting.FileSystemObject", WSS = "Wscript.Shell"
'Variables object pour les fichiers
Dim oFSO, oFileIn, oFileOut
'Numéro du fichier courant, Numéro de la ligne courante, Nombre de ligne du fichier en entrée
Dim iCurrentFile, iCurrentLine, iNbLine
'En-tête du fichier en entrée, Paramètres du script, Fichier en entrée passé en paramètre, Fichier en sortie
Dim sHeader, sArg, sFileIn, sFileOut
'Booleen qui va me permettre de savoir si le fichier contient un en-tête ou non
Dim bHeader
'Initialisation des variables
Set oFSO = Wscript.CreateObject(SFSO)
iCurrentFile = 1
iCurrentLine = 1
'On récupère les arguments
Set sArg = WScript.Arguments
'Il n'y a qu'un argument, c'est le fichier en entrée.
'S'il y en a d'autres, on affiche un message d'erreur et on sort du script.
If sArg.Count <> 1 Then
MsgBox "Veuillez passer en paramètre le fichier à découper."
WScript.Quit
End If
'On récupère le premier (et unique) argument.
sFileIn = sArg(0)
'On demande à l'utilisateur le nombre de lignes qu'il désire dans ses fichiers de sortie
iNbLine = CLng(InputBox("Entrez le nombre de lignes de chaque fichier de sortie :", "CutFile",1000))
'On demande à l'utilisateur s'il y a un en-tête sur la première ligne du fichier en entrée à
'reproduire dans les fichiers en sortie (des titres de colonnes par exemple)
bHeader = MsgBox("Le fichier passé en paramètre contient-il un en-tête à reproduire dans les fichiers de sortie ?", vbYesNo, "CutFile")
'Ouverture du fichier à découper
Set oFileIn = oFSO.OpenTextFile(sFileIn, ForReading, True)
'On récupère l'en-tête du fichier s'il y a besoin
If bHeader = vbYes Then sHeader = oFileIn.ReadLine
'Ouverture du premier fichier de résultat
Set oFileOut = oFSO.OpenTextFile(oFSO.GetParentFolderName(sFileIn) & "\\" & oFSO.GetBaseName(sFileIn) & iCurrentFile & "." & oFSO.GetExtensionName(sFileIn), ForWriting, True)
'On affiche l'en-tête s'il y a besoin
If bHeader = vbYes Then oFileOut.WriteLine sHeader
'Tant qu'on n'arrive pas à la fin du fichier en entrée
Do While Not oFileIn.AtEndOfStream
'On copie la ligne en cours du fichier en entrée dans le fichier de sortie en cours
oFileOut.WriteLine oFileIn.ReadLine
'Si on arrive au nombre de lignes sélectionné par l'utilisateur, on ferme le fichier
'de sortie et on ouvre le suivant
If iCurrentLine = iNbLine Then
iCurrentLine = 0
oFileOut.Close
iCurrentFile = iCurrentFile + 1
Set oFileOut = oFSO.OpenTextFile(oFSO.GetParentFolderName(sFileIn) & "\\" & oFSO.GetBaseName(sFileIn) & iCurrentFile & "." & oFSO.GetExtensionName(sFileIn), ForWriting, True)
'On affiche l'en-tête dans le nouveau fichier de sortie s'il y besoin
If bHeader = vbYes Then oFileOut.WriteLine sHeader
End If
'On passe à la ligne suivante
iCurrentLine = iCurrentLine + 1
Loop
'On ferme tous les fichiers
oFileOut.Close
oFileIn.Close
'On libère la mémoire
Set oFileIn = Nothing
Set oFileOut = Nothing
Set oFSO = Nothing
MsgBox "Traitement terminé", vbOkOnly ,"CutFile" |
Partager