2013-09-25 2 views
0

Мне нужно прочитать данные из CSV-файла и сохранить заголовок и содержимое в моем объекте в следующем формате. Список нижеуказанного класса.Необходимо преобразовать данные, разделенные запятыми из файла, в список объектов

public class MappingData 
{ 
    private string ColumnName { get; set; } 
    private List<string> Data { get; set; } 
} 

Так, например, у меня есть таблица вроде как показано ниже,

| Name  | Phone  | City   | 
|:-----------|------------:|:------------:| 
| Yassser | 32342342234 | Mumbai 
| Sachin  | 32342342234 | Surat  
| Will  | 32342342234 | London 

Так что для приведенных выше данных мой класс должен иметь 3 объекта, первый объект будет иметь следующие данные

ColumnName: 'Name' данных: [ 'Ясир', 'Сэчин', 'Будет']

Итак, это то, что я пытаюсь сделать, Ниже я начал. Я читаю файл с помощью средства чтения потока и разделяет каждую строку с помощью разделителя запятой.

private List<MappingData> GetData(string filename) 
{ 
    var data = new List<MappingData>(); 
    string fullPath = GetFilePath(filename); 
    StreamReader reader = new StreamReader(fullPath); 
    while (!reader.EndOfStream) 
    { 
     string line = reader.ReadLine(); 
     if (!String.IsNullOrWhiteSpace(line)) 
     { 
      string[] values = line.Split(','); 
     } 
    } 
    return data; 
} 

Может кто-нибудь, пожалуйста, помогите мне сформировать эти данные в необходимом формате. Благодарю.

+0

Хм, почему ваши объекты на самом деле являются столбцами? Это довольно странный подход. – athabaska

+0

В классе MappingData у вас есть член с именем ColumnName. Где вы получаете значение для этого участника? Он присутствует (как заголовок, первая строка) во входном файле? Вы разделите строку на запятую, но ваш пример не отображает запятую во входном файле. – Steve

+0

@Yasser: Отметьте мой обновленный ответ, –

ответ

0

Существует отличная библиотека для обработки файлов CSV.

KentBoogard

Это очень легко с помощью данной библиотеки третьей стороной для чтения содержимого из файлов CSV. Я бы предложил это, потому что вы просто начинаете и не изобретаете колесо.

По-прежнему, если вы хотите обработать файл по-своему, вот одна рабочая реализация. Наслаждайтесь

 var csvData = File.ReadAllLines("d:\\test.csv"); 

     var dataRows = csvData.Skip(1).ToList(); 
     var csvHeaderColumns = csvData.First().Split(',').ToList(); 

     var outputList = new List<MappingData>(); 

     foreach (var columnName in csvHeaderColumns) 
     { 
      var obj = new MappingData { columnName = columnName, data = new List<string>() }; 

      foreach (var rowStrings in dataRows.Select(dataRow => dataRow.Split(',').ToList())) 
      { 
       obj.data.Add(rowStrings[csvHeaderColumns.IndexOf(columnName)]); 
      } 

      outputList.Add(obj); 
     } 

Это заполнит ваш класс MappingData.

0

Предполагая остальную часть вашего метода является правильным, попробуйте следующее:

private List<MappingData> GetData(string filename) 
{ 
    var raw = new List<string[]>(); 
    var data = new List<MappingData>(); 
    string fullPath = GetFilePath(filename); 
    using(var reader = new StreamReader(fullPath)) 
    { 
     while (!reader.EndOfStream) 
     { 
      string line = reader.ReadLine(); 
      if (!String.IsNullOrWhiteSpace(line)) 
      { 
       raw.Add(line.Split(',')); 
      } 
     } 
    } 

    Func<int, MappingData> extract = 
     n => new MappingData() 
     { 
      ColumnName = raw[0][n], 
      Data = raw.Skip(1).Select(x => x[n]).ToList(), 
     }; 

    data.Add(extract(0)); 
    data.Add(extract(1)); 
    data.Add(extract(2)); 

    return data; 
} 

Вы должны были бы сделать вас MappingData свойства доступны, хотя.

0

Вы должны создать небольшой ИНТ переменной (или BOOL, если вы предпочитаете), чтобы определить, была ли завершена первая строка:

И создать каждый из списка объектов, вам потребуется (mpName, mpPhone, mpCity), в первой строке вы устанавливаете свойство ColumnName и в последующие строки, которые вы добавляете в список данных MappingData.

Затем вы добавляете каждый список (mpName, mpPhone, mpCity) в список данных для метода и возвращаете это.

private List<MappingData> GetData(string filename) { 
    List<MappingData> data = new List<MappingData>(); 

    int NumRow = 0; 
    MappingData mpName = new MappingData(); 
    MappingData mpPhone = new MappingData(); 
    MappingData mpCity = new MappingData(); 


    string fullPath = GetFilePath(filename); 
    StreamReader reader = new StreamReader(fullPath); 
    while (!reader.EndOfStream) { 
     string line = reader.ReadLine(); 
     if (!String.IsNullOrWhiteSpace(line)) { 
      string[] values = line.Split(','); 

      if (NumRow == 0) { 
       mpName.ColumnName = values[0]; 
       mpPhone.ColumnName = values[1]; 
       mpCity.ColumnName = values[2]; 
       NumRow = 1; 
      } else { 
       mpName.Data.Add(values[0]); 
       mpPhone.Data.Add(values[1]); 
       mpCity.Data.Add(values[2]); 
      } 
     } 
    } 

    data.Add(mpName); 
    data.Add(mpPhone); 
    data.Add(mpCity); 

    return data; 
} 

Надеюсь, это поможет.

Смежные вопросы