21-12-07-CsvHelper사용법

2021.12.07_CsvHelper사용법

목차

  1. CsvHelper설치
  2. 기본소스

    • 결과확인하기
  3. 다른 자료형 받아오기

    • 기본예제
    • 내 소스에 적용해보기
    • 결과확인

1. CsvHelper설치

image-20211207091901259

  • NuGet 패키지 관리 클릭

image-20211207091851100

  • CsvHelper 검색 후 설치 진행

2. 기본소스

  • Before

    using System;
    
    namespace csvHelperTest
    {
      class Program
      {
          static void Main(string[] args)
          {
              using (var reader = new StreamReader("path\\to\\file.csv"))
              using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
              {
                  csv.Context.RegisterClassMap<FooMap>();
                  var records = csv.GetRecords<Foo>();
              }
          }
      }
      public class Foo
      {
          public int Id { get; set; }
          public string Name { get; set; }
      }
    
      public sealed class FooMap : ClassMap<Foo>
      {
          public FooMap()
          {
              Map(m => m.Id);
              Map(m => m.Name);
          }
      }
    }
  • After

    using System;
    
    namespace csvHelperTest
    {
      class Program
      {
       private string _path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "@/csv/file.csv";
          static void Main(string[] args)
          {
              using (var reader = new StreamReader(_path))
              using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
              {
                  csv.Context.RegisterClassMap<FooMap>();
                  var records = csv.GetRecords<Foo>();
              }
          }
      }
      public class Foo
      {
          public int Id { get; set; }
          public string Name { get; set; }
      }
    
      public sealed class FooMap : ClassMap<Foo>
      {
          public FooMap()
          {
              Map(m => m.Id);
              Map(m => m.Name);
          }
      }
    }

image-20211207092957412

  • 위와 같이 file.csv파일이 존재해야함

결과 확인하기

image-20211207093204300

  • 기본적인 자료형의 경우는 잘 받아옴

3. 다른 자료형 받아오기

image-20211207094400140

  • 데이터가 enum 타입인 경우
    public enum ClassInfo
    {
        oneGrade,
        twoGrade,
        threeGrade
    }
    public class Foo
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ClassInfo Class { get; set; }
    }
    public sealed class FooMap : ClassMap<Foo>
    {
        public FooMap()
        {
            Map(m => m.Id);
            Map(m => m.Name);
            Map(m => m.Class);
        }
    }

기본예제

void Main()
{
    using (var reader = new StreamReader("path\\to\\file.csv"))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        csv.Context.RegisterClassMap<FooMap>();
        csv.GetRecords<Foo>().ToList().Dump();
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Json Json { get; set; }
}

public class Json
{
    public string Foo { get; set; }
}

public class JsonConverter<T> : DefaultTypeConverter
{
    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        return JsonConvert.DeserializeObject<T>(text);
    }

    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        return JsonConvert.SerializeObject(value);
    }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id);
        Map(m => m.Name);
        Map(m => m.Json).TypeConverter<JsonConverter<Json>>();
    }
}

내 소스에 적용해보기

ClassInfoConverter class

  • Before

    public class JsonConverter<T> : DefaultTypeConverter
    {
      public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
      {
          return JsonConvert.DeserializeObject<T>(text);
      }
    
      public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
      {
          return JsonConvert.SerializeObject(value);
      }
    }
  • After

      public class ClassInfoConverter<T> : DefaultTypeConverter
      {
          public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
          {
             // return ClassInfoConverter.DeserializeObject<T>(text);
             return Enum.Parse<ClassInfo>(text);
          }
    
          public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
          {
              //return ClassInfoConverter.SerializeObject(value);
              return value.ToString();
          }
      }

FooMap class 변경

  • Before

      public sealed class FooMap : ClassMap<Foo>
      {
          public FooMap()
          {
              Map(m => m.Id);
              Map(m => m.Name);
              Map(m => m.Class);
          }
      }
  • After

      public sealed class FooMap : ClassMap<Foo>
      {
          public FooMap()
          {
              Map(m => m.Id);
              Map(m => m.Name);
              Map(m => m.Class).TypeConverter<ClassInfoConverter<ClassInfo>>();
          }
      }

    결과 확인하기

    image-20211207095858218


Written by@[KyeongMinPark]
Docker, C++, C#, Java, Golang으로 개발 모니터링운영 및 개발, 자원수집기 Beat & Exporter 개발 Gitlab Runner CI/CD & Hugo 연동과 테스트코드및 등을 공부와 개발중 ORM, TDD, BDD, DDD, DesignPattern, WebAssembly Studying

GitHub