2012-09-02 14 views
6

मुझे खेद है अगर यह पूछा गया है, लेकिन मुझे ऐसा समाधान नहीं मिल रहा है जो मेरी मदद करता है। मैं एक पाठ फ़ाइल से डेटा में पढ़ने की कोशिश कर रहा हूं, और आखिरकार इसे किसी ऑब्जेक्ट में संग्रहीत करता हूं।फ़ाइल से सीएसवी डेटा पढ़ना

टेक्स्ट फ़ाइल में 4 चर सभी अल्पविराम से अलग हैं।

string v1, v2, v3, v4; 
ifstream afile; 
afile.open("thefile.txt"); 
afile >> v1 >> v2 >> v3 >> v4; 
afile.close(); 
cout << v1 << endl; 
cout << v2 << endl; 
cout << v3 << endl; 
cout << v4 << endl; 

फ़ाइल एकाधिक रिकॉर्ड है:

मैं इस प्रकार यह करने के लिए कोशिश की है। मैंने यह सुनिश्चित करने के लिए अभी 1 करने की कोशिश की है कि यह काम करता है, लेकिन जब यह डेटा में पढ़ता है, तो यह अल्पविराम से अलग नहीं होता है।

वहां से, मैं डेटा को किसी ऑब्जेक्ट में संग्रहीत करना चाहता हूं। निम्नलिखित कार्य करेंगे: बात * चीज़ 1 = नई बात (v1, v2, v3, v4);

हालांकि, जब मैं 5 रिकॉर्ड कहता हूं, तो कोड की उपरोक्त रेखा को व्यवस्थित करने का सबसे अच्छा तरीका क्या होगा? चूंकि प्रत्येक ऑब्जेक्ट को एक अद्वितीय नाम की आवश्यकता होती है, क्या कोई तरीका है कि मैं शायद लूप और वेक्टर के लिए उपयोग कर सकता हूं? यानी के लिए (int i = 0; मैं < 5; i ++) { // डेटा में पढ़ा // वेक्टर में दुकान }

किसी भी संकेत बहुत सराहना कर रहे हैं

+0

संभावित डुप्लिकेट [अल्पविराम से अलग मूल्यों के साथ पाठ फ़ाइल में पढ़ने/लिखने के लिए कैसे] [http://stackoverflow.com/questions/1474790/how-to-read-write-into-from-text-file -साथ-अल्पविराम से अलग-मान) –

उत्तर

8

सीएसवी प्रारूप अधिक जटिल है सिर्फ एक अल्पविराम विभाजक से। इसमें उद्धरण चिह्न हो सकते हैं जिन्हें आपको बचाना चाहिए और तदनुसार व्याख्या करना चाहिए और विविध विभाजकों की अनुमति हो सकती है। यदि आपकी इनपुट फ़ाइल सख्ती से स्वरूपित नहीं है तो आपको वास्तव में एक समर्पित सीएसवी आयात/निर्यात लाइब्रेरी का उपयोग करना चाहिए।

एक टोकननाइज़र क्लास आपके प्रश्न का उत्तर दे सकती है (जैसे boost या simpler ones से कोई भी उपलब्ध है)।

आपको इस विषय के बारे में otherquestions जांचना चाहिए।

6

हेड @ सोरावक्स उत्तर दें और यदि आप कर सकते हैं तो एक विशेष पुस्तकालय का उपयोग करें। विशेष रूप से, स्ट्रैट टूलकिट जो वह सुझाता है वह दिलचस्प लगता है और केवल एक ही शीर्षलेख है। बूस्ट इसे कम से कम 5 अलग-अलग तरीकों से भी कर सकता है, और यदि आप कुछ समय के लिए सी ++ का उपयोग करने जा रहे हैं तो सीखने योग्य पुस्तकालय है। उस ने कहा, ये सभी समाधान आपके कार्यक्रम में कुछ जटिलता जोड़ देंगे, और संभावना है कि आप कहीं और उस प्रयास को खर्च करना चाहते हैं, विशेष रूप से यदि आपको केवल एक बहुत ही सरल संख्या-पाठक चाहिए। यहाँ कैसे मानक सी ++ (एसटीएल के साथ, उदाहरण के लिए, वेक्टर और धाराओं) में जाने के लिए है:

#include <iostream> 
    #include <sstream> 
    #include <fstream> 
    #include <string> 
    #include <algorithm> 
    #include <vector> 

    using namespace std; 

    vector<double> &split(const string &s, 
     char delim, vector<double> &elems) 
    { 
     stringstream ss(s); 
     string item; 
     while (std::getline(ss, item, delim)) { 
      stringstream conv(item); 
      double number; 
      conv >> number; 
      elems.push_back(number); 
     } 
     return elems; 
    } 

    struct my_record_t{ 
     double f1, f2, f3, f4; 
    }; 

    typedef vector<my_record_t> my_record_vector_t; 

    int main(int argc, char* argv[]) 
    { 
     stringstream in("10,20,2.0,5\n" 
          "4.,5.,6.,80\n" 
          "4.,2.,6.,70\n" 
          "4.,5.,6.,86\n" 
          "2.,5.,9.,80\n"); 
     // Or alternatively, : 
     // ifstream in("myfile.csv"); 

     // Here you store your records 
     my_record_vector_t mrv; 

     string line; 
     vector<double> numbers; 
     while(std::getline(in, line, '\n')) 
     { 
      numbers.clear(); 
      split(line, ',', numbers); 
      my_record_t r; 
      r.f1 = numbers[0]; 
      r.f2 = numbers[1]; 
      r.f3 = numbers[2]; 
      r.f4 = numbers[3]; 
      mrv.push_back(r); 
     } 

     cout << mrv.size() << " records read" << endl; 


     return 0; 
    } 

थोड़ा बहुत लंबा हो सकता है, लेकिन यह अपने दिन बचा सकता है।

4

मैं Using ifstream to read floats पर देखता हूं और अल्पविराम पर पार्सिंग के साथ शुरू करता हूं। सीएसवी प्रारूप अधिक जटिल है लेकिन उदाहरण आपको शुरू करना चाहिए। उदाहरण String Toolkit का उपयोग करता है जो पाठ को पार्स करने और आपको आवश्यक संरचना तत्वों में कनवर्ट करने में बहुत अच्छा है।

संबंधित मुद्दे