Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
Séparer un grand fichier txt en plusieurs petits fichiers
Auteur Message
Répondre en citant
Message Séparer un grand fichier txt en plusieurs petits fichiers 
Bonjour à tous !
Je suis novice avec le langage batch et j'ai quelques petits soucis...
Je dois créer plusieurs petits fichiers de tailles (nombre de lignes) variables à partir d'un fichier txt.
Les petits fichiers doivent contenir un paquet de ligne de texte, pouvant commencer par 5 phrases possible, et se terminant par END. et chaque fichier doit être au format premierelignedufichier.txt
J'ai essayé de me baser sur un sujet déjà existant mais je n'arrive pas à l'adapter car je traite ici des lettres et non des chiffres
Voilà ce que j'ai commencé à faire :

Code:
@Echo off
rem ------ Initialisation
set fichier_source=All NAV Objects Code Cronus.txt
set dossier_destination=%cd%\file
set chaine_delimitation_sections="End."
set chaine_recherche_file1="OBJECT Table"
set chaine_recherche_file2="OBJECT Form"
set chaine_recherche_file3="OBJECT Report"
set chaine_recherche_file4="OBJECT Dataport"
set chaine_recherche_file5="OBJECT XMLport"
 
setlocal enabledelayedexpansion
set i1=0
if not exist "%dossier_destination%" md "%dossier_destination%"
 
rem ------ Création du tableau
rem --- Boucle parcourant le fichier source
for /f "tokens=*" %%i in ('type "%fichier_source%"') do (
  rem --- recherche dans la ligne en cours la variable chaine_recherche_file1
   echo %%i|find %chaine_recherche_file1% >nul
  rem --- si recherche positive on fait
   if !errorlevel!==0 (
     rem --- on ajoute 1 a la variable i1
      set /a i1+=1
     rem --- on réinitialise la variable i2
      set i2=0
   )
   rem --- recherche dans la ligne en cours la variable chaine_recherche_file2
   echo %%i|find %chaine_recherche_file2% >nul
  rem --- si recherche positive on fait
   if !errorlevel!==0 (
     rem --- on ajoute 1 a la variable i1
      set /a i1+=1
     rem --- on réinitialise la variable i2
      set i2=0
   )
   rem --- recherche dans la ligne en cours la variable chaine_recherche_file3
   echo %%i|find %chaine_recherche_file3% >nul
  rem --- si recherche positive on fait
   if !errorlevel!==0 (
     rem --- on ajoute 1 a la variable i1
      set /a i1+=1
     rem --- on réinitialise la variable i2
      set i2=0
   )
   rem --- recherche dans la ligne en cours la variable chaine_recherche_file4
   echo %%i|find %chaine_recherche_file4% >nul
  rem --- si recherche positive on fait
   if !errorlevel!==0 (
     rem --- on ajoute 1 a la variable i1
      set /a i1+=1
     rem --- on réinitialise la variable i2
      set i2=0
   )
   rem --- recherche dans la ligne en cours la variable chaine_recherche_file5
   echo %%i|find %chaine_recherche_file5% >nul
  rem --- si recherche positive on fait
   if !errorlevel!==0 (
     rem --- on ajoute 1 a la variable i1
      set /a i1+=1
     rem --- on réinitialise la variable i2
      set i2=0
   )
)
 
rem ------ Création des fichiers
rem --- boucle parcourant les sections
for /l %%i in (0,1,%i1%) do (
  rem --- boucle parcourant les lignes de la section en cours
   for /l %%j in (1,1,!tab_%%i_nb!) do (
     rem --- écriture du contenu de la section en cours dans le fichier "[mois] [année].txt"
      echo.!tab_%%i_%%j!>>"%dossier_destination%\*.txt"
   )
)
 
pause


Est ce que vous pourriez m'aider? Je sais que je pars de loin mais même un micro indice pourrait beaucoup m'aider Smile
Merci d'avance !

Edit de darkbatcher : Pensez à [CODE]



Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message Séparer un grand fichier txt en plusieurs petits fichiers 
Salut Wink
Voici un petit exemple que vous pouvez peut-être le modifier pour vos besoins avec glisser et déposer le grand fichier sur le batch et il va le diviser suivant le nombre de lignes que vous avez préalablement définit dans le script avec la variable limit=5
Code:
@echo off
Title Splitting file by drag and drop by Hackoo 2018
SetLocal EnableDelayedExpansion
set limit=5
set file=%~1
set lineCounter=1
set filenameCounter=1
for %%a in (%file%) do (
    set "name=%%~na"
    set "extension=%%~xa"
)
Call :Delete_Old_Files
for /f "tokens=* delims=" %%a in ('Type "%file%"') do (
    set splitFile=!name!!filenameCounter!!extension!
   set /a lineCounter+=1
    if !lineCounter! gtr !limit! (
        set /a filenameCounter+=1
        set lineCounter=1
        echo Created !splitFile!
    )
    echo %%a>>!splitFile!
)
Pause>nul & Exit

