需要将逗号分隔的数据从文件转换为对象列表

时间:2013-09-25 10:09:36

标签: c# list csv

我需要从.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:'名称'   数据:['Yasser','Sachin','Will']

所以,这就是我想要做的事情,以下是我的开始。我正在使用流阅读器读取文件,并用逗号分隔符分割每一行。

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;
}

有人可以帮我把这些数据塑造成所需的格式。感谢。

3 个答案:

答案 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类。

答案 1 :(得分: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属性。

答案 2 :(得分:0)

你应该创建一个小的int变量(或者你喜欢的bool)来确定第一行是否已经完成:

在你设置ColumnName属性的第一行和你添加到MappingData数据列表的后续行中创建你需要的每个列表对象(mpName,mpPhone,mpCity)。

然后将每个列表(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;
}

希望这有帮助。