从固定宽度数据填充大类

时间:2015-12-09 08:35:14

标签: c#

我有一个包含大量属性的类,例如:

class MyStudent {
    public string NAME;
    public string TUTOR;
    public int AGE;
    // ... 100+ items
}

从固定宽度的文本文件中读取数据:

Matt    John    20
JonathonBob     22

数据文件在单独的外部参照文件中定义:

NAME    8
TUTOR   8
AGE     2

我想从每行数据填充我的类,然后将其添加到此类型的列表中。这是我正在使用的方法,是否可以提高效率(不更改输入数据文件)?

首先,我已将外部参照文件读入列表,因此我可以使用LINQ访问WIDTH字段。

/* Read File */
List<MyStudent> signal_file = new List<MyStudent>();
while ((_dba_line = _dba_file.ReadLine()) != null)
{
    if (!_dba_line.Substring(0, 2).Equals("--")) // Not a comment
    {
        MyStudent temp_signal = new MyStudent();
        int _offset = 0;
        int _width = 0;

        _width = xref_file.First(item => item.DBU_FIELD == "NAME").WIDTH;
        temp_signal.NAME = _dba_line.Substring(_offset, _width).Trim();
        _offset += _width;

        _width = xref_file.First(item => item.DBU_FIELD == "TUTOR").WIDTH;
        temp_signal.TUTOR = _dba_line.Substring(_offset, _width).Trim();
        _offset += _width;

        // Continue for each property
        // ...

        // Finally
        signal_file.Add(temp_signal);
    }
}

我认为关键可能是外部参照DBU_FIELD始终等于类中的属性名称,并且其顺序与数据行匹配。如果可能的话,我想要达到的目标更接近:

foreach (XrefObject x in xref_file)
{
    _width = x.WIDTH;
    temp_signal.(x.DBU_FIELD) = _dba_line.Substring(_offset, _width).Trim();
    _offset += _width;
}

// Finally
signal_file.Add(temp_signal);

如何使用外部参照对象DBU_FIELD值来访问我不确定的学生对象相关属性(如果可能的话)。

有关此用途的信息,这些文件在使用前已经过验证,因此可以保证它们正确匹配。

我愿意创建一个结构而不是一个对象,如果它更有意义,通常有500个实例,每个实例有大约100个混合字符串,int和float字段。

我也在寻找处理这种数据结构的最佳实践方法,而不仅仅是强迫它工作。

1 个答案:

答案 0 :(得分:1)

您可以使用ReflectionGetPropertySetValue方法

using System.Reflection;        

foreach (XrefObject x in xref_file)
{
    _width = x.WIDTH;

    PropertyInfo prop = 
        temp_signal.GetType()
            .GetProperty(x.DBU_FIELD, BindingFlags.Public | BindingFlags.Instance);

    if(prop != null && prop.CanWrite)
    {
        prop.SetValue(temp_signal, _dba_line.Substring(_offset, _width).Trim(), null);
    }

    _offset += _width;
}