解析具有动态列数的大型界限文件
-
03-10-2019 - |
题
解析文件之前未知列时,解析划界文件的最佳方法是什么?
文件格式是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阅读器类 会做到的。
其他提示
您可以做几种方法。
- 如果对象上的属性与数据文件中的列具有相同的名称,则可以使用反射来确定应与哪些列与哪些属性匹配。
- 如果您的对象上的属性具有不同的名称,则可以编写一个自定义映射模式,该架构将说“对于X列,分配给属性y”。
- 您可以为您的对象属性创建自定义属性,以指示其映射到哪个列名,并使用反射来读取这些属性。
所有这些步骤都认为,数据文件中的列名对于它们代表的数据将相同(即,地址_1始终是“地址线一个”数据的列名)。
不隶属于 StackOverflow