Concaténation et ecriture dans chaque fichier

Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Alors voila le but de mon exercice :

Je dois concaténer des fichiers .CSV (environ 150) ça , ça va.
Je voudrais rajouter comme option que lors de ma concaténation mon programme rajoute une colonne

Exemple :

***Fichier1***
L1C1 L1C2 L1C3
L2C1 L2C2 L2C3
************

***Fichier2***
L1C1 L1C2 L1C3
L2C1 L2C2 L2C3
************

Il faudrait que ça fasse :

*****Fichier_final*****
L1C1 L1C2 L1C3 Fichier 1
L2C1 L2C2 L2C3 Fichier 1
L1C1 L1C2 L1C3 Fichier 2
L2C1 L2C2 L2C3 Fichier 2
******************

Le code :

*****************************************************************************

#include <string>
#include <fstream>
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <vector>

using namespace std;

#define OK 1
#define KO 0

string DIR = "fichiers/";
string fichier_sortie = "full.csv";

vector<string> VecteurFichiers(string path);
int SupprimerLigne(int numero, string path);
int ConcatenerTout(vector<string> allfile);

int main()
{
vector<string> fichiers;
int i;

//récupère le nom des fichiers
fichiers = VecteurFichiers(DIR+"*");

//on commence à 1 car on ignore le 1er pour garder l'entete
for ( i=1 ; i != fichiers.size( ) ; i++ )
if(SupprimerLigne(0, fichiers.at(i)))
cout << "La ligne 0 a bien ete supprimee du fichier" << i+1 << " : " << fichiers.at(i) << endl;

//on concatène le tout
if(ConcatenerTout(fichiers))
cout << "\nConcatenation reussie !" << endl;
cout << "\n****** Vous avez concatene " << i << "fichiers ******" << endl;

//fin
cout << endl << endl << "Appuyez sur 'Entree' pour quitter ";
getchar();
}

/* Récupère les noms de fichiers du dossier DIR */
vector<string> VecteurFichiers(string path)
{
vector<string> tableauRetour;

HANDLE fich;
WIN32_FIND_DATA fichinfo;

bool boucle = true;

fich = FindFirstFile(path.c_str(),&fichinfo);
if(strcmp(fichinfo.cFileName,".")!=0 && strcmp(fichinfo.cFileName,"..")!=0)
tableauRetour.push_back(fichinfo.cFileName);

while (boucle)
{
if(strcmp(fichinfo.cFileName,".")!=0 && strcmp(fichinfo.cFileName,"..")!=0)
tableauRetour.push_back(DIR+fichinfo.cFileName);

if (!FindNextFile(fich,&fichinfo))
boucle = false;
}
FindClose(fich);

return tableauRetour;
}

/* Supprime la ligne d'un fichier et le réecris*/
int SupprimerLigne(int numero, string path)
{
int i = 0;
vector<string> content;
ifstream fichier(path.c_str());
if (fichier)
{
string ligne;
while (getline( fichier, ligne))
{
if(i!=numero) content.push_back(ligne);
i++;
}
}
else cout << "erreur";

ofstream newFile(path.c_str());
for (i=0; i!= content.size(); i++)
{
newFile << content.at(i) << endl;
if(!newFile){
cout << "Impossible d'écrire la ligne "<< content.at(i) << endl;
return KO;
}

}

return OK;
}

/* Concatène tous les fichiers en un seul ayant comme nom celui dans la variable fichier_sortie */
int ConcatenerTout(vector<string> allfile)
{
ofstream finalFile(fichier_sortie.c_str());
int i;
for (i=0; i!= allfile.size(); i++)
{
ifstream fichier(allfile.at(i).c_str());
if (fichier)
{
string ligne;
while (getline( fichier, ligne))
{
finalFile << ligne << endl;
if(!finalFile){
cout << "Impossible d'écrire la ligne "<< ligne << endl;
return KO;
}
}
}
}
return OK;
}

*****************************************************************************
Configuration: Windows XP
Firefox 3.0.11

