2011-07-14 16 views
5

(Soy un programador de C++ - tratando de aprender C# - y parece que hay algunos integrados en la serialización de objetos - pero estoy un poco fuera del agua aquí ...)(de) Serialize desde CSV a un objeto (o preferiblemente una lista de tipo de objeto)

Se me ha pedido que cargue datos de prueba en una colección de objetos de un archivo CSV. (Se prefiere CSV sobre xml porque es muchísimo más simple y legible para los humanos. Estamos creando datos de prueba para ejecutar pruebas unitarias)

La colección será una lista de objetos (simples).

List<MyObject> 

Donde MyObject es una clase que contiene algunos dobles y algunos ints.

¿Cuál es la forma preferida de hacerlo? No creo que alguna vez tenga la necesidad de serializar solo uno de estos objetos.

Supongo que una sola línea representa un objeto, y el conjunto de líneas del archivo se utiliza para hacer la lista/colección.

Respuesta

7

A continuación debe hacer el truco, simplemente hizo hace esto un par de meses para el proyecto de conversión de datos de las que estaba trabajando.

Una nota importante para cualquier persona que haga CSV (o cualquier cadena delimitada por caracteres), realmente debe considerar el uso de una biblioteca específica adecuada para ello. El más popular que he encontrado está por debajo (bastante probado y verdadero)

Comenzarás con string.Split(',') y luego ¿qué haces cuando alguien accidentalmente arroja una coma en tu archivo de datos de prueba? ... es sólo pesadilla tras pesadilla y esta biblioteca ha atravesado la mayor parte de eso para usted:

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

¿Qué quiere decir con archivo CSV con encabezados? ¿Qué sucede si solo tengo datos que no están organizados en una forma de fila por columna y aún quiero analizar a través de los datos? –

Cuestiones relacionadas