Concaténation et ecriture dans chaque fichier

Fermé
Squalltrial Messages postés 98 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 - 29 juin 2009 à 15:50
dubcek Messages postés 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 - 2 juil. 2009 à 14:34
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;
}

*****************************************************************************

32 réponses

dubcek Messages postés 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
1 juil. 2009 à 11:12
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 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
1 juil. 2009 à 12:38
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 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
2 juil. 2009 à 11:48
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 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
2 juil. 2009 à 14:34
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 mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
29 juin 2009 à 17: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 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
29 juin 2009 à 17:14
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 mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
29 juin 2009 à 17:21
si tu peux m'apporter la solution en c je suis preneur
0
dubcek Messages postés 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
29 juin 2009 à 17:30
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 mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
29 juin 2009 à 17:33
oula lapin compris ça moa =)

je sais pas comment on exécute ça ^^
0
dubcek Messages postés 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
29 juin 2009 à 17:57
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 mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
1 juil. 2009 à 08:55
Interessant, mais comment le faire a partir d'un executable ?
0
dubcek Messages postés 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
1 juil. 2009 à 09:15
si c'est à partir d'un programme C, tu peux faire
system("\chemin\fichier.bat");
0
Squalltrial Messages postés 98 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
1 juil. 2009 à 10:08
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 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
1 juil. 2009 à 10:17
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 mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
1 juil. 2009 à 10:23
ah okay ! je test ça
0
Squalltrial Messages postés 98 Date d'inscription mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
1 juil. 2009 à 10:41
ça marche pas il me concatène les colonnes dans les fichiers suivant le premier
0
dubcek Messages postés 18589 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 21 mars 2023 5 584
1 juil. 2009 à 10:50
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 mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
1 juil. 2009 à 10:57
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 mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
1 juil. 2009 à 11:25
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 mardi 26 mai 2009 Statut Membre Dernière intervention 11 août 2009 10
1 juil. 2009 à 13:47
nan j'arrive pas a l utiliser :'(

je debute en batch
0