Ce script permet de découper un fichier en plusieurs fichiers de x lignes.
Je l'utilise assez souvent lorsque que j'ai de nombreux enregistrements à insérer dans une base de données et que je suis limité à x enregistrements par insertion.
Source / Exemple :
'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&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 = 0
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", 2000))
'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"
Conclusion :
On passe le fichier à découper en paramètre du script (par un drag&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.
J'ai modifié le code de manière à pouvoir découper le fichier passé en paramètre en fichiers de plus de 65 536 lignes (passage de la conversion CInt en CLng).
Correction du 14/01/2004 :
J'ai remplacé le test : Do while Not oFileIn.AtEndOfLine
par : Do while Not oFileIn.AtEndOfStream
De cette manière, le fait d'avoir une ligne vide dans le fichier permet de continuer
le traitement jusqu'à la fin du fichier.
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.