[C#] 헤더를 사용하여 C #에서 CSV 파일 구문 분석

C #에서 CSV 파일을 구문 분석하는 기본 / 공식 / 권장 방법이 있습니까? 내 파서를 굴리고 싶지 않다.

또한 ODBC / OLE DB를 사용하여 텍스트 드라이버를 통해 CSV를 읽는 사람들의 사례를 보았으며 많은 사람들이 “단점”으로 인해 이것을 권장하지 않습니다. 이러한 단점은 무엇입니까?

이상적으로는 첫 번째 레코드를 헤더 / 필드 이름으로 사용하여 열 이름으로 CSV를 읽을 수있는 방법을 찾고 있습니다. 주어진 답변 중 일부는 정확하지만 기본적으로 파일을 클래스로 직렬화 해제합니다.



답변

도서관이 당신을 위해 모든 세부 사항을 처리하게하십시오! 🙂

FileHelpers를 확인하고 DRY를 유지하십시오-스스로 반복하지 마십시오-바퀴를 다시 발명 할 필요가 없습니다 ….

기본적으로 공개 클래스 (따라서 기본값, NULL 값 대체 등과 같은 잘 알려진 속성), 포인트를 사용하여 데이터의 형태 (CSV의 개별 줄에있는 필드)를 정의하면됩니다. 파일의 FileHelpers 엔진 및 bingo-해당 파일에서 모든 항목을 가져옵니다. 하나의 간단한 조작-뛰어난 성능!


답변

CSV 파서는 이제 .NET Framework의 일부입니다.

Microsoft.VisualBasic.dll에 대한 참조 추가 (C #에서는 잘 작동하지만 이름은 신경 쓰지 않음)

using (TextFieldParser parser = new TextFieldParser(@"c:\temp\test.csv"))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    while (!parser.EndOfData)
    {
        //Process row
        string[] fields = parser.ReadFields();
        foreach (string field in fields)
        {
            //TODO: Process field
        }
    }
}

문서는 여기에 있습니다 -TextFieldParser 클래스

PS CSV 내보내기 가 필요한 경우 CsvExport를 사용해보십시오 (Discl : I ‘m atributors).


답변

CsvHelper (내가 유지 관리하는 라이브러리)는 CSV 파일을 사용자 지정 개체로 읽습니다.

var csv = new CsvReader( File.OpenText( "file.csv" ) );
var myCustomObjects = csv.GetRecords<MyCustomObject>();

때로는 읽으려는 객체를 소유하지 않은 경우가 있습니다. 이 경우 클래스에 속성을 넣을 수 없으므로 매끄럽게 매핑 할 수 있습니다.

public sealed class MyCustomObjectMap : CsvClassMap<MyCustomObject>
{
    public MyCustomObjectMap()
    {
        Map( m => m.Property1 ).Name( "Column Name" );
        Map( m => m.Property2 ).Index( 4 );
        Map( m => m.Property3 ).Ignore();
        Map( m => m.Property4 ).TypeConverter<MySpecialTypeConverter>();
    }
}

편집하다:

CsvReader는 이제 CultureInfo가 컨스트럭터 ( https://github.com/JoshClose/CsvHelper/issues/1441 ) 로 전달되어야 합니다.

예:

var csv = new CsvReader(File.OpenText("file.csv"), System.Globalization.CultureInfo.CurrentCulture);


답변

비즈니스 응용 프로그램에서 codeproject.com, CSVReader 의 오픈 소스 프로젝트를 사용합니다 .

잘 작동하고 성능이 좋습니다. 내가 제공 한 링크에 대한 벤치마킹이 있습니다.

프로젝트 페이지에서 복사 한 간단한 예 :

using (CsvReader csv = new CsvReader(new StreamReader("data.csv"), true))
{
    int fieldCount = csv.FieldCount;
    string[] headers = csv.GetFieldHeaders();

    while (csv.ReadNextRecord())
    {
        for (int i = 0; i < fieldCount; i++)
            Console.Write(string.Format("{0} = {1};", headers[i], csv[i]));

        Console.WriteLine();
    }
}

보시다시피, 작업하기가 매우 쉽습니다.


답변

나는 조금 늦었지만 CSS 파일을 처리 Microsoft.VisualBasic.FileIO하는 TextFieldParser클래스 가 있는 라이브러리 를 찾았습니다 .


답변

csv 파일 만 읽어야하는 경우이 라이브러리를 권장합니다. 빠른 CSV 리더

csv 파일도 생성해야하는 경우이 파일을 사용하십시오. FileHelpers

둘 다 무료이며 오픈 소스입니다.


답변

이 스레드로 돌아 오는 경우를 위해 내가 자주 사용하는 도우미 클래스가 있습니다 (공유하고 싶었습니다).

사용할 준비가 된 프로젝트로 간단하게 이식하기 위해 이것을 사용합니다.

public class CSVHelper : List<string[]>
{
  protected string csv = string.Empty;
  protected string separator = ",";

  public CSVHelper(string csv, string separator = "\",\"")
  {
    this.csv = csv;
    this.separator = separator;

    foreach (string line in Regex.Split(csv, System.Environment.NewLine).ToList().Where(s => !string.IsNullOrEmpty(s)))
    {
      string[] values = Regex.Split(line, separator);

      for (int i = 0; i < values.Length; i++)
      {
        //Trim values
        values[i] = values[i].Trim('\"');
      }

      this.Add(values);
    }
  }
}

그리고 그것을 다음과 같이 사용하십시오 :

public List<Person> GetPeople(string csvContent)
{
  List<Person> people = new List<Person>();
  CSVHelper csv = new CSVHelper(csvContent);
  foreach(string[] line in csv)
  {
    Person person = new Person();
    person.Name = line[0];
    person.TelephoneNo = line[1];
    people.Add(person);
  }
  return people;
}

[CSV 도우미 업데이트 : 마지막 줄 바꾸기 문자가 줄 바꾸기를 만들 때 발생하는 버그 수정]