Copier plusieurs fichiers dans un seul fichier

Signaler
Messages postés
7
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2008
-
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Bonjour à tous !

J'ai un problème avec des fichiers de données : comme je les importe sur excel et que l'asssistant d'importation me demande de recréer les colonnes pour chaque fichier, je voudrais copier tous mes fichiers textes dans le même fichier les uns à la suite des autres.

Je comptais réaliser cela en langage C, seul langage que je connaisse un peu. Mais je ne vois pas comment faire.
L'idéal serait que je lui donne le nom/chemin de dossier (en paramètre, par exemple) et qu'il prenne chaque fichier et le copie dans le nouveau fichier, en mettant les fichiers copiés les uns à la suite des autres dans le nouveau fichier.

Merci à tous ceux qui pourront m'aider.

20 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
18
Flooder ne sert à rien, ce n'est pas parce que tu vas poster 4 fois le même message que tu vas avoir des réponses à la limite ça à plutôt tendance à agacer les membres.
Cdt
Messages postés
7
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2008

Je suis désolé, là n'était pas mon intention. Mais je ne connais pas ce site et je pensais que poster un message dans un forum qui n'avait pas de rapport avec ce dernier me priverait de réponses.
Or je ne savais pas trop dans quel thème / forum classer mon problème. Je l'ai donc poster aux endroits qui me semblaient être le plus en rapport.
Messages postés
14934
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 janvier 2021
93
Salut,
Et ben..."yapluka"
Faut bien connaitre le format de tes fichiers (csv peut-être?), récupérer dans le 1er fichier le noms des colonnes (et les sauter dans les autres fichiers) et concaténer les données...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
7
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2008

"concaténer"? Je ne vois pas de quoi il s'agit.

Non ce ne sont pas des fichiers ".csv". Il s'agit de fichiers ".TCK". En fait ce sont des fichiers textes qui réprésentent, sur chaque ligne, des tickets de téléphonie.

Bref, je veux étudier l'historique d'un standard téléphonique sur un an. Pour cela, j'ai besoin d'avoir ces fichiers sur excel. Un fichier ".TCK" = un jour (généré par un logiciel de supervision). Je voudrais, pour permettre un traitement des données, copier tous ces fichiers à la suite dans le même fichier.

Mais je ne me vois pas faire 365 fois un "copier coller" sans compter que je dois mettre en place une méthode de traitement "simple" de ces fichiers pour des gens qui n'y connaissent rien.

D'où l'idée d'un programme en langage C à qui je ne donnerais que l'adresse d'un dossier et qui ferait tout le travail.

Merci
Messages postés
14934
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 janvier 2021
93
J'avais compris l'idée.
C'est quoi qui bloque exactement:
- parcours de fichiers dans un dossier? FindFirstFile(), FindNextFile()
- ouverture de fichier? CreateFile()
- lecture/écriture de fichiers? fread()/fwrite() ou bien utilisation des fstreams

Est-ce que le format TCK est facilement compréhensible? Est-ce que tu sais comment sont stockées les informations?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
14934
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 janvier 2021
93
Ah..et inutile de cliquer tout le temps sur "Réponse acceptée": ce bouton sert à valider la réponse au problème...que tu n'as pas eu jusqu'à présent

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
7
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2008

Je vais essayer comme cela. Je ne connaissais pas ces fonctions. Je ne connaissais que fopen et fclose, fscanf et fprintf pour la manipulation de fichiers.

Mais est ce que avec fread(), il lira tous le fichier en stockant contenu et mise en forme(retour à la ligne et sauts de lignes prinicpalement)?

Si c'est le cas, je n'aurais plus qu'à faire du fwrite() dans le fichier unique?

Ou alors, faudra t-il que je fasse réécrire ligne par ligne?

J'ai réussi à comprendre le format TCK petit à petit mais au début c'était très compliqué.

Merci de ton aide car, comme tu peux le constater, mes notions en C sont très (très) basiques.
Messages postés
7
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2008

Ah oui une autre petite question.

Dans le "main" du programme, je mets en paramètre directement un pointeur sur caractère? Ce dernier sera t-il à même de contenir un chemin d'accès vers un dossier?

Et si je veux faire une boucle "for" qui parcourt le dossier, fichier après fichier, en faisant à chaque fois FindNextFile, il faut que je sache combien il y a de fichiers dans le dossier, n'est ce pas? Donc ne faut il pas, au préalable, compter le nombre d'éléments du dossier? 
Messages postés
14934
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 janvier 2021
93
Tu peux faire ce que tu veux avec fread()
"un pointeur sur caractères"? Tu veux parler d'une char*? Dans ce cas, oui.
Pour l'utilisation de FindNextFile(), pas besoin de connaitre le nombre de fichiers à traiter. Cherches sur le site, tu trouveras des exemples.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
7
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2008

Ok merci à toi Buno
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
6
Essaye ça :
#include
#include <fstream>
using namespace std;

ofstream fichiers;
bool Fichier(char* ChaineFichierAOuvrir)
{
    ifstream fichiero(ChaineFichierAOuvrir, ios::in|ios::binary);
    if (!fichiero)
        return false;

    fichiero.seekg (0, ios::end);
    int length = fichiero.tellg();
    fichiero.seekg (0, ios::beg);

    char BUFFER[4096];
    for (int i=0;i<length&&!fichiero.eof();i+=4096)
    {
        fichiero.read(BUFFER, (length-i>4096)?4096:(length-i));
        fichiers.write(BUFFER, (length-i>4096)?4096:(length-i));
    }
    fichiero.close();
    return true;
}

bool Init(char* ChaineFichierSortie)
{
    fichiers.open(ChaineFichierSortie, ios::out|ios::binary);
    if (!fichiers)
        return false;
    return true;
}

