Как я могу прочитать файл CSV в вектор в C ++ - PullRequest
0 голосов
/ 11 июля 2019

Я делаю проект, который конвертирует код Python в C ++, для повышения производительности. Это имя проекта Python - Adcvanced EAST, на данный момент я получил входные данные для функции nms в файле .csv следующим образом:

"[ 5.9358170e-04  5.2773970e-01  5.0061589e-01 -1.3098677e+00
 -2.7747922e+00  1.5079222e+00 -3.4586751e+00]","[ 3.8175487e-05  6.3440394e-01  7.0218205e-01 -1.5393494e+00
 -5.1545496e+00  4.2795391e+00 -3.4941311e+00]","[ 4.6003381e-05  5.9677261e-01  6.6983813e-01 -1.6515008e+00
 -5.1606908e+00  5.2009044e+00 -3.0518508e+00]","[ 5.5172237e-05  5.8421570e-01  5.9929764e-01 -1.8425952e+00
 -5.2444854e+00  4.5013981e+00 -2.7876694e+00]","[ 5.2929961e-05  5.4777789e-01  6.4851379e-01 -1.3151239e+00
 -5.1559062e+00  5.2229333e+00 -2.4008298e+00]","[ 8.0250458e-05  6.1284608e-01  6.1014801e-01 -1.8556541e+00
 -5.0002270e+00  5.2796564e+00 -2.2154367e+00]","[ 8.1256607e-05  6.1321974e-01  5.9887391e-01 -2.2241254e+00
 -4.7920742e+00  5.4237065e+00 -2.2534993e+00]

одна единица состоит из 7 цифр, но '\ n' после первых четырех цифр, Я хочу прочитать этот CSV-файл в мой проект C ++, чтобы я мог выполнять математическую работу в C ++, сделать ее более быстрой.

using namespace std;

void read_csv(const string &filename)
{
//File pointer
fstream fin;
//open an existing file
fin.open(filename, ios::in);

vector<vector<vector<double>>> predict;

string line;
while (getline(fin, line))
{
    std::istringstream sin(line);
    vector<double> preds;
    double pred;
    while (getline(sin, pred, ']'))
    {
        preds.push_back(preds);
    }

}

}

Пока ... мой код не работает, Я совершенно не знаю, с этим ... Пожалуйста, помогите мне с чтением данных CSV в мой код. спасибо

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

К сожалению, синтаксический анализ строк (и, следовательно, файлов) очень утомителен в C ++.

Я настоятельно рекомендую использовать библиотеку, в идеале только с заголовком, , как эта .

Если вы настаиваете на том, чтобы написать его самостоятельно, возможно, вы можете черпать вдохновение из этого вопроса StackOverflow о том, как анализировать общие файлы CSV в C ++.

0 голосов
/ 11 июля 2019

Вы можете посмотреть на getdelim(',', fin, line),

Но другой проблемой будут эти кавычки, если только вы / не знаете / файл всегда форматируется именно таким образом, это становится трудным.

Один взлом, который я использовал в прошлом, НЕ СОВЕРШЕННЫЙ, если первый символ - кавычка, то последний символ перед запятой также должен быть совпадающей кавычкой и не быть экранированным.

Если это не кавычка, то getdelim() еще немного, но функция автоматического выделения в getdelim означает, что вы должны использовать другой буфер.В C ++ я получаю вектор всех частей результатов getdelim, которые затем необходимо объединить, чтобы получить окончательную строку:

std::vector<char*> gotLine;
gotLine.push_back(malloc(2));
*gotLine.back() = fgetch();
gotLine.back()[1] = 0;
bool gotquote = *gotLine.back() == '"'; // perhaps different classes of quote
if (*gotLine.back() != ',')
 for(;;)
 {
  char* gotSub= nullptr;
  gotSub=getdelim(',');
  gotLine.push_back(gotSub);
  if (!gotquote) break;
  auto subLen = strlen(gotSub);
  if (subLen>1 && *(gotSub-1)=='"') // again different classes of quote
    if (sublen==2 || *(gotSub-2)!='\\') // needs to be a while loop
       break;
 }

Затем просто объединить все эти сегменты строк обратно вместе.

Обратите внимание, что getdelim поддерживает нулевые байты.Если вы ожидаете нулевые байты в содержимом и не представлены последовательностями символов \000 или \@, вам необходимо сохранить фактическую длину, возвращаемую getdelim, и использовать memcpy для их объединения.

Oh, иесли вы разрешите расширенные кавычки utf-8, это станет очень грязным!

Случай, который не покрывает это строка, которая заканчивается \\" или \\\\".В идеале вам нужно посчитать количество ведущих обратных слешей и принять кавычку, если счет четный.

Обратите внимание, что это оставляет проблему удаления текста в кавычках, т. Е. Преобразования любых \" в ", \\ в \ и т. Д. Также отбрасывая кавычки.

В конце концов, библиотека может быть проще, если вам нужно иметь дело с совершенно произвольным контентом.Но если контент «известен», вы можете жить без него.

...