Импортировать CSV-файл, а затем отсортировать его с помощью C ++ - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть проект, который велел мне импортировать CSV-файл, а затем отсортировать его (файл содержит миллион чисел).Я гуглил исходный код сортировки слиянием и нашел это, я попробовал, и сортировка работает.(Я скомпилировал этот код в Ubuntu с помощью g ++ через Virtual Box).

#include<iostream>
#include<vector>

using namespace std;

void print(vector<int> v)
{
  for(int i = 0; i < v.size(); i++) cout << v[i] << " ";
  cout << endl;
}

vector<int> merge(vector<int> left, vector<int> right)
{
   vector<int> result;
   while ((int)left.size() > 0 || (int)right.size() > 0) {
      if ((int)left.size() > 0 && (int)right.size() > 0) {
         if ((int)left.front() <= (int)right.front()) {
            result.push_back((int)left.front());
            left.erase(left.begin());
         } 
   else {
            result.push_back((int)right.front());
            right.erase(right.begin());
         }
      }  else if ((int)left.size() > 0) {
            for (int i = 0; i < (int)left.size(); i++)
               result.push_back(left[i]);
            break;
      }  else if ((int)right.size() > 0) {
            for (int i = 0; i < (int)right.size(); i++)
               result.push_back(right[i]);
            break;
      }
   }
   return result;
}

vector<int> mergeSort(vector<int> m)
{
   if (m.size() <= 1)
      return m;

   vector<int> left, right, result;
   int middle = ((int)m.size()+ 1) / 2;

   for (int i = 0; i < middle; i++) {
      left.push_back(m[i]);
   }

   for (int i = middle; i < (int)m.size(); i++) {
      right.push_back(m[i]);
   }

   left = mergeSort(left);
   right = mergeSort(right);
   result = merge(left, right);

   return result;
}

int main()
{
   vector<int> v;

   v.push_back(38);
   v.push_back(27);
   v.push_back(43);
   v.push_back(3);
   v.push_back(9);
   v.push_back(82);
   v.push_back(10);

   print(v);
   cout << "------------------" << endl;

   v = mergeSort(v);

   print(v);
}

Но когда я вставляю код для импорта файла CSV, он только читает файл, и сортировка не выполняется, я помещенэто неправильно?Вот мой код:

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

using namespace std;

const int jumlahData = 999999;
double data[jumlahData] = {0};

void loadData(const char* namaFile) {
    string line;
    ifstream myfile (namaFile);

    if (myfile.is_open()) {
        int counter = 0;
        while (getline(myfile, line, ',')) {
            //cout << line << '\n';
            data[counter] = stod(line);
            counter++;
        }
        myfile.close();
    }
}

void print(vector<int> v)
{
  for(int i = 0; i < v.size(); i++) cout << v[i] << " ";
  cout << endl;
}

vector<int> merge(vector<int> left, vector<int> right)
{
   vector<int> result;
   while ((int)left.size() > 0 || (int)right.size() > 0) {
      if ((int)left.size() > 0 && (int)right.size() > 0) {
         if ((int)left.front() <= (int)right.front()) {
            result.push_back((int)left.front());
            left.erase(left.begin());
         } 
   else {
            result.push_back((int)right.front());
            right.erase(right.begin());
         }
      }  else if ((int)left.size() > 0) {
            for (int i = 0; i < (int)left.size(); i++)
               result.push_back(left[i]);
            break;
      }  else if ((int)right.size() > 0) {
            for (int i = 0; i < (int)right.size(); i++)
               result.push_back(right[i]);
            break;
      }
   }
   return result;
}

vector<int> mergeSort(vector<int> m)
{
   if (m.size() <= 1)
      return m;

   vector<int> left, right, result;
   int middle = ((int)m.size()+ 1) / 2;

   for (int i = 0; i < middle; i++) {
      left.push_back(m[i]);
   }

   for (int i = middle; i < (int)m.size(); i++) {
      right.push_back(m[i]);
   }

   left = mergeSort(left);
   right = mergeSort(right);
   result = merge(left, right);

   return result;
}

int main()
{
   vector<int> v;

   loadData("dataDemo.csv");

   print(v);
   cout << "------------------" << endl;

   v = mergeSort(v);

   print(v);
}

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Как уже отмечали другие, вы не сортируете фактические данные, которые вы прочитали. Это можно легко решить, возвращая количество точек данных, которые вы прочитали.

Лучший подход, который, как я подозреваю, вы пытаетесь сделать, состоит в том, чтобы отправить ссылку на вектор из main в loadData и push_back данные в векторе.Кроме того, желательно, когда это возможно, использовать предоставленные библиотеки реализаций.Другими словами, не изобретайте велосипед, а просто используйте <algorithm> вместо своего или чужого алгоритма сортировки.Это помогает предотвратить неприятные ошибки.

int main()
{
  //return the count of integers read into data[] in loadData()
  //also change the vector & array types to be consistent, please!
  std::vector<int> v (data, loadData("dataDemo.csv");

  print(v);   //print the loaded vector
  cout << "------------------" << endl;

  std::sort(v.begin(), v.end());  // using <algorithm> (̶i̶t̶'̶s̶ ̶q̶u̶i̶c̶k̶s̶o̶r̶t̶)̶

  print(v);
}
0 голосов
/ 24 ноября 2018

ваш loadData("dataDemo.csv"); вызов не записывает в ранее объявленный локальный vector<int> v;.Ваш вектор v не имеет элементов.Вам нужно написать метод, который заполняет вектор v на основе содержимого double data[jumlahData], а именно ..

int main()
{
   vector<int> v;

   loadData("dataDemo.csv");
   populateVectorWithData(v, data); //TODO implement me
   print(v);
   cout << "------------------" << endl;

   v = mergeSort(v);

   print(v);
}
...