C++ csv 파일 읽기 및 파싱 방법

C++ ofstream/ifstream을 이용한 CSV 파일 읽는 방법



오늘은 C++ 에서 ofstream/ifstream을 이용하여 CSV 파일 파싱 및 읽는 방법을 알아보도록 하겠습니다. 그 전에 우선 ofstream/ifstream 함수에 대해서 알아보도록 하겠습니다.


 

출처http://blog.naver.com/dolicom?Redirect=Log&logNo=10086114631

 

ofstream

 

n  파일로부터 읽어들이거나 쓰기 위해 사용되는 특수한 객체를 ofstream객체라 합니다.

n  ofstream 객체는 iostream 객체로부터 파생되었습니다.

n  파일에 쓰려면 ofstream 객체를 만들고 디스크의 특정 파일과 연결지어야 합니다.

n  ofstream 객체를 사용하려면 먼저 프로그래머는 #include <fstream.h>를 포함해야 합니다.

 

 

조건을 나타내는 상태

 

n  iostream 객체는 입력과 출력 상태를 알리는 플래그를 가지고 있습니다.

n  불린 함수 eof(), bad(), fail(), good()를 사용하여 이 플래그들을 검사할 수 있습니다.

-       eof() : iostream 객체가 EOF를 만나면 참값을 반환합니다.

-       bad() :  유효하지 않은 연산자를 시도하려면 참값을 반환합니다.

-       fail() : bad() 함수가 실패하면

-       good() : 위의 세 개의 함수가 거짓을 참을 반환합니다.

 

입출력을 위한 파일 열기


n  만약 ttext.txt 파일을 ofstream 객체로 열기 위해 ofstream 객체의 인스턴스를 선언하고 매개 변수로 파일 이름을 전달합니다.

-       ofstream fout(text.txt);

n  입력용으로 열기 위한 방법

-       ifstream fin(text.txt);

n  close()

-       읽기용이나 쓰기용, 읽고 동시에 쓰기용으로 열어놓은 파일은 입출력을 마친 뒤 사용을 합니다.


그럼 위의 문법적인 내용을 가지고 실제 코드에서 어떻게 사용하는지 한번 알아보도록 하겠습니다.


우선   C++ 빈 프로젝트를 선언하여 주시고 아래와 같이 코드를 작성하여 주십시오.


 

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

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

#include <iostream>

#include <fstream>

#include <string>

#include <vector>

#include <sstream>

#include <istream>

 

using namespace std;

 

//csv 파일안에 있는 데이터를 읽어서 vector 저장한다.

vector<string> csv_read_row(istream &file, char delimiter);

 

int main(int argc, char *argv[])

{

    //ifstream 파일을 읽게 해주는 함수로써 ifstream (파일명 or 경로)

    ifstream file("C:\\Users\\Desktop\\test.csv"); 

 

    if (file.fail())  //만약 bad() 함수가 실패 하면..

    {

        return (cout << "해당 경로에 위치하는 파일이 존재하지 않습니다." << endl&& 0;

    }

        

 

    while(file.good()) //eof, bad, fail 함수가 거짓의 참을 반환할 때까지..

    {

        vector<string> row = csv_read_row(file, ',');

 

        if(!row[0].find("#")) //만약 csv 파일 안에 # 문자가 있을경우

        {

            continue//그냥 건너 뛰어라

        }

        else //#문자가 없을 경우

        {

            for(int i=0, leng=row.size()-2; i<leng; i++)

                cout << "[" << row[i] << "]" << "\t"//알맞게 출력

 

        }

        cout << endl;

    }

 

    file.close(); //파일 입출력 완료  닫아준다.

 

    return 0;

}

 

vector<string> csv_read_row(istream &file, char delimiter)

{

    stringstream ss;

    bool inquotes = false;

    vector<string> row;//relying on RVO

 

    while(file.good())

    {

        char c = file.get();

        if (!inquotes && c=='"'

        {

            inquotes=true;

        }

        else if (inquotes && c=='"'

        {

            if ( file.peek() == '"')

            {

                ss << (char)file.get();

            }

            else 

            {

                inquotes=false;

            }

        }

        else if (!inquotes && c==delimiter) 

        {

            row.push_back( ss.str() );

            ss.str("");

        }

        else if (!inquotes && (c=='\r' || c=='\n') )

        {

            if(file.peek()=='\n') { file.get(); }

            row.push_back( ss.str() );

            return row;

        }

        else

        {

            ss << c;

        }

    }

}

Colored by Color Scripter

cs

 


그리고 이와 같이 코드를 작성 하였다면 바탕화면에 test.csv 파일을 만들어 주세요. 안의 내용은 아무거나 입력해서 저장하여 주시면 됩니다.




 

그리고 해당 소스코드를 실행시켜 주시면 아래와 같이 프로그램이 작동하면서 아래와 같은 출력결과가 나타나게 됩니다.



 

이렇게 해서 간단히 C++을 이용하여 csv 파일 읽는 방법을 알아 보았습니다. 감사합니다.



참고로 위 소스코드는 http://www.zedwood.com/article/cpp-csv-parser 해당 사이트의 소스코드를 참고해서 사용한겁니다~~


728x90

'C++ > C++ 문법' 카테고리의 다른 글

[C++] 구조체 및 클래스 객체 STL map 클래스에 저장하는 방법  (0) 2018.06.21
[C++] STL map 사용 법  (0) 2018.06.20
[C++]참조자의 이해  (0) 2018.05.10
[C++] 가변인수함수  (0) 2018.05.10
[C++] 자료형 bool 형식  (0) 2018.05.09

이 글을 공유하기

댓글

Designed by JB FACTORY