void Fin()
{
    fichiers.close();
}

int main()
{
    char Temp[4096];
    cout << "Entrez le chemin du fichier de sortie : ";
    cin.getline(Temp, 4096);
    if (!Init(Temp))
        return -1;
    do
    {
        cout << "Entrez le chemin d'un fichier a ajouter : ";
        cin.getline(Temp, 4096);
        if (!Fichier(Temp))
            return -1;
    }
    while(Temp[0]!=0);
    Fin();
    return 0;
}

http://www.victorlogiciels.com
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Avec les APIs:

#define BUFFER_SIZE (0x100000) // 1mo
DWORD __stdcall ConcatAllFile(LPSTR lpszDirectory, LPSTR lpszOutFile)
{
HANDLE hInFile, hOutFile, hFind;
WIN32_FIND_DATA wFindData;
LPSTR lptr, lpsrc, lpdst;
char szFile[MAX_PATH+4];
BYTE* lpBuffer;
DWORD dwRet = 1, br, bw;
lpBuffer = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, BUFFER_SIZE);
if(!lpBuffer) return 1;
hOutFile = CreateFile(lpszOutFile, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
if(hOutFile == INVALID_HANDLE_VALUE) goto _Error;
SetFilePointer(hOutFile, 0, 0, FILE_END);
lptr = szFile;
while(*lpszDirectory) *lptr++ = *lpszDirectory++;
if(*(lptr-1) != '\\')
{
*((DWORD*) lptr) = '*.*\\';
*(lptr+4) = 0;
lptr++;
}else *((DWORD*) lptr) = '\0*.*';
hFind = FindFirstFile(szFile, &wFindData);
if(hFind == INVALID_HANDLE_VALUE) goto _Error;
do
{
if(wFindData.nFileSizeLow)
{
lpsrc = wFindData.cFileName;
lpdst = lptr;
while(*lpsrc) *lpdst++ = *lpsrc++;
*lpdst = 0;
hInFile = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if(hInFile == INVALID_HANDLE_VALUE) goto _Error;
while(1)
{
if(!ReadFile(hInFile, lpBuffer, BUFFER_SIZE, &br, 0)) goto _Error;
if(!br) break;
if(!WriteFile(hOutFile, lpBuffer, br, &bw, 0)) goto _Error;
}
CloseHandle(hInFile);
}
}while(FindNextFile(hFind, &wFindData));
dwRet = 0;
_Error:
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpBuffer);
if(hFind) FindClose(hFind);
if(hOutFile) CloseHandle(hOutFile);
if(hInFile) CloseHandle(hInFile);
return dwRet;
}

int main(void)
{
DWORD r;
r = ConcatAllFile("C:\\Users\\Mes Documents", "C:\\MesDocs.bin");
if(!r) printf("Pas d'erreur\n");
else printf("Erreur\n");
system("PAUSE");
return 0;
}

Neo_Fr
Messages postés
7
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
5 août 2008

Merci aux deux personnes qui m'ont fourni ces codes (Neo_Fr et victorcoasne).

Mais quelle est la différence entre les deux?

Et que veut dire "avec les APIs" dans le second code?

De plus, victorcoasne, j'ai l'impression que dans ton code une boucle me demandera à chaque fois le nom du fichier. Or il faudrait que je donne le nom du dossier qui contient ces fichiers.

Enfin, quel compilateur puis-je utiliser sur notepad ++? Car c'est la première fois que je fais du C sur windows, d'habitude à l'école je suis sur unix.

Merci encore.
Messages postés
14934
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 janvier 2021
93
Hello,
Les différences entre les 2:
- dans le 1er: traitement d'un fichier spécifié par l'utilisateur, code en C++ pur
- dans le 2nd: traitement sur un dossier, code en C++ avec "API Win32" (avec des fonctions Windows quoi)

Quel compilateur sous Windows? Je te conseille Visual Studio Express (dispo en téléchargement gratuit). Il y a aussi DevCPP qui est utilisé par les membres de CodeS-SourceS (gratuit également). Après, à toi de voir, suivant ton feeling...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Une precision tt de meme, le fait de coder directement avec les apis permet de gagner en vitesse, autre precision le code que j'ai poster plus haut est codé en pur C mais tu peut bien entendu l'utiliser dans un projet en C++..

Neo_Fr
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
6
Bonjour,

Mon code est en C++ standard donc compatible Linux.
J'utilise Dev-C++ pour le compiler, ne prend pas Microsoft (c'est le mal )

Merci et bonne prog,
@++

Victorhttp://www.victorlogiciels.com
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
6
Bonjour,

J'ai oublié de répondre à ta question.
Oui il te demande fichier par fichier.
Pour faire un listing faut utiliser les API Windows et dans ce cas cela ne marche plus sous Linux.

Merci et bonne prog,
@++

Victorhttp://www.victorlogiciels.com
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
"Mon code est en C++ standard donc compatible Linux."
"Pour faire un listing faut utiliser les API Windows et dans ce cas cela ne marche plus sous Linux."

Ca tombe bien il a préciser qu'il travaillait sous Windows.

Pour ce qui est de l'IDE il est vrai que si tu debute DevCpp est plus facile a prendre en main, maintenant si tu cherche un compilateur qui produit du code optimisé fodra se tourner vers VC++

Neo_Fr
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
6
Bonjour,

Oui mais rien n'empêche de faire un listing en API et de lire en standard.

En plus pour un utilitaire qui ne sert que pour assembler des fichiers une fois...

Merci et bonne prog,
@++

Victorhttp://www.victorlogiciels.com
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Le truc c'est que t'en qu'a coder une partie en api (et donc rendre le code incompatible avec un autre os que windows), autant coder entierement avec les apis, tu y gagnera en perf..

Neo_Fr