Csvhelper: CSV에 ν•„λ“œκ°€ μ—†μœΌλ©΄ μƒμˆ˜κ°€ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 05μ›” 11일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: JoshClose/CsvHelper

항상 μƒμˆ˜ κ°’μœΌλ‘œ 좜λ ₯ 클래슀의 ν•œ ν•„λ“œλ₯Ό μ±„μš°λŠ” 맡을 μž‘μ„±ν•˜λ €κ³  ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ“€μ–΄μ˜€λŠ” csv νŒŒμΌμ— ν•„λ“œκ°€ μžˆλŠ” κ²½μš°μ—λ§Œ μž‘λ™ν•©λ‹ˆλ‹€.

μ—¬κΈ° λ‚΄κ°€ ν•˜κ³  싢은 것에 λŒ€ν•œ ν…ŒμŠ€νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. (ConstantTests.cs의 μΆ”κ°€ ν…ŒμŠ€νŠΈ)

        [TestMethod]
        public void ConstantNoFieldTest()
        {
            var rows = new Queue<string[]>();
            rows.Enqueue(new[] { "Id"});
            rows.Enqueue(new[] { "1"});
            rows.Enqueue(new[] { "2"});
            rows.Enqueue(null);
            var parser = new ParserMock(rows);

            var csv = new CsvReader(parser);
            csv.Configuration.RegisterClassMap<TestStringMap>();
            var records = csv.GetRecords<Test>().ToList();

            csv.Configuration.MissingFieldFound = null;

            Assert.AreEqual(1, records[0].Id);
            Assert.AreEqual("constant", records[0].Name);
            Assert.AreEqual(2, records[1].Id);
            Assert.AreEqual("constant", records[1].Name);
        }

(참고둜 TestStringMap은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

private sealed class TestStringMap : ClassMap<Test>
        {
            public TestStringMap()
            {
                Map( m => m.Id );
                Map( m => m.Name ).Constant( "constant" );
            }
        }

)

feature

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜λŠ” 이것을 κΈ°λŠ₯ μš”μ²­μœΌλ‘œ 넣을 κ²ƒμž…λ‹ˆλ‹€. μž‘μ„±ν•  λ•Œ 속성을 지정할 ν•„μš”λ„ μ—†μœΌλ©° μž‘λ™ν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것이 단지 μ‹€μˆ˜ 일 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ§€κΈˆμ€ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Map(m => m.Name).ConvertUsing((IReaderRow row) => "the constant");

λͺ¨λ“  5 λŒ“κΈ€

λ‚΄κ°€ μ™œ 이 일을 ν•˜κ³  싢은가? μ‚¬μš©μžκ°€ μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œ μžμ‹ μ˜ 맀핑을 μ •μ˜ν•œ λ‹€μŒ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜μ—¬ μžμ‹ μ˜ CSV 파일 ν˜•μ‹μ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. λ•Œλ‘œλŠ” 파일 ν˜•μ‹μ— λͺ¨λ“  ν•„λ“œκ°€ μ—†λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 경우 μ‚¬μš©μžλŠ” μƒμˆ˜λ₯Ό μž…λ ₯ν•˜λ €κ³  ν•˜λ©° ν•΄λ‹Ή ν•„λ“œλŠ” λ“€μ–΄μ˜€λŠ” CSV νŒŒμΌμ— μ—†μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 κΈ°λŠ₯ μš”μ²­μœΌλ‘œ 넣을 κ²ƒμž…λ‹ˆλ‹€. μž‘μ„±ν•  λ•Œ 속성을 지정할 ν•„μš”λ„ μ—†μœΌλ©° μž‘λ™ν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것이 단지 μ‹€μˆ˜ 일 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ§€κΈˆμ€ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Map(m => m.Name).ConvertUsing((IReaderRow row) => "the constant");

ν₯λ―Έλ‘­κ²Œλ„ MemeberMap.Constant() λŠ” κΈ°λ³Έ 맀핑이 인덱슀 기반인 경우 μž‘λ™ν•©λ‹ˆλ‹€. 즉, csv.Configuration.HasHeaderRecord = false λ₯Ό μ‚¬μš©ν•˜μ—¬ 맀핑이 μ•”μ‹œμ  λ˜λŠ” λͺ…μ‹œμ μœΌλ‘œ μΈλ±μŠ€μ— μ˜ν•΄ μˆ˜ν–‰λ©λ‹ˆλ‹€.

톡과 ν…ŒμŠ€νŠΈ(μœ„μ™€ 같이 Reading\ConstantTests.cs의 경우):

[TestMethod]
public void ConstantNoFieldIndexMapTest()
{
    var rows = new Queue<string[]>();
    rows.Enqueue(new[] { "1" });
    rows.Enqueue(new[] { "2" });
    rows.Enqueue(null);
    var parser = new ParserMock(rows);

    var csv = new CsvReader(parser);
    csv.Configuration.RegisterClassMap<TestStringMap>(); // implicit index-map without Header
    csv.Configuration.HasHeaderRecord = false;
    var records = csv.GetRecords<Test>().ToList();

    Assert.AreEqual(1, records[0].Id);
    Assert.AreEqual("constant", records[0].Name);
    Assert.AreEqual(2, records[1].Id);
    Assert.AreEqual("constant", records[1].Name);
}

CSVλ₯Ό POCO에 λ§€ν•‘ν•˜κ³  ν•˜λ“œ μ½”λ”©λœ ν•„λ“œλ₯Ό μΆ”κ°€ν•˜λ €κ³  ν•  λ•Œ 였늘 이 버그λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜μ€‘μ— ν•  μˆ˜λ„ μžˆμ§€λ§Œ λ‹€λ₯Έ λͺ¨λ“  속성이 μ„€μ •λ˜λŠ” 역직렬화 μ‹œμ μ—μ„œ ν•˜λŠ” 것이 더 깔끔해 λ³΄μ˜€μŠ΅λ‹ˆλ‹€. #1252κ°€ μ€‘λ‹¨λœ λΆ€λΆ„λΆ€ν„° λ‹€μ‹œ μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ–΄λ–€ κ°€μ Έμ˜€κΈ° 파일이 λ ˆμ½”λ“œλ₯Ό μƒμ„±ν–ˆλŠ”μ§€ μ‹λ³„ν•˜κΈ° μœ„ν•΄ κ°€μ Έμ˜¬ λ•Œ 각 λ ˆμ½”λ“œμ— Guid FileIdλ₯Ό μΆ”κ°€ν•˜κΈ° μœ„ν•΄ 였늘 이 κΈ°λŠ₯이 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. λ§Žμ€ 데이터λ₯Ό λ‹€λ£¨λ―€λ‘œ λ ˆμ½”λ“œλ₯Ό λ‚˜μ—΄ν•˜μ—¬ μˆ˜μ •ν•˜λŠ” 것은 λ°”λžŒμ§ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 ν•΄κ²° 방법을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.
Map(m => m.FileId).ConvertUsing(row => myGuid);

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