Чтение нескольких записей из текстового файла в C # - PullRequest
0 голосов
/ 10 июля 2010

Мне нужна помощь по логике / программированию для чтения более одной записи из текстового файла.Я могу читать строку за строкой, но мне нужно остановиться, как только запись закончится, поместить этот объект в список, а затем продолжить с новой записью, пока не появится следующая, сохранить в список и т. Д.

Заголовок записи всегда начинается с G в качестве первого символа.Остальное, если V (переменная), D (координаты), M (точка вставки) и т. Д. ...

Содержимое файла выглядит следующим образом: (фиктивные данные)

G FEATURE01 LEVEL01
M -10.5132 10.0000 697.5086
V \~\@ENTITY=LINE 
V \~\@PENSTYLE=0
V \~\@PENTHICK=1
D -10.5089 12.0797 697.8155
D -10.4971 13.6198 698.0429
D -10.0399 17.3069 698.5913
D -10.7665 11.6108 699.2279
D -10.6769 15.9840 699.8735
D -10.8229 13.6024 710.4438
G FEATURE02 LEVEL02
M -10.2681 10.0000 700.4186
V \~\@ENTITY=LINE
V \~\@PENSTYLE=0
V \~\@PENTHICK=1
D -10.2269 10.6946 700.4941
D -10.2585 13.1788 700.7637
D -10.2937 15.9480 701.0642
D -10.9494 20.5230 709.1840
D -10.9277 21.4909 709.4517
D -10.8335 23.3862 709.9763
G FEATURE01 LEVEL02
M -15.4500 10.0000 700.4174
V \~\@ENTITY=LINE 0.00 0 0.00 A A
V \~\@PENSTYLE=0 0.00 0 0.00 A A
V \~\@PENTHICK=1 0.00 0 0.00 A A
D -15.5690 12.3042 700.6673
D -15.3502 14.3130 700.8863
D -15.1219 16.7179 701.1480
D -15.0628 17.3409 701.2427
D -15.5481 20.8968 709.2855
D -15.3132 22.9163 709.8470
D -15.1355 23.2957 709.9627
G FEATURE03 LEVEL03
P 0.0000 0.0000 0.0000 270.0000 90.0000
M -12.8612 14.2951 737.6336
V \~\@ENTITY=LINE
V \~\@PENSTYLE=1
V \~\@PENTHICK=1
V @0ver1ay=KOOS
D -13.2715 15.5321 736.5965

Итак, так как сверху есть 4 записи в текстовом файле.Есть идеи?Спасибо

1 Ответ

3 голосов
/ 10 июля 2010

Вот фрагмент кода, который я попытался собрать для ясности, а не для надежности и т. Д., Он должен поставить вас на правильный путь.

1- Я создал простой класс записи, который будет создандля каждой записи (строки, начинающиеся с 'G'), а затем все последующие строки добавляются в эту запись до тех пор, пока в файле не будет обнаружен новый запуск записи.

class Record
{
  public List<string> Lines { get; private set; }
  public Record()
  {
    Lines = new List<string>();
  }
}

2- Затем будет обработан следующий кодфайл построчно, создавая новые записи по мере их появления и добавляя каждую запись в коллекцию записей.

  // Collection to be populated with the record data in the file
  List<Record> records = new List<Record>();

  using (FileStream fs = new FileStream("datafile.dat", FileMode.Open))
  using (StreamReader rdr = new StreamReader(fs))
  {
    string line;

    // Read first line
    line = rdr.ReadLine();
    while (line != null)
    {   
      // Check if we have a new record
      if (line.StartsWith("G"))
      {
        // We have a start of a record so create an instance of the Record class
        Record record = new Record();

        // Add the first line to the record
        record.Lines.Add(line);

        // Read the next line
        line = rdr.ReadLine();

        // While the line is not the start of a new record or end of the file,
        // add the data to the current record instance
        while (line != null && !line.StartsWith("G"))
        {
          record.Lines.Add(line);
          line = rdr.ReadLine();
        }

        // Add the record instance to the record collection
        records.Add(record);
      }
      else
      {
        // If we get here there was something unexpected
        // So for now just move on and read the next line
        line = rdr.ReadLine();
      }
    } 
  }
...