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 -
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;
}
*****************************************************************************
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
Suivant
-
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) -
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) -
essaye de changer cette ligne avec usebackq et des "":
for /f "usebackq delims=; tokens=1,*" %%a in ("%%f") do echo %%a;%%b%%f) -
DOS est très limité pour ce genre de manipulations mais on peut y arriver
-
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 =) -
hello
ca doit être fait en C ou bien cela peut-il se faire en DOS ? -
si tu peux m'apporter la solution en c je suis preneur
-
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 -
oula lapin compris ça moa =)
je sais pas comment on exécute ça ^^ -
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é -
Interessant, mais comment le faire a partir d'un executable ?
-
si c'est à partir d'un programme C, tu peux faire
system("\chemin\fichier.bat"); -
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 ? -
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
-
ah okay ! je test ça
-
ça marche pas il me concatène les colonnes dans les fichiers suivant le premier
-
est-ce que les champs sont séparés par un espace ou par ; ? Montre quelques exemples
-
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; -
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 ? -
nan j'arrive pas a l utiliser :'(
je debute en batch
- 1
- 2
Suivant