:Delete_Old_Files
for /f "tokens=* delims=" %%a in ('Type "%file%"') do (
    set splitFile=!name!!filenameCounter!!extension!
   set /a filenameCounter+=1
   If exist !splitFile! Del !splitFile!
)
Set filenameCounter=1
Exit /b





______________________________________________________
Mes Contributions en Téléchargement
Répondre en citant
Message Séparer un grand fichier txt en plusieurs petits fichiers 
C'est pas très clair mais je crois que j'ai compris

Le fichier d'origine ressemble à ça :
Code:
OBJECT Table

... des lignes ...

End.

OBJECT Form

... des lignes ...

End.

OBJECT Report

... des lignes ...

End.

OBJECT Dataport

... des lignes ...

End.

OBJECT XMLport

... des lignes ...

End.



Fichier 1
Code:
OBJECT Table

... des lignes ...

End.


Fichier 2
Code:
OBJECT Form

... des lignes ...

End.


Fichier 3
Code:
OBJECT Report

... des lignes ...

End.


..etc..



Ce qu'on peut faire, c'est mettre en place une variable write et une variable nbfile
Et on peut imaginer un algorithme comme ça :

Citation:
WRITE = FALSE
NBFILE = 0

BOUCLE DE I = 1ere ligne du fichier A fin du fichier

    SI I CONTIENT le nom d'une section
    ALORS (

      WRITE = TRUE
      NBFILE++

    )

    SI WRITE == TRUE
    ALORS ON ECRIT I DANS "NBFILE.TXT"

    SI I CONTIENT "End."
    ALORS WRITE = FALSE

FIN BOUCLE



Cette algorithme nous permettra de séparer les différentes sections correctement
Donc si on l'écrit en batch, il ressemble à ceci :

Code:
@echo off
setlocal enabledelayedexpansion

set sourceFile=All NAV Objects Code Cronus.txt
set destinationFolder=file
set endSection=End.

set ListSections="OBJECT Table" "OBJECT Form" "OBJECT Report" "OBJECT Dataport" "OBJECT XMLport"


if not exist "%destinationFolder%" md "%destinationFolder%"

set write=false
set nbfile=0
for /f "tokens=*" %%i in ('type "%sourceFile%"') do (


    for %%j in (%ListSections%) do echo;%%~i|find "%%~j" >nul 2>&1 && (
        set write=true
        set /a nbfile+=1
        echo;Ecriture de la section "%%~j"
        type nul > "%destinationFolder%\!nbfile!.txt"
    )
 

    if "!write!"=="true" (
        echo;%%~i
    )>> "%destinationFolder%\!nbfile!.txt"


    echo;%%~i|find "%endSection%" >nul 2>&1 && (
        set write=false
    )

)

echo;&echo;End^^!
pause>nul&exit





______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message Séparer un grand fichier txt en plusieurs petits fichiers 
Oui c'est exactement cela merci beaucoup ! Je n'arrivai pas à écrire une boucle à plusieurs solutions...
Si je veux mettre en titre de fichier la première ligne de celui ci est ce que vous pensez que c'est mieux de créer un tableau ou de faire un nouveau code?
Une dernière question (je suis vraiment confuse) mais quand je lance la commande j'obtiens plusieurs lignes de :
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
Comment y remédier ?
Merci beaucoup en tout cas pour votre réponse claire et rapide !



Répondre en citant
Message Séparer un grand fichier txt en plusieurs petits fichiers 
Louise a écrit:
Si je veux mettre en titre de fichier la première ligne de celui ci est ce que vous pensez que c'est mieux de créer un tableau ou de faire un nouveau code?