32 réponses

  • 1
  • 2
  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    alors change cette ligne
    for /f "tokens=1,*" %%a in (%%f) do echo %%a %%b %%f)
    par
    for /f "delims=; tokens=1,*" %%a in (%%f) do echo %%a;%%b;%%f)
    1
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    qu'est ce qui merdouille ?
    $ type f*.txt

    f1.txt
    L1C1;L1C2;L1C3
    L2C1;L2C2;L2C3

    f2.txt
    L1C1;L1C2;L1C3
    L2C1;L2C2;L2C3

    $ aa
    L1C1;L1C2;L1C3;f1.txt
    L2C1;L2C2;L2C3;f1.txt
    L1C1;L1C2;L1C3;f2.txt
    L2C1;L2C2;L2C3;f2.txt

    $ type aa.bat
    @echo off
    for %%f in (f?.txt) do (
    for /f "delims=; tokens=1,*" %%a in (%%f) do echo %%a;%%b;%%f)
    1
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    essaye de changer cette ligne avec usebackq et des "":
    for /f "usebackq delims=; tokens=1,*" %%a in ("%%f") do echo %%a;%%b%%f)
    1
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    DOS est très limité pour ce genre de manipulations mais on peut y arriver
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    bon finalement je vais laisse le code comme il est

    je vais faire un autre programme qui ajouté des colonnes a une liste de fichiers

    Merci pour ceux qui m'auront lu, au pire si vous avez une solution pour ce que je veux faire dites le moi =)
    0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    ca doit être fait en C ou bien cela peut-il se faire en DOS ?
    0
  8. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    si tu peux m'apporter la solution en c je suis preneur
    0
  9. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    j'ai une solution en DOS
    $ type f?.csv
    f1.csv
    L1C1 L1C2 L1C3
    L2C1 L2C2 L2C3
    f2.csv
    L1C1 L1C2 L1C3
    L2C1 L2C2 L2C3
    $ type aa.bat
    @echo off
    for %%f in (f?.csv) do (
    for /f "tokens=1,*" %%a in (%%f) do echo %%a %%b %%f)
    $ aa
    L1C1 L1C2 L1C3 f1.csv
    L2C1 L2C2 L2C3 f1.csv
    L1C1 L1C2 L1C3 f2.csv
    L2C1 L2C2 L2C3 f2.csv
    0
  10. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    oula lapin compris ça moa =)

    je sais pas comment on exécute ça ^^
    0
  11. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    démarrer -> exécuter : cmd
    pour ouvrir une fenetre DOS
    aller dans le dossier ou se trouvent les csv
    cd dossier
    créer un fichier .bat avec le code que j'ai indiqué
    0
  12. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    Interessant, mais comment le faire a partir d'un executable ?
    0
  13. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    si c'est à partir d'un programme C, tu peux faire
    system("\chemin\fichier.bat");
    0
  14. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    Salut,

    Merci de tes réponses déjà !

    Un truc que je ne comprend pas trop c'est comment ton batch fonctionne ?

    Mes nom de fichiers n'ont pas de formalisme, c'est a dire que les nom de fichiers n'ont pas le meme nom et son au nombre de 150

    or là, il est conçu pour 2 fichiers només sous le meme formalisme ?
    0
  15. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    j'ai utilisé f?.csv pour le test avec f1.csv et f2.csv , mais tu peux utiliser *.csv pour utiliser tous les fichiers csv présent dans le répertoire
    0
  16. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    ah okay ! je test ça
    0
  17. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    ça marche pas il me concatène les colonnes dans les fichiers suivant le premier
    0
  18. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    est-ce que les champs sont séparés par un espace ou par ; ? Montre quelques exemples
    0
  19. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    voila l'en-tete de chaque fichiers

    Matricule ; Nom ; Prénom ; Sexe ; Grade ; Nom du service ; Rue du service ; CP du service ; Ville du service ; Tél du service ; Nb articles ; MutationCmd ; Observations

    Et voila une ligne :

    6969;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;NULL;NULL;0;NULL;NULL;3;0;
    0
  20. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    oula nan ça merdouille ^^

    Bon on va essayer de tourner le probleme autrement

    On admet qu'on fasse une lecture linéaire dans un répertoire donné

    Il faudrait que, a la premiere ligne de ce fichier, c'est a dire l'entete, le programme ecrive ; Num_fichier
    et que au ligne suivantes il mettre le numéro de la boucle avec un for i =1 to X

    nan ?
    0
  21. Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
     
    nan j'arrive pas a l utiliser :'(

    je debute en batch
    0
  • 1
  • 2