Csvhelper: 카운트 λ°›κΈ°

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

#92에 λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 그런데 5년이 λ„˜μ€ 문제λ₯Ό λΆ€λ”ͺν˜€μ•Ό ν•˜λŠ” 건지 잘 λͺ¨λ₯΄κ² μ–΄μ„œ μƒˆλ‘œ ν•˜λ‚˜ λ§Œλ“€κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ—΄κ±°λœ λ ˆμ½”λ“œμ—μ„œ Count() λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ»€μ„œκ°€ λκΉŒμ§€ κ°€κ³  λ ˆμ½”λ“œμ— λŒ€ν•œ μΆ”κ°€ operation/ foreach 루프가 아무 것도 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ μ½”λ“œμ˜ κ°œμš”λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€

````C#
var myCSV = μƒˆλ‘œμš΄ CsvReader(File.OpenText(txtBox_CSVFile.Text));
myCSV.Configuration.RegisterClassMap();

var record = new MyRecordClass();
var allRecords = myCSV.EnumerateRecords(record);
int recordsLength = allRecords.Count<MyRecordClass>();

foreach (var r in allRecords)
{
    /* some read/write operation here
    */
    scannedCSVEntry++;
    progress.value = scannedCSVEntry/recordsLength;
}

````

recordsLength λŠ” ν•­λͺ©μ„ μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ 진행λ₯  ν‘œμ‹œμ€„μ„ μ—…λ°μ΄νŠΈν•΄μ•Ό ν•˜λ―€λ‘œ μ—¬κΈ°μ—μ„œ μ€‘μš”ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

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

진행λ₯  ν‘œμ‹œ 쀄을 μ—…λ°μ΄νŠΈν•˜λ €λ©΄ 전체 νŒŒμΌμ„ λ¨Όμ € 읽지 μ•Šκ³  큰 νŒŒμΌμ—μ„œ stream.Position νš¨κ³Όμ μž…λ‹ˆλ‹€.

using(StreamReader sr = File.OpenText(txtBox_CSVFile.Text))
{
   var csvReader = new new CsvHelper.CsvReader(sr);
    while (csvReader.Read())
    {
         double progress = (double)sr.BaseStream.Position / sr.BaseStream.Length;
    }
}

GetRecordsμ—μ„œλ„ μž‘λ™ν•΄μ•Ό ν•˜μ§€λ§Œ ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

foreach(var record in csvReader.GetRecords<MyRecordClass>())
{
    double progress = (double)sr.BaseStream.Position / sr.BaseStream.Length;
}

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

λͺ‡ 가지 방법이 μžˆμŠ΅λ‹ˆλ‹€.

  1. ToList λ₯Ό μˆ˜ν–‰ν•˜μ—¬ 전체λ₯Ό λ©”λͺ¨λ¦¬λ‘œ κ°€μ Έμ˜΅λ‹ˆλ‹€. 그런 λ‹€μŒ Count ν¬ν•¨ν•˜μ—¬ 데이터에 λŒ€ν•΄ μ—¬λŸ¬ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. 전체 νŒŒμΌμ„ ꡬ문 λΆ„μ„ν•©λ‹ˆλ‹€. νŒŒμ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ 전체 νŒŒμΌμ„ μ‚΄νŽ΄λ³΄κ³  λ ˆμ½”λ“œλ₯Ό 계산할 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 클래슀 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ μœ ν˜• λ³€ν™˜μ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 맀우 λΉ λ¦…λ‹ˆλ‹€.
  3. 파일의 쀄 끝을 κ³„μ‚°ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. 그런 λ‹€μŒ Context.RawRow 속성을 μ‚¬μš©ν•˜μ—¬ 진행 상황을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

감사 ν•΄μš”,
κ²°κ΅­ 방법 2λ₯Ό μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€.

C# StreamReader sr = File.OpenText(txtBox_CSVFile.Text); int recordsLength = 0; while(sr.ReadLine() != null) { ++recordsLength; } recordsLength--; // discount 1 line because there are column headers in first row. Console.WriteLine("recordsLength : " + recordsLength); sr.Close();

EnumerateRecords() λŠ” λͺ¨λ“  ν•­λͺ©μ— μˆ˜λΆ„μ„ κ³΅κΈ‰ν•œ ν›„ μŠ€νŠΈλ¦Όμ„ μžλ™μœΌλ‘œ λ‹«μŠ΅λ‹ˆκΉŒ? ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ ν›„ Close() λ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

λ‚΄ μ œμ•ˆμ€ using λΈ”λ‘μœΌλ‘œ λž˜ν•‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

using(StreamReader sr = File.OpenText(txtBox_CSVFile.Text))
{
    int recordsLength = 0;
    while(sr.ReadLine() != null)
    {
        ++recordsLength;
    }
    recordsLength--; // discount 1 line because there are column headers in first row.
    Console.WriteLine("recordsLength : " + recordsLength);
}

진행λ₯  ν‘œμ‹œ 쀄을 μ—…λ°μ΄νŠΈν•˜λ €λ©΄ 전체 νŒŒμΌμ„ λ¨Όμ € 읽지 μ•Šκ³  큰 νŒŒμΌμ—μ„œ stream.Position νš¨κ³Όμ μž…λ‹ˆλ‹€.

using(StreamReader sr = File.OpenText(txtBox_CSVFile.Text))
{
   var csvReader = new new CsvHelper.CsvReader(sr);
    while (csvReader.Read())
    {
         double progress = (double)sr.BaseStream.Position / sr.BaseStream.Length;
    }
}

GetRecordsμ—μ„œλ„ μž‘λ™ν•΄μ•Ό ν•˜μ§€λ§Œ ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

foreach(var record in csvReader.GetRecords<MyRecordClass>())
{
    double progress = (double)sr.BaseStream.Position / sr.BaseStream.Length;
}

λ‚˜λŠ” λ‹Ήμ‹ μ˜ 해결책을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€

foreach(var record in csvReader.GetRecords<MyRecordClass>())
{
    double progress = (double)sr.BaseStream.Position / sr.BaseStream.Length;
}

λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™ν•˜μ§€ μ•Šμ•˜λ‹€.
ν•˜μ§€λ§Œ 당신은 이것을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€

foreach(var record in csvReader.GetRecords<MyRecordClass>())
{
    double progress = (double)csvReader.Context.CharPosition / csvReader.Context.CharsRead;
}

μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μ–»κΈ° μœ„ν•΄

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