Concaténation et ecriture dans chaque fichier
dubcek Messages postés 18627 Date d'inscription Statut Contributeur Dernière intervention -
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
Le problème central est de concaténer des fichiers CSV (environ 150) en ajoutant une colonne indiquant le nom du fichier source et d’obtenir un fichier final consolidé. Plusieurs répondants proposent une solution en C++, qui concatène les fichiers en préservant l’entête et en insérant après chaque bloc le nom du fichier source. D’autres interventions évoquent des ajustements batch Windows (for /f, usebackq, delims), mais soulignent rapidement les limites de DOS pour gérer 150 fichiers et des noms potentiellement complexes. Des questions liées aux séparateurs CSV, à l’homogénéité des en-têtes et aux défis pratiques comme les espaces dans les noms de fichiers et l’intégration des colonnes de source.
-
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