336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C# CSV 파일 읽기(CSV Reader)



원래 XML을 사용하려고 했는데, 


읽는 속도가 CSV가 빠를것 같아서 간단히 구현을 하려합니다.


다음과 같은 데이터로 테스트를 하겠습니다.


ID앞에 #을 붙인 이유는 첫 라인이 키라는것을 명시하기 위함입니다.


* 파싱할 때 첫 라인을 키로 잡아도 됩니다.




만든 테이블을 CSV로 저장을 하였다면, 


인코딩을 UTF8로 바꿔주셔야 합니다.


그래야 모든 언어에서 오류없이 작동합니다.


자동 저장은 http://slway000.tistory.com/17 를 참고하세요.


우선 수작업으로 하기 위해, 메모장으로 열어서 다음처럼


인코딩을 UTF-8로 바꿔줍니다.




다음은 C#으로 작성한 코드 입니다. 


(테스트 코드를 만들고 나중에 유니티에 적용할 예정입니다.)


파일을 읽어들여 한라인씩 읽어서 


키와 값들을 구분시켜 처리하도록 합니다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace CSVParse
{
    class Program
    {
        static void Main(string[] args)
        {
            string strFile= "testcsv.csv";

            using (FileStream fs = new FileStream(strFile, FileMode.Open))
            {
                using (StreamReader sr = new StreamReader(fs, Encoding.UTF8, false))
                {
                    string strLineValue = null;
                    string[] keys = null;
                    string[] values = null;

                    while ((strLineValue = sr.ReadLine()) != null)
                    {
                        // Must not be empty.
                        if (string.IsNullOrEmpty(strLineValue)) return;

                        if (strLineValue.Substring(0, 1).Equals("#"))
                        {
                            keys = strLineValue.Split(',');

                            keys[0] = keys[0].Replace("#", "");

                            Console.Write("Key : ");
                            // Output
                            for (int nIndex = 0; nIndex < keys.Length; nIndex++)
                            {
                                Console.Write(keys[nIndex]);
                                if (nIndex != keys.Length - 1)
                                    Console.Write(", ");
                            }

                            Console.WriteLine();

                            continue;
                        }

                        values = strLineValue.Split(',');

                        Console.Write("Value : ");
                        // Output
                        for (int nIndex = 0; nIndex < values.Length; nIndex++)
                        {
                            Console.Write(values[nIndex]);
                            if (nIndex != values.Length - 1)
                                Console.Write(", ");
                        }

                        Console.WriteLine();
                    }
                }                
            }            
        }
    }
}



결과화면입니다.




아주 간단한 예제이기 떄문에 실제 데이터 파싱할 경우


예외처리가 필요할 수 있습니다. 



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



엑셀 VBA를 이용해 CSV를 UTF-8로 Export하기

(Office 2013 기준)


기본적으로 엑셀 시트를 CSV로 저장하게 되면 인코딩이 ANSI로 되어있습니다.


< CSV로 저장했을 때의 인코딩 >


인코딩을 바꾸려면 모메장으로 열고 인코딩을 직접 바꿔주어야 하는데


데이터가 많을 경우 시간이 걸리는 작업입니다.


VBA를 이용하여 매크로를 만들면 이런 번거러운 작업을 없앨 수 있습니다.


테스트를 위해  이전 포스팅 한 데이터(VLOOKUP 사용하기)를 이용하여 하도록 하겠습니다.


우선 개발도구 탭에 있는 Visual Basic을 클릭합니다.


(개발도구 탭이 없으신 분은 여기 눌러Step 3을 보시기 바랍니다)




그럼 다음과 같이 개발 툴이 나타납니다.




매크로를 만들기 위해서 


상단 메뉴 삽입 -> 모듈 을 클릭합니다.




그리고 다음 사이트를 들어가서 코드를 모두 복사합니다.


그리고 붙여넣기를 해줍니다.


링크 클릭




이제 다시 엑셀 파일로 돌아옵니다.


버튼을 하나 만들어서 매크로가 실행되게끔 해야합니다.


개발도구에서 삽입을 누르고, 단추(버튼)을 클릭합니다.


그리고 아무 셀쪽에 가서 드래그를 하게 되면




이런 창이 나타나게 됩니다.


WriteCSV가 보이는데, 이게 아깝 복사/붙여넣기 한 매크로 입니다.


선택하시고, 매크로 위치는.. 그냥 현재 통합 문서로 하도록 하겠습니다.


그리고 확인.




창이 닫아지면 아까 드래그 해서 만든 버튼이 저렇게 보여집니다.




단추를 딱 클릭을 하면 다른 이름으로 저장 창이 나타나는데,


파일 형식이 바로 CSV로 되어있습니다. 


아무 이름이나 하고 저장을 할께요.




저장이 완료되면 다음처러 "다 되었다"라고 창이 하나 뜹니다.




이제 확인만 하면 됩니다.


저장된 파일을 메모장으로 열고, 


다른 이름으로 저장을 눌러보면 인코딩을 볼수 있습니다.


UTF-8로 되어있습니다.  잘 되네요.



관심 있는 분들은 VBA 검색하셔서 공부해보세요.


자동화 해두면 나중에 아주 많이 편리하니 도움되실 꺼에요.



** 추가 **


해당 링크로 가서 받은 코드에 약간의(?) 문제가 있습니다.


최대 10라인만 되도록 되어있더라구요.


코드 조금 수정하겠습니다.


아래 빨간색으로 된 부분만 수정/추가해 주시면 되겠습니다.


(다른 방법도 있겠지만, 간단히 처리했습니다.)


.....

For r = 1 To 10000

s = "" 

c = 1 

 If IsEmpty(wkb.Cells(r, c).Value) Then 

 Exit For 

 End If 

 While Not IsEmpty(wkb.Cells(r, c).Value) 

 s = s & wkb.Cells(r, c).Value & ","

 c = c + 1 

 Wend 

 BinaryStream.WriteText s, 1

 Next r

....





'게임 프로그래밍 > 엑셀' 카테고리의 다른 글

[엑셀] 램덤 함수(RAND, RANDBETWEEN)  (0) 2016.05.31
[엑셀] 중복값 제거하기.  (0) 2016.05.31
[엑셀]VLOOKUP 사용하기  (0) 2016.05.22
[엑셀]엑셀 드롭다운 만들기  (0) 2016.05.22
[엑셀]이름 정의  (2) 2016.05.22

+ Recent posts