Copier plusieurs fichiers dans un seul fichier

cs_novice2008 Messages postés 7 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 5 août 2008 - 4 août 2008 à 15:01
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 5 août 2008 à 18:03
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

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
4 août 2008 à 16:29
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
0
cs_novice2008 Messages postés 7 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 5 août 2008
4 août 2008 à 17:11
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.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
4 août 2008 à 17:12
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...
0
cs_novice2008 Messages postés 7 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 5 août 2008
4 août 2008 à 17:23
"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
0

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

Posez votre question
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
4 août 2008 à 17:50
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...
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
4 août 2008 à 17:51
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...
0
cs_novice2008 Messages postés 7 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 5 août 2008
4 août 2008 à 18:07
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.
0
cs_novice2008 Messages postés 7 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 5 août 2008
4 août 2008 à 18:17
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? 
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
4 août 2008 à 18:36
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...
0
cs_novice2008 Messages postés 7 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 5 août 2008
4 août 2008 à 18:52
Ok merci à toi Buno
0
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
5 août 2008 à 00:45
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
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
5 août 2008 à 14:48
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
0
cs_novice2008 Messages postés 7 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 5 août 2008
5 août 2008 à 15:44
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.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
5 août 2008 à 15:57
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...
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
5 août 2008 à 16:10
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
0
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
5 août 2008 à 17:42
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
0
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
5 août 2008 à 17:44
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
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
5 août 2008 à 17:53
"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
0
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
5 août 2008 à 17:57
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
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
5 août 2008 à 18:03
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
0
Rejoignez-nous