2013-09-25 61 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: '名称' 数据: '阿拉法特', '萨钦', '请问']

所以,这是我想要做的,下面是我已经开始。我正在使用流读取器读取文件,并用逗号分隔符分隔每行。

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

@亚瑟:看看我更新的答案, –

回答

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

你应该创建一个小的整数变量(或者,如果你喜欢布尔)来确定第一行是否已经完成:

并在每个列表中的对象,你将需要(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; 
} 

希望这会有所帮助。

相关问题