2012-09-02 43 views
6

Tôi xin lỗi nếu điều này đã được yêu cầu, nhưng dường như tôi không tìm được giải pháp nào giúp tôi. Tôi đang cố gắng đọc dữ liệu từ một tệp văn bản và cuối cùng lưu trữ nó trong một đối tượng.Đọc dữ liệu CSV từ một tệp

Tệp văn bản có 4 biến được phân tách bằng dấu phẩy.

tôi đã cố gắng để làm điều này như sau:

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; 

Các tập tin có nhiều hồ sơ. Tôi đã cố gắng chỉ làm 1 cho bây giờ để đảm bảo nó hoạt động, nhưng khi nó đọc trong dữ liệu, nó không tách biệt tại dấu phẩy.

Từ đó, tôi muốn lưu trữ dữ liệu vào một đối tượng. Công việc sau đây: Điều * thing1 = new Thing (v1, v2, v3, v4);

Mặc dù, khi tôi đọc 5 bản ghi thì cách tốt nhất để cấu trúc dòng mã ở trên là gì? Khi mỗi đối tượng cần một tên duy nhất, có cách nào tôi có thể lặp lại có lẽ bằng cách sử dụng một vòng lặp for và một vector? tức là for (int i = 0; i < 5; i ++) {// đọc dữ liệu // cửa hàng trong vector }

Bất kỳ gợi ý được rất nhiều đánh giá cao

+0

bản sao có thể có của [Cách đọc-ghi vào/từ tệp văn bản có giá trị được phân tách bằng dấu phẩy] (http://stackoverflow.com/questions/1474790/how-to-read-write-into-from-text-file -giá trị được phân tách bằng dấu phẩy) –

Trả lời

8

Định dạng CSV là phức tạp hơn hơn chỉ là dấu phân tách dấu phẩy. Nó có thể chứa dấu ngoặc kép mà bạn nên thoát ra và giải thích các dấu phân tách phù hợp và đa dạng có thể được cho phép. Bạn thực sự nên sử dụng thư viện nhập/xuất CSV chuyên dụng nếu tệp đầu vào của bạn không được định dạng đúng.

Lớp trình thông báo có thể trả lời câu hỏi của bạn (chẳng hạn như câu hỏi từ boost hoặc simpler ones khả dụng).

Bạn nên kiểm tra otherquestions về chủ đề này.

6

Chú ý @Soravux trả lời và sử dụng thư viện chuyên ngành nếu bạn có thể. Đặc biệt, bộ công cụ strtk mà anh gợi ý có vẻ thú vị và chỉ là một tiêu đề duy nhất. Boost cũng có thể làm điều đó trong ít nhất 5 cách khác nhau, và là một thư viện đáng học nếu bạn định sử dụng C++ trong một thời gian. Điều đó nói rằng, tất cả những giải pháp đó sẽ thêm một số phức tạp vào chương trình của bạn, và rất có thể là bạn muốn dành nỗ lực đó ở nơi khác, đặc biệt nếu tất cả những gì bạn cần là một trình đọc số rất đơn giản. Dưới đây là cách đi tiêu chuẩn C++ (với STL, ví dụ: vectơ và luồng):

#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; 
    } 

Một chút quá dài có thể, nhưng nó có thể tiết kiệm trong ngày của bạn.

4

Tôi sẽ xem Using ifstream to read floats và bắt đầu với phân tích cú pháp trên dấu phẩy. Định dạng CSV phức tạp hơn nhưng ví dụ sẽ giúp bạn bắt đầu. Ví dụ này sử dụng String Toolkit rất tốt khi phân tích văn bản và chuyển đổi thành các phần tử cấu trúc mà bạn cần.

Các vấn đề liên quan