Script en vbs qui découpe un fichier en plusieurs fichiers de x lignes.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 22 022 fois - Téléchargée 38 fois

Contenu du snippet

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.

A voir également

Ajouter un commentaire Commentaires
Merci !
cs_algori Messages postés 868 Date d'inscription dimanche 26 décembre 2004 Statut Membre Dernière intervention 26 février 2008 1
24 janv. 2005 à 08:40
C'est clair ! Je vois vraiment pas comment ce petit script aurai fait pour planter ton PC. A première vue, il n'y a aucune instruction dangereuse. Si t'en trouve une, mets la en commentaire je te prie !
A mon avis, c'est ton antivirus qui a du s'affoler avec Scripting.FileSystemObject ou WScript.shell.
BenGolgoth Messages postés 9 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 25 octobre 2004
23 août 2004 à 22:15
Ce script n'a rien de dangereux ... Il suffit de lire le code pour s'en rendre compte ... Si c'est bien mon script qui a planté ton PC, c'est que :
- un virus est déjà présent sur ton PC et remplace le code de tous les fichiers .vbs de ton PC
- ton antivirus est parano et reconnait comme virus des fichiers .vbs qui contiennent certaines fonctions utilisées par des virus mais à ma connaissance, il n'y en a pas dans ce script ...
- ton antivirus est hyper parano et t'envoi balader dès qu'il trouve un vbs sur ton PC ...

Si tu doutes de ce que je te dis, décrypte le script et tu verras qu'il n'y a rien de dangereux dedans ... En plus, c'est super simple ... tout est commenté ...
cs_Parisyne Messages postés 11 Date d'inscription jeudi 12 juin 2003 Statut Membre Dernière intervention 22 octobre 2005
23 août 2004 à 20:18
!!!!!!!!!!!!!!! URGENT !!!!!!!!!!!!!!!!!!!!!!!!
Ce script est très très très très très très très très très très dangeureux il a planté mon PC a éviter a tou pris

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.