Разбор больших разделите файлы с динамическим количеством столбцов

StackOverflow https://stackoverflow.com/questions/2782563

Вопрос

Каким был бы лучший подход к анализу разграниченного файла, когда столбцы неизвестны перед анализом файла?

Формат файла 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. сделаю трюк.

Другие советы

Вы могли бы сделать это несколько способов.

  1. Если свойства на ваших объектах имеют то же имя, что и столбцы в вашем файле данных, вы можете использовать отражение, чтобы определить, какие столбцы должны быть сопоставлены с помощью своих свойств.
  2. Если свойства на ваших объектах имеют разные имена, то вы можете написать пользовательскую сопоставление схемы, которая скажет «для столбца X, назначить свойство Y».
  3. Вы можете создавать пользовательские атрибуты для своих свойств объектов, которые указывают на то, какое имя столбца они отображают, и используют отражение для чтения этих атрибутов.

Все эти шаги предполагают, что имена столбцов в ваших файлах данных будут одинаковыми для данных, которые они представляют (т. Е. Адрес_1, всегда будет именем столбца для «Address Line One»).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top