2012-06-28

C# 텍스트파일을 읽어서 2차원 배열로 만들기

성능 데이터가 기록된 텍스트 파일을 열어서 엑셀에 붙여넣기 하기 위해 만듬.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
namespace automating_system_report
{
    #region RAWDATASTRUCT
    public class RAWDATASTRUCT
    {
        public int col, row;      // FieldValue가 있던, raw 파일 내에서의 위치
        public string FieldValue; // rawData 하나의 값
    }
    #endregion /RAWDATASTRUCT

    #region RawDataLOADER
    /// 
    /// XML에 추가할 RAWDATA를 로드하고, list에 등록하는 클래스
    /// fieldDelimiter의 값에 따라 필드구분을 하려고 했으나, 기본값 " "으로만 동작.
    /// 
    class RawDATALoader:FileManager
    {
        #region public Member
        public string filedDelimiter = " ";//텍스트파일의 필드구분자, 기본값 spacebar 를 필드 구분으로 함.
        public List rawdataList = new List();

        #endregion /public Member

        #region public Method
        public bool Load(string filename) //
        {
            FullPath = filename; 
            if (ExistFile)
            {
                FileStream fs = File.OpenRead(filename);
                StreamReader sr = new StreamReader(fs);
                int row = 0;// 줄 수
                while (sr.Peek() > -1) //한줄 한줄 배열에 저장
                {
                    SaveToList(sr.ReadLine(), row); 
                    row ++;
                }
                sr.Close();
                fs.Close();
                return true;
            }
            return false;
        }
        public string[,] To2DArray()
        {
            int SizeCol = rawdataList[rawdataList.Count - 1].col;
            int SizeRow = rawdataList[rawdataList.Count - 1].row;
            string[,] rtnArray = new string[SizeRow + 1, SizeCol + 1];
            int i = 0;
            foreach (RAWDATASTRUCT r in rawdataList)
            {
                rtnArray[r.row, r.col] = r.FieldValue;
            }
            return rtnArray;
        }
        #endregion /public Method

        #region private Method
        private bool SaveToList(string buf,int row)
        {
            int whereIsDelimiter = 0; //필드구분자의 문자열 내에서 위치
            int col = 0; // 필드 순번..
            string cropElement;
            buf=buf.Trim(); //앞이나 뒤에서 공백을 필드로 오인하는 것을 방지하기 위해 앞뒤 공백 삭제

            try
            {
                do
                {
                    whereIsDelimiter = buf.IndexOf(filedDelimiter);  //맨 왼쪽 필드 한 개의 길이를 찾기 위해,공백을 찾음.
                    if (whereIsDelimiter > -1) //공백을 찾은 경우
                    {
                        cropElement = buf.Substring(0, whereIsDelimiter); // 찾은 단일 필드를 저장하기 위해 임시로 변수에 저장
                        buf = buf.Remove(0, whereIsDelimiter); //다음 반복을 위해 buf에서 크롭한 부분 제거
                    }
                    else//공백을 못찾은 마지막 필드인 경우
                    {
                        cropElement = buf;
                    }

                    RAWDATASTRUCT fieldAdd = new RAWDATASTRUCT(); //crop한 필드를 저장하기 위해 임시 RAWDATASTRUCT를 만듬.
                    fieldAdd.FieldValue = cropElement;
                    fieldAdd.row = row; //텍스트 문서상의 줄 위치, 2차원 배열 생성시 사용됨
                    fieldAdd.col = col; //컬럼값, 2차원 배열 생성시 사용됨
                    rawdataList.Add(fieldAdd);//crop한 필드를 리스트에 저장
                    buf = buf.TrimStart();              //문자열 앞의 의미없는 공백제거
                    col += 1;

                } while (buf != null & whereIsDelimiter > -1); //buf가 null일 때까지, 더 이상 필드가 없을 때까지 반복.
                return true;
            }
            catch (Exception e) 
            {
                MessageBox.Show(e.Message);
                return false;
            }
        }
        #endregion /private Method
    }
    #endregion /RawDataLOADER
}
//

댓글 없음:

댓글 쓰기