본문 바로가기

카테고리 없음

[MFC] csv파일 생성하기







MFC 윈도우 프로그래밍을 하다보면 특정 데이터들을 csv파일 형태로 

뽑아내야 할 때가 있습니다. 엑셀에서도 열어서 쉽게 자료분석이 가능하기 때문이죠.

아직 배우고 있는 중이고 구현을 목적으로 짠 코드라서 많이 지저분해 보이지만.

csv파일 생성에 필요한 기초적인 내용들이 있으니 참고하시기 바랍니다.

궁금하신 사항 댓글로 달아 놓으시면 답변드리겠습니다. 고수분들의 조언도 환영입니다.


핵심사항


* 파일명 및 경로지정 : 문자열변수.Format()

* 파일 열기 : fopen(파일경로,접근형식)

* 내용 기록 : fwprintf()


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
void CDirectionChange2Dlg::OnBnClickedButtonSaveCsv()
{
    //_wsetlocale(LC_ALL, L"kor");
    time_t timer;
    timer = time(NULL);
    struct tm t;
    localtime_s(&t,&timer); 
// 생성되는 csv 파일명에 시간을 넣기 위해 선언해준 넘들 <time.h> 추가필요
 
    wchar_t* wchar_str;
    char*    char_str; 
    int      char_str_len;
    CString strFileName=_T("");
    strFileName.Format(_T("c:\\DirectionChange\\%d%d%d_FILE.csv"),t.tm_year+1900,t.tm_mon+1,t.tm_mday); 
// 만들 파일의 경로및 파일명 설정
 
    wchar_str = strFileName.GetBuffer(strFileName.GetLength());
    char_str_len = WideCharToMultiByte(CP_ACP, 0, wchar_str, -1NULL0NULLNULL);
    char_str = new char[char_str_len];  //메모리 할당
    WideCharToMultiByte(CP_ACP, 0, wchar_str, -1, char_str, char_str_len, 0,0); 
// 위 4줄은 문자열변수 내용을 char로 변환하는 과정
 
 
    FILE* fp ;
    if((fp=fopen(char_str, "w+")) == NULL// fopen()의 두번째 파라미터 "w+"는 읽기,쓰기 및 파일이 없을시 생성 하는 기능
    {
        AfxMessageBox(_T("CSV파일을 생성 할 수 없습니다."));
        return;
        fclose(fp);
        fp= NULL;
    }
    else
    {
//    fputs("\xEF\xBB\xBF",fp); 
    int i=0;
    int j=0;
    int count=0;
    while(i<509)    
    {
        if( CSV[i].Dut[j]<0)
        {
    fwprintf(fp,_T("0,0"));
    fclose(fp);
    fflush(fp);
    fp= NULL;
    AfxMessageBox(_T("CSV파일 생성 완료"));
    break;
 
        }
        
        if(CSV[i].Dut[j]!=0 && CSV[i].Dut[j]>0)
        {
                
            if(count==0)
            {
            fwprintf(fp,_T("%f,%f,%f,%d,%s,X offset,%f \n") , CSV[i].X_Coordinate[j] , CSV[i].Y_Coordinate[j] , CSV[i].Dut[j] , CSV[i].Probe[j] , CSV[i].Direction[j],m_Edit_X_Offset);
            count+=1;
            }
            else if (count==1)
            {
            fwprintf(fp,_T("%f,%f,%f,%d,%s,Y offset,%f \n") , CSV[i].X_Coordinate[j] , CSV[i].Y_Coordinate[j] , CSV[i].Dut[j] , CSV[i].Probe[j] , CSV[i].Direction[j],m_Edit_Y_Offset);
            count+=1;
            }
            else
                fwprintf(fp,_T("%f,%f,%f,%d,%s \n") , CSV[i].X_Coordinate[j] , CSV[i].Y_Coordinate[j] , CSV[i].Dut[j] , CSV[i].Probe[j] , CSV[i].Direction[j]);
            if(j<29)
            j++;    
            else
                i++;
        }
        else if (CSV[i].Dut[j]==0.0)
        {
            i++;
            j=0;    
        }
        
    }
 
    fwprintf(fp,_T("0,0"));
    fclose(fp); 
    fflush(fp);
    fp= NULL;
    AfxMessageBox(_T("CSV파일 생성 완료"));
    }
    // TODO: Add your control notification handler code here
}
cs