Информация C ++ из csv неорганизована в массиве [] [] - PullRequest
0 голосов
/ 07 мая 2020

Я новичок в C ++, на самом деле учусь выполнять задания от магистров, которых учу.

Во-первых, в моем коде мне нужно прочитать каждую строку и столбец из файла csv и сохранить их в array [] [].

Мой CSV-файл (столбцы A1, A2, B1, B2):

46842 test
46825 test2

Мой код atm:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(){
    string val;
    string arr[2][2];

    ifstream myFile;
    myFile.open("excel.csv");
    while (myFile.good())
    {    
        for(int row = 0; row <= 1; row++)
        {
            for(int column = 0; column <= 1; column++)
            { 
                getline(myFile, val, ',');
                arr[row][column] = val;
            }
        }         
    }
    cout <<"cell 0.0: " << arr[0][0] << endl;
    cout <<"cell 0.1: " << arr[0][1] << endl;
    cout <<"cell 1.0: " << arr[1][0] << endl;
    cout <<"cell 1.1: " << arr[1][1] << endl;

}

Проблема в результате:

cell 0.0: 46842
cell 0.1: test
46825
cell 1.0: test2

cell 1.1: test2

Должно быть:

cell 0.0: 46842
cell 0.1: test
cell 1.0: 46825
cell 1.1: test2

похоже, что проблема в том, когда он достигает последней позиции в первой строке. Кто-нибудь знает, как это исправить? Спасибо :)

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Вы сделали несколько ошибок, которые необходимо исправить. Вы использовали std::getline для чтения до следующей запятой. Он будет делать именно это, даже если начинается новая строка. Таким образом, он будет продолжать чтение, пока не найдет следующую запятую. Это объяснит вывод

cell 0.1: test
46825

Он показывает «тест», затем новую строку, а затем 46825.

Итак, это не сработает. Нам нужно использовать линейный подход. Сначала мы прочитаем всю строку 46842,test, а затем разделим ее. Мы будем использовать std::getline, чтобы разделить его. Но теперь он будет работать, потому что он будет извлекать данные до следующей запятой или до конца строки.

Вы также никогда не должны использовать:

while (myFile.good())

См. 3 возможных решения :

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

using namespace std;

int main() {
    string val;
    string arr[2][2];

    ifstream myFile;
    myFile.open("excel.csv");
    int row = 0;
    while (getline(myFile,val))
    {
        std::istringstream iss(val);
        for (int column = 0; column <= 1; column++)
        {
            getline(iss, arr[row][column], ',');
        }
        ++row;
    }
    cout << "cell 0.0: " << arr[0][0] << endl;
    cout << "cell 0.1: " << arr[0][1] << endl;
    cout << "cell 1.0: " << arr[1][0] << endl;
    cout << "cell 1.1: " << arr[1][1] << endl;

}

Следующее улучшение

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


int main() {

    std::string val;
    std::string arr[2][2];

    std::ifstream myFile;
    myFile.open("excel.csv");

    for (unsigned int row = 0; std::getline(myFile, val); ++row)
    {
        std::istringstream iss(val);
        for (unsigned int column = 0; column <= 1; column++)
        {
            std::getline(iss, arr[row][column], ',');
        }
    }

    std::cout << "cell 0.0: " << arr[0][0] << std::endl;
    std::cout << "cell 0.1: " << arr[0][1] << std::endl;
    std::cout << "cell 1.0: " << arr[1][0] << std::endl;
    std::cout << "cell 1.1: " << arr[1][1] << std::endl;

}

Полное решение C ++:

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

int main() {

    // Here we will store all data from our CSV file
    std::vector<std::vector<std::string>> data{};

    // Open the csv file with the source data
    std::ifstream myFile{ "excel.csv" };

    // Check, if we could open the source file
    if (myFile) {

        // We will read all lines of the source file in a for loop
        for (std::string line{}; std::getline(myFile, line); ) {

            // Stuff the line in an std::istringstream, so that we can extract data of jkust one line
            std::istringstream lineAsStream{ line };

            // The single parts of one line
            std::vector<std::string> parts{};

            for (std::string partData{}; std::getline(lineAsStream, partData, ','); parts.push_back(partData))
                ; // Empty body

            // Store new row data
            data.push_back(parts);
        }
        std::cout << "cell 0.0: " << data[0][0] << std::endl;
        std::cout << "cell 0.1: " << data[0][1] << std::endl;
        std::cout << "cell 1.0: " << data[1][0] << std::endl;
        std::cout << "cell 1.1: " << data[1][1] << std::endl;
    }
    else {
        std::cerr << "\n***Error: COuld not open source file\n";
    }
    return 0;
}
0 голосов
/ 07 мая 2020

Это мой код банкомата. он печатает:

    cell 0.0: 46842 
    cell 0.1: test 
    cell 1.0: 46842 
    cell 1.1: test 

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

using namespace std;

main() {
   string arr[2][2];
   string val;
   string my_str; 
   ifstream myFile;
   myFile.open("excel.csv");   

   for(int row = 0; row <= 1; row++) {
       getline(myFile, val);
       stringstream s_stream(val);
       for(int column = 0; column <= 1; column++) {                            
           string substr;
           getline(s_stream, substr, ',');
           result.push_back(substr);
           arr[row][column] = result.at(column);
       }
   }
   cout <<"cell 0.0: " << arr[0][0] << endl;
   cout <<"cell 0.1: " << arr[0][1] << endl;
   cout <<"cell 1.0: " << arr[1][0] << endl;
   cout <<"cell 1.1: " << arr[1][1] << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...