Pour ça, il suffit de rajouter une simple variable (que l'on nommera nbLine) qui s'incrémentera à chaque tour (comme chaque tour dans la boucle correspond à une ligne du fichier, on aura comme ça le nombre de ligne)
Donc il suffit de modifier légèrement notre algo :

Citation:
WRITE = FALSE
FILENAME = 0
NBLINE = 1

BOUCLE DE I = 1ere ligne du fichier A fin du fichier

    SI I CONTIENT le nom d'une section
    ALORS (

      WRITE = TRUE
      FILENAME = NBLINE.txt

    )

    SI WRITE == TRUE
    ALORS ON ECRIT I DANS "FILENAME"

    SI I CONTIENT "End."
    ALORS WRITE = FALSE

    NBLINE++


FIN BOUCLE



Louise a écrit:
Une dernière question (je suis vraiment confuse) mais quand je lance la commande j'obtiens plusieurs lignes de :
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
> était inattendu.
Comment y remédier ?
Merci beaucoup en tout cas pour votre réponse claire et rapide !


Le batch gère très mal les chaînes de caractères c'est-à-dire que lorsque qu'il rencontre des caractères spéciaux (propre au batch) ça modifie la chaîne et peut provoquer de grosses erreurs.
Plus d'info ici : http://www.robvanderwoude.com/escapechars.php

Donc le mieux c'est de récrire l'algorithme dans un autre langage comme le JScript ou le VBScript (intégré à Windows depuis Windows xp)

Voici l'algorithme commenté :
(tel quel il ne sert à rien, c'est juste pour expliquer comment il marche)
Code:
[lang=javascript]
//On regarde si le nombre d'arguments est correcte, il en faut minimum 4 pour que ça marche
if (WScript.arguments.length > 3) {

    //On récupère l'activeX Scripting.FileSystemObject, il nous permet de gérer le système de fichiers (écriture, lecture...)
    var fso = new ActiveXObject("Scripting.FileSystemObject");

    //On ouvre le fichier WScript.arguments(0) qui correspond à "All NAV Objects Code Cronus.txt"
    var sourceFile = fso.OpenTextFile(WScript.arguments(0),1);

    //On lit tout le contenu
    var content = sourceFile.AtEndOfStream ? "" : sourceFile.ReadAll();

    //On ferme le fichier, c'est très important
    sourceFile.Close();

    //Pour mieux comprendre à quoi correspondent les arguments, on les met dans des variables
    var folderDestination = WScript.arguments(1); //Contient "file"
    var endSection = WScript.arguments(2); //Contient "End."

    //On Split le contenu du fichier avec le caractère '\n', ça permet de se retrouver avec un tableau qui contient tout le fichier ligne par ligne
    content = content.replace(/\r/g,'').split('\n');

    //Cette variable contiendra le nom de nos fichiers (avec le format numérolignesection.txt)
    var filePath = "";

    //Et là on met en place notre algorithme en le modifiant très légèrement
    var write = false;

    for (var i = 0; i < content.length; i++) {

        //Si la ligne contient le nom d'une section, on met write à true (Début de la section à récupérer)
        for (var j = 3; j < WScript.arguments.length; j++) {
            if (content[i].replace(WScript.arguments(j),'')!=content[i]) {
                write = true;

                filePath = folderDestination+"\\"+(i+1)+".txt";

                //On créé le fichier filePath s'il n'existe pas
                if (!fso.FolderExists(fso.GetParentFolderName(filePath))) fso.CreateFolder(fso.GetParentFolderName(filePath));
                fso.CreateTextFile(filePath, true);

            }
        }

        //On ajoute le contenu de la section dans le fichier filePath
        if (write) {
          var file = fso.OpenTextFile(filePath,8);
          file.writeLine(content[i]);
          file.close();
        }

        //Si la ligne contient le contenu endSection, on met write à false (Fin de la section à récupérer)
        if (content[i].replace(endSection,'')!=content[i]) write = false;
    }

}


Maintenant on l'intègre dans notre batch :
Code:
@echo off
setlocal enabledelayedexpansion

set sourceFile=All NAV Objects Code Cronus.txt
set destinationFolder=file
set endSection=End.

set ListSections="OBJECT Table" "OBJECT Form" "OBJECT Report" "OBJECT Dataport" "OBJECT XMLport"


call :Split "%sourceFile%" "%destinationFolder%" "%endSection%" %ListSections%


echo;&echo;End^^!
pause>nul&exit


:Split
(
    echo;if^(WScript.arguments.length^>3^){var fso=new ActiveXObject^("Scripting.FileSystemObject"^),sourceFile=fso.OpenTextFile^(WScript.arguments^(0^),1^),content=sourceFile.AtEndOfStream?"":sourceFile.ReadAll^(^);sourceFile.Close^(^);var folderDestination=WScript.arguments^(1^),endSection=WScript.arguments^(2^);content=content.replace^(/\r/g,""^).split^("\n"^);for^(var filePath="",write=^^!1,i=0;i^<content.length;i++^){for^(var j=3;j^<WScript.arguments.length;j++^){if^(content[i].replace^(WScript.arguments^(j^),""^)^^!=content[i]^){write=^^!0,filePath=folderDestination+"\\"+^(i+1^)+".txt";WScript.Echo^('Ecriture de la section "'+WScript.arguments^(j^)+'"'^);if^(^^!fso.FolderExists^(fso.GetParentFolderName^(filePath^)^)^)fso.CreateFolder^(fso.GetParentFolderName^(filePath^)^);fso.CreateTextFile^(filePath,^^!0^);}}if^(write^){var file=fso.OpenTextFile^(filePath,8^);file.writeLine^(content[i]^);file.close^(^)}content[i].replace^(endSection,""^)^^!=content[i]^&^&^(write=^^!1^)}}
)> "%temp%\tmp.js"
cscript //nologo "%temp%\tmp.js" %*
Exit /b !errorlevel!


Et voilà plus de problèmes de caractères Okay




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message Séparer un grand fichier txt en plusieurs petits fichiers 
Merci beaucoup pour votre réponse détaillée ! L'insertion du java script pose soucis mais je vais essayer de trouver le problème
Je vais donc le faire en JScript Smile



Répondre en citant
Message Séparer un grand fichier txt en plusieurs petits fichiers 
Louise a écrit:
Merci beaucoup pour votre réponse détaillée ! L'insertion du java script pose soucis mais je vais essayer de trouver le problème
Je vais donc le faire en JScript Smile


C'est déjà du JScript pas besoin de t'embêter Wink
Normalement il marche juste en exécutant le code batch que je t'ai mis (avec le JScript dedans)




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Message Séparer un grand fichier txt en plusieurs petits fichiers 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch