Разбор больших разделите файлы с динамическим количеством столбцов
-
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#
Файлы могут быть потенциально очень большими, примерным файлом у меня 40 МБ, но они могут быть несколько сотен мегабайт. Ниже приведен код, на котором я начал до того, как я понял, столбцы были динамичными, я открываю FileStream, как я прочитал, что это был лучший способ обрабатывать большие файлы. Я не уверен, что моя идея ставить каждую запись в списке, а затем обработка - это какое-то хорошее, хотя, не знаю, будет ли это работать с такими большим файлами.
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, если это помогает.
Спасибо,
Annelie
Решение
Если вы можете распределить некоторые строки в начале (содержимое заголовка и линии # XXX #, то это просто файл CSV с ^
как разделитель, так любой CSV Reader Class. сделаю трюк.
Другие советы
Вы могли бы сделать это несколько способов.
- Если свойства на ваших объектах имеют то же имя, что и столбцы в вашем файле данных, вы можете использовать отражение, чтобы определить, какие столбцы должны быть сопоставлены с помощью своих свойств.
- Если свойства на ваших объектах имеют разные имена, то вы можете написать пользовательскую сопоставление схемы, которая скажет «для столбца X, назначить свойство Y».
- Вы можете создавать пользовательские атрибуты для своих свойств объектов, которые указывают на то, какое имя столбца они отображают, и используют отражение для чтения этих атрибутов.
Все эти шаги предполагают, что имена столбцов в ваших файлах данных будут одинаковыми для данных, которые они представляют (т. Е. Адрес_1, всегда будет именем столбца для «Address Line One»).