무민은귀여워

csv 파일 읽고 쓰기 본문

IT/c, c++

csv 파일 읽고 쓰기

moomini 2021. 5. 18. 00:11
반응형

클래스명.h 헤더파일을 만들고 csv 파일을 읽어서 사용한다.

 

0. csv 파일 준비하기

엑셀 파일을 만들어서 csv파일로 내보내기.

내용은 아래와 같음.

 

[엑셀]

UniqueId name lane role price
int string string string int
1 Ekko top AP 6300
2 Malphite top Tank 1350
생략
 
[csv]
1
2
3
4
5
6
7
8
9
10
11
12
13
UniqueId,name,lane,role,price
int,string,string,string,int
1,Ekko,top,AP,6300
2,Malphite,top,Tank,1350
3,Master Yi,jungle,Split Pusher,450
4,Evelynn,jungle,AP,1350
5,Ahri,mid,Burst Mage,4800
6,VelKoz,mid,Poke Mage,6300
7,Vayne,bot,Hyperscale ADC,4800
8,Ezreal,bot,Mid game ADC,4800
9,Sona,bot,Enchanter,3150
10,Blitzcrank,bot,Pick,3150
 
cs

 

1. 헤더파일 만들기

GENERATESTRUCT(생성할 클래스명, column, datatype) 을 이용해서 클래스명.h 헤더파일을 만든다.

실행하면 프로젝트 폴더에 헤더파일이 생성되어 있음.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#define GENERATESTRUCT(Name, Column, DataType) \
    string a(#Name); \
    int index = 0; \
    a.append(".h"); \
    FILE* file = fopen(a.c_str(), "wt+"); \
    fprintf(file, "#pragma once\n"); \
    fprintf(file, "#include <string>\n"); \
    fprintf(file, "#include <cstdlib>\n"); \
    fprintf(file, "using namespace std;\n\n"); \
    fprintf(file, "enum E%s{\n", #Name); \
    while (index < column.size()) \
    { \
        fprintf(file, "\te%s_%s,\n", #Name, column[index].c_str()); \
        ++index; \
    } \
    fprintf(file, "};\n\n"); \
    fprintf(file, "class %s{\n", #Name); \
     \
    fprintf(file, "public:\n"); \
    index = 0; \
    while (index < column.size()) \
    { \
        fprintf(file, "\t%s Get%s() const { return %s;}\n", DataType[index].c_str(), column[index].c_str(), column[index].c_str()); \
        fprintf(file, "\tvoid Set%s(%s In%s){%s = In%s;}\n\n", column[index].c_str(), DataType[index].c_str(), column[index].c_str(), column[index].c_str(), column[index].c_str()); \
        ++index; \
    } \
    index = 0; \
    fprintf(file, "\tvoid FillData(std::vector<string>& In){\n"); \
    while (index < column.size()) \
    { \
        if(!DataType[index].compare("int")) \
            fprintf(file, "\t\tSet%s(atoi(In[e%s_%s].c_str()));\n", column[index].c_str(), #Name, column[index].c_str()); \
        else if(!DataType[index].compare("float")) \
            fprintf(file, "\t\tSet%s(atof(In[e%s_%s].c_str()));\n", column[index].c_str(), #Name, column[index].c_str()); \
        else \
            fprintf(file, "\t\tSet%s(In[e%s_%s].c_str());\n", column[index].c_str(), #Name, column[index].c_str()); \
        ++index; \
    } \
    \
    fprintf(file, "\t}\n"); \
    fprintf(file, "private:\n"); \
    index = 0; \
    while (index < column.size()) \
    { \
        fprintf(file, "\t%s %s;\n", DataType[index].c_str(), column[index].c_str()); \
        ++index; \
    } \
    fprintf(file, "};"); \
    fclose(file);
cs

 

[ 결과 헤더파일 ]

이제 LoLChampion 이라는 클래스를 사용할 수 있다!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#pragma once
#include <string>
#include <cstdlib>
using namespace std;
 
enum ELoLChampion{
    eLoLChampion_UniqueId,
    eLoLChampion_name,
    eLoLChampion_lane,
    eLoLChampion_role,
    eLoLChampion_price,
};
 
class LoLChampion{
public:
    int GetUniqueId() const { return UniqueId;}
    void SetUniqueId(int InUniqueId){UniqueId = InUniqueId;}
 
    string Getname() const { return name;}
    void Setname(string Inname){name = Inname;}
 
    string Getlane() const { return lane;}
    void Setlane(string Inlane){lane = Inlane;}
 
    string Getrole() const { return role;}
    void Setrole(string Inrole){role = Inrole;}
 
    int Getprice() const { return price;}
    void Setprice(int Inprice){price = Inprice;}
 
    void FillData(std::vector<string>& In){
        SetUniqueId(atoi(In[eLoLChampion_UniqueId].c_str()));
        Setname(In[eLoLChampion_name].c_str());
        Setlane(In[eLoLChampion_lane].c_str());
        Setrole(In[eLoLChampion_role].c_str());
        Setprice(atoi(In[eLoLChampion_price].c_str()));
    }
private:
    int UniqueId;
    string name;
    string lane;
    string role;
    int price;
};
cs

 

2. 만들어진 헤더파일을 이용하여 객체를 생성하고, csv에서 내용을 읽어 저장한다.

참고. 사용할 csv 파일은 프로젝트 폴더 안에 넣어야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "LoLChampion.h"
 
// 생략
 
std::map<int, LoLChampion> LoLChampionData;
 
// 생략
 
// 메인 안
 
// 생략
 
FILE* fp = fopen("LoLChampion.csv""rt");
 
vector<string> column;
vector<string> DataType;
 
CSVData::parse(fp, column);
CSVData::parse(fp, DataType);
 
// GENERATESTRUCT는 한번만 실행해주면 된다.
//GENERATESTRUCT(LoLChampion, column, DataType);
 
vector<string> Data;
while (CSVData::parse(fp, Data))
{
    LoLChampion data;
 
    data.FillData(Data);
    LoLChampionData.insert(make_pair(data.GetUniqueId(), data));
    Data.clear();
}
 
fclose(fp);
 
/* [ 출력하기 (아래내용) ] 
Ekko | AP | 6300
Malphite | Tank | 1350
Master Yi | Split Pusher | 450
Evelynn | AP | 1350
Ahri | Burst Mage | 4800
VelKoz | Poke Mage | 6300
Vayne | Hyperscale ADC | 4800
Ezreal | Mid game ADC | 4800
Sona | Enchanter | 3150
*/
for (int i = 1; i < LoLChampionData.size(); i++)
{
    cout << LoLChampionData.at(i).Getname() << " | " << LoLChampionData.at(i).Getrole() << " | " << LoLChampionData.at(i).Getprice() << endl;
}
cs

 

file.cpp
0.00MB
LoLChampion.csv
0.00MB
LoLChampion.h
0.00MB

반응형
Comments