Visual Studio C ++ Ввод данных из файла CSV в переменные массивы - PullRequest
1 голос
/ 27 августа 2011

Я уже некоторое время пытаюсь разобраться в этом небольшом разделе моего более крупного проекта.Это тоже меня довольно озадачило ... Я пытаюсь взять информацию из файла CSV Excel (см. Пример. CSV) и внести ее в проект Cpp. Теперь, прежде чем я вернусь к тому, как я работал над этим.Я подумал, что мог бы сначала пойти другим путем, ребята, и посмотреть, что вы считаете наиболее эффективным?

1: Example1.csv: значения элемента, все еще следующие за;sSwordName, lvlReq, minAtk, maxAtk, atkRate, sPrice, sValue, strReq, atkReq, intReq.Заголовки столбцов, как показано в Example.csv. Было бы идеально сделать заголовок, который извлекает информацию об элементе из CSV-файла, когда ему говорят, например: если игрок в магазине, он хочет оценить свой меч.Когда он нажимает кнопку «Значение», он ищет в файле «Sword.csv» идентификатор элемента («Может быть») и возвращает «5-е», учитывая, что значение 5-го столбца в этой строке элементов равно «Значение, которое он стоит»И просто создать какую-то функцию, которая делает это для всего?Если да, то есть идеи, как это сделать.

2: Основной способ, которым я пытался заставить это работать: в Example.csv у меня есть все значения элементов, которые я использую в своей программе.присваивается переменным типа int и char, по крайней мере, это моя цель. Пожалуйста, обратитесь к Example.cpp для моего (неудачного) кода и объяснения ..

Example.cpp:

    #include "stdafx.h"
    #include <cstdlib>
    #include <fstream>
    #include <ios>
    #include <iomanip>
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <sstream>

    using namespace std;

    /*** These are the Variables I use for a weapon, they corrospond according to number in list: Wooden Shortsword is first in the
     *** sSwordName Array, so it's lvl requirment would be 1 since it is first.
     *** Idealy this is the way I want things to work... Unless anyone has a better idea, I am open to hear them. I can always
     *** learn more, especially from others. ***/
    char sSwordName[10][25] =   {"Wooden Shortsword", "Bronze Shortsword", "Iron Shortsword", "Steel Shortsword", "Titanium Shortsword"};
    int sSwordLvlR[10] =    {1, 3, 5, 6, 10};
    int sSwordV[10] =       {5, 10, 18, 25, 50};
    int sSwordP[10] =       {10, 20, 40, 60, 100};
    int sSwordMinAtk[10] =  {0, 0, 0, 0, 0};
    int sSwordMaxAtk[10] =  {4, 6, 10, 14, 20};
    int sSwordAtkRate[10] = {0, 2, 3, 4, 6};
    int sSwordStrR[10] =    {1, 6, 11, 16, 22};
    int sSwordAtkR[10] =    {1, 6, 11, 16, 22};
    int sSwordIntR[10] =    {1, 3, 5, 8, 12};

    /*** Now this is as close as I have been able to get to get this to work, sadly it is still off base...
     *** I need it to take for example: Row 1 > Exclude Column 1 > Input Data > Assign to sSwordName[5][25] Array.
     *** My issue is, finding a way to loop it where it takes all the cells in Row 1, ignores the first cell 
     *** (I think making it do like "\n" for it would work? Not sure) and then loop through the rest of the rows
     *** repeating the same algorithm, Ignoring the first cell, inputting, assinging them to the variable arrays?
     *** It is much much easier to edit item stats and add new items in Excel, than having to do it via code as you
     *** may imagine..
     *** I am pretty sure my code is far from what would be best, I bet it needs to be re-written a new way as well..
     *** I would greatly appreciate Anyone who can help me accomplish this task.. It would really make my life
     *** A lot easier, as well as make my project code considerbly shorter.. */

    int main()
{
    int sSwordLvlR;
    double y;
    string data;
    string a;

    ifstream wInv("Example.csv");
    while (getline(wInv, data))
    {
        if (data.empty()) continue;
        istringstream ss( data );
        { 
            string inf;
            getline( ss, inf );
            stringstream( inf ) >> sSwordLvlR;
            cout<<" "<<sSwordLvlR;  
        }
    }
    system("Pause");
    return 0;
}
/* I have not be able to figure out how to make it take the data for the Names yet either */

