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
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)
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)
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)
$ 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)
essaye de changer cette ligne avec usebackq et des "":
for /f "usebackq delims=; tokens=1,*" %%a in ("%%f") do echo %%a;%%b%%f)
for /f "usebackq delims=; tokens=1,*" %%a in ("%%f") do echo %%a;%%b%%f)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 =)
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 =)
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
$ 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
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é
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é
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 ?
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 ?
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
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;
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;
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 ?
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 ?