2010-05-06 2 views
2

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

Формат файла 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, если это помогает.

Спасибо,

Annelie

+0

У меня также такая же проблема, можете ли вы рассказать мне, как я могу получить значение значения из # Data # из этого файла. PLZ помогите мне как можно скорее. – Rajpurohit

+0

Привет, Раджпурохит, если ответов, приведенных здесь, недостаточно, чтобы помочь вам, тогда было бы лучше, если бы вы опубликовали новый вопрос. Нам будет легче помочь, если мы узнаем больше деталей. – annelie

+0

На самом деле у меня есть файл в том же формате, что и выше, поэтому на самом деле мне нужно прочитать этот файл и получить данные этого файла, и мне нужно вставить эти данные в базу данных, но я не знаю, как читать файл. На самом деле форматом файла является # Заголовок # # ОПРЕДЕЛЕНИЕ # # Данные # # Конец # так, как получить мои данные и вставить в базу данных plz скажите мне. – Rajpurohit

ответ

1

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

+0

Я уверен, что смогу снять их, я посмотрю ссылку, спасибо! – annelie

1

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

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

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

+0

У них были бы разные имена, чтобы вариант 2 был бы способ пойти, я посмотрю, как это сделать. Благодаря! – annelie

Смежные вопросы