Пример.csv

sSwordName,Wooden Shortsword,Bronze Shortsword,Iron Shortsword,Steel Shortsword,Titanium Shortsword
sSwordLvlR,1,3,5,6,10
sSwordMinAtk,0,0,0,0,0
sSwordMaxAtk,4,6,10,14,20
sSwordAtkRate,0,2,3,4,6
sSwordP,10,20,40,60,100
sSwordV,5,10,18,25,50
sSwordStrR,1,6,11,16,22
sSwordAtkR,1,6,11,16,22
sSwordIntR,1,3,5,8,12

Example1.csv

sSwordName,lvlReq,minAtk,maxAtk,atkRate,sPrice,sValue,strReq,atkReq,intReq
Wooden Shortsword,1,0,4,0,10,5,1,1,1
Bronze Shortsword,3,0,6,2,20,10,6,6,3
Iron Shortsword,5,0,10,3,40,18,11,11,5
Steel Shortsword,6,0,14,4,60,25,16,16,8
Titanium Shortsword,10,0,20,6,100,50,22,22,12

Как я уже говорил в cpp, я действительно очень ценю любого, кто может помочь мне перевести этот код в идеальное рабочее состояние.... Так же как и любой, кто хочет поделиться идеями, чтобы улучшить его общий поток ..

Спасибо всем, Leaum

Внешние ссылки:

Example.cpp - http://pastebin.com/URWTGVq6 Example.csv - http://pastebin.com/924wvVX2

1 Ответ

1 голос
/ 27 августа 2011

Вам нужна функция, которая, получившая строку, содержащую значения, разделенные запятыми, вернет вектор этих значений (в виде строк). Затем, когда у вас есть этот вектор, вы можете выполнить другую необходимую обработку (игнорирование первого столбца, преобразование строк в целые числа и т. Д.)

Вот эта функция.

#include <vector>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;

vector<string> split_at_commas(const string& row)
{
  vector<string> res;
  istringstream buf(row);
  string s;
  while (getline(buf, s, ','))
    res.push_back(s);
  return res;
}

int main()
{
  vector<string> v = split_at_commas("broad sword,abc,123");
  cout << v[0] << '\n' << v[1] << '\n' << v[2] << '\n';
}

Выход:

широкий меч
а
123

Когда вы сталкиваетесь с такой трудной проблемой, она помогает разбить ее на более мелкие части. Глядя на вашу проблему, очевидно, что вам нужна функция для разделения строк на запятые, поэтому забудьте об остальной части проблемы и сначала напишите эту функцию. Затем, когда он написан и работает, примените его к остальной части проблемы.

EDIT

Вот, например, как вы могли бы использовать вышеуказанную функцию для присвоения значений вашему массиву sSwordLvlR

// read the next line from csv file
vector<string> values = split_at_comma(line);
if (values[0] == "sSwordLvlR") // are we at the sSwordLvlR row?
{
  for (int i = 1; i < values.size(); ++i) // starting at the second column
  {
    sSwordLvlR[i - 1] = convert_string_to_integer(vector[i]);
  }
}

convert_string_to_integer - это еще одна функция, которую вы должны написать, и еще один пример того, как вы должны разбить сложную пробу, написав меньшие функции, которые затем вы можете использовать вместе, чтобы решить большую проблему.

EDIT

Чтобы использовать эту функцию для всего файла CSV, вы должны читать ваш файл по одной строке за раз и применять функцию split_at_commas к каждой строке. Как это

string row;
while (getline(wInv, row))
{
  vector<string> values = split_at_commas(row);
  // do something depending on the values you've got
}

Надеюсь, это поможет.

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