2011-07-14 4 views
5

(Jestem programistą C++ - próbuję się nauczyć C# - i wygląda na to, że jest kilka wbudowanych serializacji obiektów - ale jestem trochę z wody tutaj ...)(de) Serializuj z CSV do obiektu (lub najlepiej listy obiektów typu)

Zostałem poproszony o załadowanie danych testowych do kolekcji obiektów z pliku CSV. (CSV jest preferowany w stosunku do xml, ponieważ jest prostszy i łatwiejszy do odczytania dla ludzi, tworzymy dane testowe do testów jednostkowych)

Kolekcja będzie listą (prostych) obiektów.

List<MyObject> 

Gdzie MyObject jest klasą zawierającą kilka podwójnych i kilka ints.

Jaki jest preferowany sposób na zrobienie tego? Nie sądzę, że kiedykolwiek będę potrzebował serializacji jednego z tych obiektów.

Spodziewam się, że jedna linia reprezentuje jeden obiekt, a zestaw linii w pliku służy do tworzenia listy/kolekcji.

Odpowiedz

7

poniżej powinny załatwić sprawę, po prostu zrobił to kilka miesięcy temu o projekcie konwersji danych byłem w pracy.

Ważna uwaga dla każdego, kto robi CSV (lub jakiekolwiek znaki rozdzielone znakami), naprawdę powinieneś popatrzeć na użycie konkretnej biblioteki dostosowanej do niego. Najpopularniejszy, jaki znalazłem, jest poniżej (całkiem wypróbowany i prawdziwy)

Zaczniesz od string.Split(','), a następnie co zrobisz, gdy ktoś przypadkowo wyrzuci przecinek do pliku z danymi testowymi? ... to jest po prostu koszmar po tym koszmarze i biblioteka ciągnie większość to dla ciebie:

http://www.codeproject.com/KB/database/CsvReader.aspx?msg=3227161

using System.IO; 
using LumenWorks.Framework.IO.Csv; 

static class Program 
{ 

    public class MyObject 
    { 
     public int Prop1 { get; set; } 
     public string Prop2 { get; set; } 
     public decimal Prop3 { get; set; } 
    } 

    void ReadCsv() 
    { 
     //holds the property mappings 
     Dictionary<string, int> myObjectMap = new Dictionary<string, int>(); 

     List<MyObject> myObjectList = new List<MyObject>(); 

     // open the file "data.csv" which is a CSV file with headers 
     using (CsvReader csv = new CsvReader(new StreamReader("data.csv"), true)) 
     { 
      int fieldCount = csv.FieldCount; 
      string[] headers = csv.GetFieldHeaders(); 

      for (int i = 0; i < fieldCount; i++) 
      { 
       myObjectMap[headers[i]] = i; // track the index of each column name 
      } 

      while (csv.ReadNextRecord()) 
      { 
       MyObject myObj = new MyObject(); 

       myObj.Prop1 = csv[myObjectMap["Prop1"]]; 
       myObj.Prop2 = csv[myObjectMap["Prop2"]]; 
       myObj.Prop3 = csv[myObjectMap["Prop3"]]; 

       myObjectList.Add(myObj); 
      } 
     } 
    } 
} 
+0

Co masz na myśli przez pliku CSV z nagłówkami? Co jeśli mam tylko dane, które nie są uporządkowane w kolejności według kolumn i nadal chciałem przeanalizować dane? –

Powiązane problemy