Sélectionner une colonne de données à partir d'un fichier TXT

Sélectionner une colonne de données à partir d'un fichier TXT - C++ - Programmation

Marsh Posté le 22-02-2008 à 15:10:35    

Bonjour à tous,
 
J'ai 2 question à vous poser afin de pouvoir avancer dans mon code.
1) J'ai un fichier TXT qui constitue mes données (2 colonnes). Je souhaiterai à partir de ce fichier remplir un tableau à 1D avec uniquement les nombres se trouvant dans la 2ème colonne.
Je programme en C++ (du moins j'essaie car j'apprends un peu chaque jour et notamment grâce à ce forum) et utilise DEV C++.
 
2) Ensuite la 2ème question, je désire inverser l'odre d'un fichier TXT càd que la 1ère ligne devienne la dernière et que la dernière devienne la 1ère etc. ...
Merci d'avance pour votre aide.

Reply

Marsh Posté le 22-02-2008 à 15:10:35   

Reply

Marsh Posté le 22-02-2008 à 18:09:20    

Exemple:
ifstream f_entree("Cours_Action_S.txt", ios::in);
for(unsigned int i = 0; i < dim; i++)
    {
        f_entree >> S[i];
    }
 
avc f_entree le flux entrant pour remplir mon tableau S le problème est que le fichier Cours_Action_S.txt est constitué de deux colonnes. Or je ne souhaite recopier que la deuxième ! Comment puis je faire ? Auriez vous des réponses, idées etc. ...  
Merci de votre aide

Reply

Marsh Posté le 22-02-2008 à 18:57:35    

tu ouvres ton fichier, tu lis ligne par ligne et tu tokenise chaque ligne avec genre boost::tokenizer. Tu gardes le deuxième élément et tu le push_back dans un std::vector.
 
boost::tokenizer: http://www.boost.org/libs/tokenizer/index.html
std::vector:http://www.sgi.com/tech/stl/Vector.html

Reply

Marsh Posté le 22-02-2008 à 19:21:05    

Ok merci pour tes éléments de réponses. Je vais faire des recherches sur boost::tokenizer.

Reply

Marsh Posté le 22-02-2008 à 21:45:57    

Désolé, je rame toujours.

Reply

Marsh Posté le 22-02-2008 à 23:57:56    

Personne n'aurait d'autre proposition à me faire pour résoudre mon problème. Je souhaite utiliser uniquement la deuxième colonne pour remplir mon tableau S.
Merci et bonne nuit

Reply

Marsh Posté le 23-02-2008 à 09:56:53    

Bonjour,
Pas de réponses, toujours pas d'indice. Sinon, Joel ou quelqu un d'autre pourrait m'expliquer la méthode de tokenizer car je n'ai pas saisi.
Merci.

Reply

Marsh Posté le 23-02-2008 à 17:17:14    

Toujours pas d'éléments de réponse mise à part tokenizer ? Sinon je vais faire un simple copier/coller de ma colonne voulu dans un autre fichier et utiliser mon code ci dessus pour le remplir. Mais bon ce n'est pas pratique...
Merci tout de même d'essayer de m'aider.
Bonne soirée.

Reply

Marsh Posté le 23-02-2008 à 18:18:13    

t'as quand même un exemple d'une trivialité sans nom avec tokenizer. Faudrait voir à lire les docs et cliquer sur les liens :o

Reply

Marsh Posté le 23-02-2008 à 19:00:57    

D'une trivialité sans nom certes mais ça dépend pour qui... Je suis allé consulter tes liens et d'autres documents d'ailleurs ! Ceux là ne m'ont pas permis d'assimiler cette notion ! Donc si tu as la gentillesse de m'éclairer, je suis preneur. Autrement, j'attends l'aide d'autres personnes plus explicites !

Reply

Marsh Posté le 23-02-2008 à 19:00:57   

Reply

Marsh Posté le 23-02-2008 à 20:45:55    

Rajoute à ta TODO LIST :
1/ apprendre l'anglais
2/ se sortir les doigts

 

Sinon :

