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
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
essaye de changer cette ligne avec usebackq et des "":
for /f "usebackq delims=; tokens=1,*" %%a in ("%%f") do echo %%a;%%b%%f)
1
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
DOS est très limité pour ce genre de manipulations mais on peut y arriver
1

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

Posez votre question
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
ca doit être fait en C ou bien cela peut-il se faire en DOS ?
0
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
si c'est à partir d'un programme C, tu peux faire
system("\chemin\fichier.bat");
0
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
Squalltrial Messages postés 98 Date d'inscription   Statut Membre Dernière intervention   10
 
ah okay ! je test ça
0
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
est-ce que les champs sont séparés par un espace ou par ; ? Montre quelques exemples
0
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
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
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