3

私はC ++を初めて使用し、CSVファイルをベクターに読み込む方法を理解しようとしています。これまでのところ、すべての CSV レコードの末尾にある改行を回避する方法がわからないことを除いて、すべて問題ありません。

ここに私のコードがあります:

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

// stream input operator overloaded to read a list of CSV fields
std::istream &operator >> (std::istream &ins, std::vector<std::string> &record)
{
    record.clear();

    // read the entire line into a string
    std::string line;
    std::getline(ins, line);

    // using a stringstream to separate the fields out of the line
    std::stringstream ss(line);
    std::string field;

    while (std::getline(ss, field, ';'))
    {
        // add the converted field to the end of the record
        record.push_back(field);
    }
    return ins;
}

// stream input operator overloaded to read a list of CSV fields
std::istream &operator >> (std::istream &ins, std::vector<std::vector<std::string>> &data)
{
    data.clear();

    // add results from record into data
    std::vector<std::string> record;

    bool empty;
    while (ins >> record)
    {
        // check if line has a price
        for (unsigned i = 0; i < record.size(); i++)
        {
            std::stringstream ss(record[2]);
            int price;
            if (ss >> price)
            {
                empty = true;
            }
            else
            {
                empty = false;
            }
        }

        if (empty == true)
        {
            data.push_back(record);
        }
    }
    return ins;
}

int main()
{
    // bidemensional vector for storing the menu
    std::vector<std::vector<std::string>> data;

    // reading file into data
    std::ifstream infile("test.csv");
    infile >> data;

    // complain if theres an error
    if (!infile.eof())
    {
        std::cout << "File does not excist." << std::endl;
        return 1;
    }
    infile.close();


    for (unsigned m = 0; m < data.size(); m++)
    {
        for (unsigned n = 0; n < data[m].size(); n++)
        {
            std::string recordQry;
            recordQry += "'" + data[m][n] + "', ";

            std::cout << recordQry;
        }
        std::cout << std::endl;
    }
    return 0;
}

test.csv には以下が含まれます。

CODE;OMSCHRIJVING; PRIJS ;EXTRA;SECTION
A1;Nasi of Bami a la China Garden; 12,00 ;ja;4
A2;Tjap Tjoy a la China Garden; 12,00 ;ja;1
A3;Tja Ka Fu voor twee personen; 22,50 ;ja;1
4

2 に答える 2

2

試す:

while (std::getline(ss, field, ';'))
{
    // add the converted field to the end of the record
    record.push_back(field.erase(s.find('\r'));
}
//record.push_back(field.erase(s.find('\r'));
return ins;
于 2013-01-09T08:06:12.123 に答える
2

回答を削除するつもりでしたが、回答を再送信することにしました。なぜなら、あなたの周りを飛んでいるすべての事実に関係なく、getlineあなたが問題を抱えていることを実際に知っているからです。他の回答のコメントで、もともとはExcelファイルであると述べていることに気付きました。まあ、少なくとも場合によっては、Microsoft は行を\r\n. それが理由でしょうか?getlineは引き続き削除され\nますが、キャリッジ リターンは引き続き使用されます。その場合は、以前に共有した方法のいずれかを利用する必要があります。私は自分自身を償還したことを願っています..

を使用してファイルへの書き込みを確認しましたが\r\n、はい、\r. 私はそれをデバッグで見ましたがgetline、値を抽出するために再度使用しても、文字列に残ります。コンソールに出力すると、カーソルが最初の文字の下に浮いている状態で値が出力されます。

Microsoft は明らかに、2 つの別個の機能を必要とする古いマシンとの下位互換性のためにこのスタイルを使用しています。それはあなたが経験している行動のように聞こえますか?

于 2013-01-09T06:55:47.453 に答える