Code :
  1. #include <vector>
  2. #include <string>
  3. #include <fstream>
  4. #include <boost/tokenizer.hpp>
  5. using namespace std;
  6. using namespace boost;
  7. int main()
  8. {
  9.   vector<string> colonne;
  10.   string ligne;
  11.   ofstream fichier("truc.txt" );
  12.   // on va dire que tes colonnes sont séparés par une TAB
  13.   while (getline (fichier, ligne))
  14.   {
  15.     typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
  16.     boost::char_separator<char> sep("\t" );
  17.     // tokenisation de la ligne courante
  18.     tokenizer tokens(ligne, sep);
  19.     // Recup des tokens via un token_iterator
  20.     tokenizer::iterator tok_iter = tokens.begin();
  21.     if(tok_iter != tokens.end())
  22.     {
  23.       tok_iter++;
  24.       if(tok_iter != tokens.end()) colonne.push_back(*tok_iter);
  25.       else throw string("Fichier corrompu - 2e colonne manquante" );
  26.     }
  27.   }
  28.   return 0;
  29. }
 

:sarcastic:


Message édité par Joel F le 23-02-2008 à 20:46:42
Reply

Marsh Posté le 23-02-2008 à 22:01:51    

Ok merci, je vais étudier et essayer d'assimiler ton code afin de le comprendre. Je ne connais pas encore toutes les subtilités du C++. J'apprends... D'ailleurs, connaitrais tu un excellent livre de C++ pour approfondir mes connaissances.
Merci pour ton aide

Reply

Marsh Posté le 23-02-2008 à 23:31:05    

Reply

Marsh Posté le 24-02-2008 à 18:41:48    

Merci

Reply

Marsh Posté le 10-06-2008 à 22:49:19    

Bonjour,
je suis désolé de faire remonter ce topic,  
mais je rencontre le meme problème mais en C++.NET, je travaille avec Visual C++ Express 2008 et la méthode de Joel F ne fonctionne pas dans ce cas.  
Pourriez vous m'aider s'il vous plait ?

Reply

Marsh Posté le 10-06-2008 à 23:24:29    

C++.NET = CLI et code managé c'est bien ça ?
bah si c'ets le cas, c'ets DTC, car BOOST est une lib C++ pas C++.NET :/
doit bien avoir moult classe NET pr faire ça ?

Reply

Marsh Posté le 11-06-2008 à 09:15:38    

Joel F a écrit :

C++.NET = CLI et code managé c'est bien ça ?
bah si c'ets le cas, c'ets DTC, car BOOST est une lib C++ pas C++.NET :/
doit bien avoir moult classe NET pr faire ça ?


Je pense surtout que faire un #include<boost/*> ça marche pas chez lui comme par hasard.

Reply

Marsh Posté le 11-06-2008 à 11:07:52    

ah oui aussi ^^

Reply

Marsh Posté le 11-06-2008 à 13:58:44    

Oui en effet Joel, je ne peux pas utiliser boost. Il faut utliser split().
 
Je n'arrive pas a faire fonctionner ce code qui est censé récuperer les donnes_en_z sur deux colonnes pour les mettre dans un autre fichier en une seule colonne (c'est un exemple). Il écrit uniquement la dernière ligne  de mon premier fichier.
 
Si quelqu'un connait le .net...:

Code :
  1. StreamReader^ sr2 = gcnew StreamReader("donnees_en_z.txt" );
  2. while ( sr2->Peek() >= 0 ){
  3. ligne = sr2->ReadLine();
  4. String^ words =ligne;
  5.    array<Char>^chars = {'\t'};
  6.    array<String^>^split = words->Split( chars );
  7.    System::Collections::IEnumerator^ myEnum = split->GetEnumerator();
  8.    StreamWriter^ sw3 = gcnew StreamWriter( "donnees_en_z_calcul.txt" );
  9.    while ( myEnum->MoveNext() )
  10.    {
  11.       String^ s = safe_cast<String^>(myEnum->Current);
  12.   sw3->WriteLine(s);
  13.           
  14.    }
  15.    sw3->Close();         
  16.  
  17. }
  18.  sr2->Close();


 
Merci beaucoup


Message édité par Zebulon88 le 11-06-2008 à 14:08:54
Reply

Marsh Posté le 11-06-2008 à 16:09:55    

/me tient les cheveux de Joel pendant qu'il vomit

Message cité 1 fois
Message édité par Taz le 11-06-2008 à 16:12:05
Reply

Marsh Posté le 23-06-2008 à 00:00:05    

Taz a écrit :

/me tient les cheveux de Joel pendant qu'il vomit


je touche pas a cette came :o

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed