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:'名称'数据:['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;
}

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

4

3 回答 3

0

有一个用于处理 CSV 文件的优秀库。

肯特布加德

使用上述第三方库很容易从 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 类。

于 2013-09-25T10:14:36.990 回答
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属性可访问。

于 2013-09-25T10:17:54.080 回答
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;
}

希望这可以帮助。

于 2013-09-25T10:19:23.707 回答