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 -
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;
}
*****************************************************************************
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:
- Concaténation et ecriture dans chaque fichier
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
32 réponses
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
@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
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
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
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)
ou en tout cas j'arrive pas a adapter le truc a mes fichiers (yen a 150 par dossier)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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;
ç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;
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)
ç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;
Donc j'execute le aa.bat dans le dossier ou se trouve les fichiers
avec pour code :
Résultat :
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...
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)
est ce que ce script affiche bien les noms des fichiers:
@echo off
for %%f in (*.csv) do ( echo %%f)