Concaténation et ecriture dans chaque fichier

Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18789 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;
}

*****************************************************************************
A voir également:

32 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
dans le dossier qui contient les csv, tu crées un fichier aa.bat dans lequel tu mets
@echo off
for %%f in (*.csv) do (
for /f "delims=; tokens=1,*" %%a in (%%f) do echo %%a;%%b;%%f)

et tu l'exécutes en sauvant le résultat:
aa > total.csv
0
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
Salut,

merci de t'acharner avec moi =)

mais je n'y arrive pas j'ai mi le aa.bat avec le code dans le dossier qui contient les fichiers a ecrire

mais ça ne marche pas je comprend pas l'utilité de l'autre .bat
0
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
hop hop hop

ça marche !!!

merci a toi !!!!
0
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
Bon ça marche sur les fichiers de test mais pas pour un cas global

ou en tout cas j'arrive pas a adapter le truc a mes fichiers (yen a 150 par dossier)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
quelle différence de format y a-t-il entre les fichiers de test et les autres ?
0
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
Salut,

ça me dit que le syteme n'as pas pu trouver le fichier....

et dans l'en tete ya des espace regarde par exemple un fichier

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 en ligne

0001;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
les espaces n'ont pas d'importance puisque on a défini ; comme séparateur
ça me dit que le syteme n'as pas pu trouver le fichier....
quelle commande dit ça ?

puisqu'il y a un ; à la fin de la ligne, il faut modifier : do echo %%a;%%b%%f)
$ aa
0001;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;f1.txt
0001;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;f1.txt
9999;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;f2.txt
9999;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;f2.txt

$ type f1.txt f2.txt
f1.txt
0001;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;
0001;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;
f2.txt
9999;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;
9999;GUIP;Raymond;H;AG.CONST.PPAL.1CL.SU;D.o.d paris echelon;NULL;0;NULL;NULL;3;0;
0
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
heu au final ça fait quoi comme code je suis paumé là xD
0
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
Donc j'execute le aa.bat dans le dossier ou se trouve les fichiers

avec pour code :

@echo off
for %%f in (*.csv) do (
for /f "delims=; tokens=1,*" %%a in (%%f) do echo %%a;%%b;%%f) 

PAUSE


Résultat :

Le système ne peut trouver le fichier AgentsAmiens_csd-Société.
Le système ne peut trouver le fichier AgentsAngers_div.-Société.
Le système ne peut trouver le fichier AgentsAnnemasse_div.-Société.
etc..
etc.. pour tout les fichiers
Le système ne peut trouver le fichier AgentsToulouse_div.-Société.
Le système ne peut trouver le fichier AgentsValence_div.-Société.
Appuyez sur une touche pour continuer...
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
y a-t-il des espaces dans les noms des fichiers ?
est ce que ce script affiche bien les noms des fichiers:
@echo off
for %%f in (*.csv) do ( echo %%f)
0
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
Pas d'espace dans les noms de fichiers.

et ce dernier script affiche bien les noms de fichiers oui
0
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
Okay impeccable ça marche niquel !

Merci beaucoup de ton coup de main j'ai beaucoup appris avec cette manip !
0