解析文件之前未知列时,解析划界文件的最佳方法是什么?

文件格式是RightMove V3(.blm),结构看起来像这样:

#HEADER#
Version : 3
EOF : '^'
EOR : '~'
#DEFINITION#
AGENT_REF^ADDRESS_1^POSTCODE1^MEDIA_IMAGE_00~ // can be any number of columns
#DATA#
agent1^the address^the postcode^an image~
agent2^the address^the postcode^^~      // the records have to have the same number of columns as specified in the definition, however they can be empty
etc
#END#

这些文件可能很大,我拥有的示例文件是40MB,但可能是数百个兆字节。以下是我在意识到列是动态的之前开始的代码,当我阅读时,我正在打开一个文件流,这是处理大文件的最佳方法。我不确定我将每个记录都放在列表中的想法,但是处理是否好,不知道这是否可以与如此大的文件一起使用。

List<string> recordList = new List<string>();

try
{
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        StreamReader file = new StreamReader(fs);
        string line;
        while ((line = file.ReadLine()) != null)
        {
            string[] records = line.Split('~');

            foreach (string item in records)
            {
                if (item != String.Empty)
                {
                    recordList.Add(item);
                }
            }

        }
    }
}
catch (FileNotFoundException ex)
{
    Console.WriteLine(ex.Message);
}

foreach (string r in recordList)
{
    Property property = new Property();

    string[] fields = r.Split('^');

    // can't do this as I don't know which field is the post code
    property.PostCode = fields[2];
    // etc

    propertyList.Add(property);
}

关于如何做得更好的任何想法?如果有帮助,则为C#3.0和.NET 3.5。

谢谢,

安妮莉

有帮助吗?

解决方案

如果您可以在开始时剥离一些行(标题内容和#xxx#行),那么它只是一个CSV文件 ^ 作为定界符,所以 CSV阅读器类 会做到的。

其他提示

您可以做几种方法。

  1. 如果对象上的属性与数据文件中的列具有相同的名称,则可以使用反射来确定应与哪些列与哪些属性匹配。
  2. 如果您的对象上的属性具有不同的名称,则可以编写一个自定义映射模式,该架构将说“对于X列,分配给属性y”。
  3. 您可以为您的对象属性创建自定义属性,以指示其映射到哪个列名,并使用反射来读取这些属性。

所有这些步骤都认为,数据文件中的列名对于它们代表的数据将相同(即,地址_1始终是“地址线一个”数据的列名)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top