Чтение из файла данных CSV, ошибка при попытке извлечь только то, что мне нужно - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь извлечь два столбца данных из файла CSV и сбросить остальные.

Я получаю следующие ошибки:

C2296: '>>': недопустимый, левый операнд имеет тип 'std :: basic_istream> & (__ thiscall std :: basic_istream> :: *)(_Elem *, std :: streamsize) '

C3867:' std :: basic_istream> :: read ': нестандартный синтаксис;используйте '&', чтобы создать указатель на член

Данные отформатированы следующим образом:

1928,44.50%, .......

Я хочу1928 назначен в data.year, а 44.50% - в data.yield, но без учета знака процента.

bool ReadData(MyData &data)
{
//Variable for reading data into file stream
ifstream inFile;
string trash;
char junk;

cout << "\nReading file . . .";

//Open data file
inFile.open("Data.csv");

//Read the first 18 lines, and throw it away
for (int i = 0; i < 18; ++i)
{
    getline(inFile, trash);
}

//Read the necessary data into the arrays
for (int i = 0; i < SIZE; ++i)
{
     //===============================================================
     //This line is throwing 2 errors
     //Goal: read first column of a simple integer into data.year, discard the comma, then read the second column of a double into data.yield, discard the percentage sign. infile.ignore(); to clear cin stream, getline(inFile, trash) to discard remainder of the lines.

    inFile.read >> data.year[i] >> junk >> data.yield[i] >> junk >> trash >> endl;

     //===============================================================
    inFile.ignore();
    getline(inFile, trash);
}

//Return false if file could not be opened
if (!inFile)
{
    cout << "\n\nTechnical error! The file could not be read.";
    return false;
}
else
{
    cout << "\n\nFile opened successfully!";
    return true;
}
inFile.close();
}

struct MyData
{
int year[SIZE];
int yield[SIZE];
double minYield;
double maxYield;
double avgYield;
};

Куда я иду?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018
inFile.read >> data.year[i] >> junk >> data.yield[i] >> junk >> trash >> endl;

inFile.read является функцией и не имеет оператора >>, поэтому вы получаете ошибку.См. https://en.cppreference.com/w/cpp/io/basic_istream/read

. Я предлагаю вам попробовать другой подход: прочитать всю строку и использовать функцию разнесения для извлечения отдельных элементов.Например, Есть ли в C ++ эквивалентная функция PHP explode ()?

0 голосов
/ 02 декабря 2018

Самой первой проблемой является чтение файла построчно постоянное число раз, однако вы никогда не узнаете размер файла.Таким образом, вы должны добавить еще одну проверку к вашему for loop.Вторая проблема заключается в том, что вы говорите, что доходность int, но в файле double.Третья проблема - чтение отформатированных данных, а не то, что вы делали.Следующий фрагмент кода может работать для вас, или вы можете немного поиграть с кодом.

for (int i = 0; i < SIZE && std::getline(infile, line); ++i) {  
    std::stringstream linestream(line);
    std::string  year, yield;

    getline(linestream,year,',');
    getline(linestream,yield,',');

    yield.erase(std::remove(yield.begin(), yield.end(), '%'), yield.end()); // remove %

    myData.year[i] = std::stoi( year );  // string to int
    myData.yield[i] = std::stod( year ); // string to double

  }

PS: Не забудьте включить библиотеку sstream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...