C ++: прочитать CSV-файл и извлечь некоторые части - PullRequest
0 голосов
/ 18 августа 2011

A .csv файл записан так:

    M9005U00-X30A0S00-1;BAS;X;-0.002;-0.095
    S707RY00-X30AOS00-1;HMV;X;+0.002;+0.081
    W3005U00-X30BOJ00-1;BAS;X;+0.026;-0.138
    H307QZ00-X30BOJ00-1;HMV;X;-0.025;+0.122
    ....

Теперь я хочу создать функцию, т.е.

      double find_and_extract (string sss)

когда эта функция используется с ключевым словом в качестве параметра, например

      find_and_extract (W3005U00-X30BOJ00-1);

он будет искать в файле .csv построчно, находить соответствующую строку (в данном случае это должна быть третья строка) и извлекать часть certin "+0.026" в этой строке, возвращая ее как двойную.

Как мне написать эту функцию?

edit: Вот код, который я написал до сих пор:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <stdio.h>
    #include <vector>
    #include <iterator>
    #include <cstdlib>
    #include <cstdio>
    #include <sstream>
    #include <stdlib.h>

    using namespace std;

    void main()
        {
           find_and_extract (W3005U00-X30BOJ00-1);
        }

    double find_and_extract (string sss)
         {
             vector<string> vecarray;
             ifstream infile("C:\\Data\\testdata.csv");
             string temppo;
             string contnt;
             char csv_extract[40];
             stringstream ss;
             vector <string>::iterator ptr;
             while (!infile.eof())
               { 
                 infile.getline(csv_extract,40);
                 ss << csv_extract;
                 ss >> contnt;
                 vecarray.push_back(contnt);
                }
             for (ptr=vecarray.begin();ptr!=vecarray.end();ptr++)
             {
                 if ((*ptr).find(sss)==0)
                     temppo = (*ptr).substr(27,6);
             }
             return (strtod(temppo.c_str(),NULL,0));
        }

Может ли кто-нибудь помочь мне указать на ошибки?

Ответы [ 4 ]

0 голосов
/ 18 августа 2011

Если текстовые строки в файле имеют одинаковую длину, вы можете прочитать строки как блоки (т.е. много строк == 1 блок) в буфер, а затем выполнить поиск в буфере.

Узким местом вашей производительности будет чтение данных из файла.Как правило, выбранный вами метод поиска будет быстрее, чем чтение данных.

0 голосов
/ 18 августа 2011

Вы могли бы использовать sed: Таким образом, вы могли бы очень эффективно искать ключ без необходимости самостоятельно реализовывать алгоритм.Когда вы нашли ключ, вы можете позволить sed выводить те части строки, которые вам нужны (используйте регулярные выражения для описания шаблона и группировки для вывода только его части).После этого это простое преобразование строки в плавающее число, которое можно выполнить на любом языке программирования.

Для начала:

sed -n 's/RegexToMatchYourKeyAndValues/MatchedValues/p' 
0 голосов
/ 18 августа 2011

Выезд strtok().На самом деле это довольно тривиальная задача, и она должна быть хорошим учебным проектом, если вы еще не знакомы с C ++.

0 голосов
/ 18 августа 2011

Поскольку у вас уже есть файл в виде строки, я бы использовал алгоритм Кнута-Морриса-Пратта, чтобы найти ключ, найти положение 3-й и 4-й точек с запятой в этой строке и вернуть строку междуих.

Это всего лишь набросок - вам нужно добавить обработку ошибок.

...