Разбор больших файлов с разделителями с динамическим числом столбцов - PullRequest
2 голосов
/ 06 мая 2010

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

Формат файла - 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 МБ, но они могут быть несколько сотен мегабайт. Ниже приведен код, который я начал до того, как понял, что столбцы динамические. Я открываю поток файлов, когда читаю, что это лучший способ обработки больших файлов. Я не уверен, что моя идея поместить каждую запись в список, тогда обработка будет хорошей, хотя и не знаю, будет ли это работать с такими большими файлами.

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

Ответы [ 2 ]

1 голос
/ 06 мая 2010

Если вы можете удалить некоторые строки в начале (содержимое заголовка и строки # xxx #), то это просто файл csv с ^ в качестве разделителя, поэтому любой класс чтения CSV сделает свое дело.

1 голос
/ 06 мая 2010

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

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

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

...