본문 바로가기
2/[ C# ]

[C#] csv load using DataTable

by Kieran_Han 2022. 6. 3.
using ExcelDataReader;
using System;
using System.Data;
using System.IO;
using System.Threading.Tasks;

namespace CSV_test
{
    class Program
    {
        static void Main()
        {
            // 경로 내 csv를 저장할 빈 list 생성
            List<string> listpath = new List<string>();

            // openFileDialog로 처음에 경로 지정 ↓예시
            string path = "C:\\Users\\KIERAN\\Desktop\\C# Test\\Data";

            if (Directory.Exists(path))
            {
                DirectoryInfo di = new DirectoryInfo(path);
                
                /// 지정한 경로 내 하위 폴더를 포함하여 csv 확장자만 불러옴
                var files = di.EnumerateFiles("*.csv", SearchOption.AllDirectories);

                /// listpath라는 리스트에 파일들 경로 하나씩 저장 ex) listpath[0]
                foreach (var item in files)
                {
                    listpath.Add(item.ToString());
                }
            }

            /// Batch File 위치를 listpath list에서부터 하나씩 가져와 지정함
            var stream1 = File.Open(listpath[0], FileMode.Open, FileAccess.Read);

            /// stream(경로)으로부터 DataSet이된 Excel을 DataTable형식으로 바꿈 for 특정 Column, Row로부터 값을 가져오기 위함
            DataTable Batch1_Excel = ExcelToDataTable(stream1)[0];

            var aaaa = Batch1_Excel.DefaultView.ToTable(false, "Excel Features").Rows[0];
            var bbbb = aaaa[0];

            Console.WriteLine(aaaa);
        }

        /// <summary>
        /// listpath list로부터 경로를 stream으로 가져와서 DataSet으로 Excel을 가져옴
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        static DataTableCollection ExcelToDataTable(FileStream stream)
        {
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

            using (var reader = ExcelReaderFactory.CreateCsvReader(stream))
            {
                var result = reader.AsDataSet(new ExcelDataSetConfiguration()
                {
                    ConfigureDataTable = (data) => new ExcelDataTableConfiguration()
                    {
                        UseHeaderRow = true
                    }
                });

                return result.Tables;
            }
        }
    }
}