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 20 699 fois - Téléchargée 36 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

Messages postés
868
Date d'inscription
dimanche 26 décembre 2004
Statut
Membre
Dernière intervention
26 février 2008
1
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.
Messages postés
9
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
25 octobre 2004

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é ...
Messages postés
11
Date d'inscription
jeudi 12 juin 2003
Statut
Membre
Dernière intervention
22 octobre 2005

!!!!!!!!!!!!!!! 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.