2015-11-20 2 views
1

Вот мой код для чтения из текстового файла. Он «работает» и читается из текстового файла, но есть небольшая ошибка. Он возвращает это: {Employee: Name: Name: red ID: 123 ID: Request: Name: Name: toilet ID: 444 Desc: water ID: Desc: } Я знаю, почему он это делает, я просто не могу понять, как это исправить. columns[0] Значение «Имя: red \ t ID: 123» и columnms[1] Значение «Имя: туалет \ t ID: 444 \ t Desc: water».Анализ структурированного ввода текста и составление структурированного вывода вложенных классов

Я знаю, что это делает это, потому что я звоню assignment.Employee.Name, но я не знаю, как еще назвать это, чтобы показать его в моей форме. Я думал, что это будет что-то вроде assignment.Employee, но затем оно дает ошибку, что я не могу преобразовать строку в тип Employee.

Назначение - это список, который содержит 2 объекта из других списков (сотрудник и запрос на обслуживание).

public static List<Assignment> GetAssignment() 
    { 
     if (!Directory.Exists(dir)) 
      Directory.CreateDirectory(dir); 


     StreamReader textIn = 
      new StreamReader(
       new FileStream(path3, FileMode.OpenOrCreate, FileAccess.Read)); 

     List<Assignment> assignments = new List<Assignment>(); 

     while (textIn.Peek() != -1) 
     { 
      string row = textIn.ReadLine(); 
      string[] columns = row.Split('|'); 
      if (columns.Length >= 2) 
      { 
       Assignment assignment = new Assignment(); 

       assignment.Employee.Name = columns[0]; 
       assignment.Request.Name = columns[1]; 
       assignments.Add(assignment); 
      } 
     } 

     textIn.Close(); 

     return assignments; 
    } 

EDIT: Я ожидаю, что это просто вернуть {Employee: Name: red ID: 123 Request: Name: toilet ID: 444 Desc: water}

+2

_ «Я знаю, что это делается, потому что я вызываю назначение.Employee.Name» _ Я не понимаю проблему и ее причину. –

+0

Думаю, нам также нужен взгляд на ваш класс Employee и в файл данных ;-). Но обычной общей идеей является определение методов ToString() для всех типов, снизу вверх, адекватное сочетание из нижнего уровня при преобразовании более высоких уровней в строки. Фактически, это то, что вы пытаетесь сделать (Assignment.ToString() использует Employee, но, вероятно, следует вызвать Employee.ToString()). –

+0

Вы все еще не указали текстовый файл, но если вы скажете, что «column [0] значение« Name: red \ t ID: 123 »« Я предполагаю, что слово «Name» фактически появляется ** в текстовом файле * *. Это означает, что текстовый файл в основном представляет собой словарь с тегами («Имя», «Идентификатор» и значения («красный», «123»). Если это так по определению формата данных, вы должны сделать более продуманный синтаксический анализ и устранить «Name» из значения столбца. Если это не всегда так, и значение строк строки - это формат csv с вкладками в качестве разделительных символов, тогда у вас есть смешные данные, и вы ничего не можете сделать. –

ответ

0

К сожалению, это не ответ, но из-за странные правила на этом сайте, я не имею право, чтобы добавить комментарий. Пожалуйста, дайте нам определение класса или структуры под названием «Назначение» и сообщите нам, что вы ожидаете от него, после запуска вашего кода.

+0

Я редактировал свой код с помощью класс присвоения и то, что я ожидаю, что он вернется – Alex

+0

Да, Аарон заметил его :-) – JonP

+0

@Alex: Что ты делаешь? Редактирование файла во время работы программы? Вы уверены, что файл полностью записан обратно, прежде чем вы снова вызовите GetAssignment()? Действительно, для чего-то подобного лучше всего пройти код с отладчиком и посмотреть на локальные переменные и т. Д. – JonP

0

Вы выполняете string.Format() на this.Employee так в основном она выполняет по умолчанию ToString()Employee на объект, который будут перечислены все поля и связанные с ними значения. Вы, возможно, имеют смысл называть это так:

return string.Format("Employee: {0} \t Request: {1}", this.Employee.Name, this.Request.Name); 

Или, возможно, вы хотите, чтобы переопределить ToString() на ваших Employee и ServiceRequest объектов, чтобы вернуть ваши желаемые результаты.

Update

Поскольку вы изменяли вопрос включить Employee объект, выше не является актуальным. Так как ваше значение column[0] имеет текст "Name: red \t ID: 123", то в вашем Employee переопределении ToString вам также не нужно указывать текст "Name:".

+0

Это исправляет проблему чтения из текстового файла (это дает мне ожидаемый результат). Но теперь, когда я добавляю задание, когда я запускаю программу, он не работает. Поэтому, когда я добавляю назначение, вместо того, чтобы показывать все поля для запроса employee/service, он показывает только имя – Alex

0

Этот ответ основан на предположении, что типичный текстовая строка в файле данных выглядит следующим образом:

Имя: красный \ т ID: 123 | Имя: туалет \ т ID: 444 \ т Desc: вода

Это смотрит на меня, как она кодирует два объекта, первый из которых имеет два атрибута (имя и ID) и второй из которых имеет три атрибута (Имя , ID, Desc).

Объекты в пределах одной и той же линии разделены знаком трубы («|»). Атрибуты внутри одного и того же объекта разделяются вкладками ("\ t"). Каждый атрибут состоит из идентификатора («Имя», «ИД») и значения («красный», «123»), разделенных двоеточием («:»). Естественной структурой данных для таких пар будет Dictionary<string, string>.

Чтение такого файла будет эмулировать это гнездование.

  • Прочитать строку; разделите его на "|" в строки, содержащие по одному объекту каждый (ваши столбцы).
  • Разделите каждую из этих строк объектов на \ t, чтобы каждая результирующая строка содержала один ключ и одно значение с двоеточием (":") и пробелом между ними.
  • Разделить каждое из этих значений ключа на «:», чтобы отделить ключ от значения. Обрежьте оба, чтобы избавиться от лишнего белого пространства.

Сотрудники или другие объекты этого типа содержат словарь для хранения пар ключ/значение, а ToString() просто печатает каждую пару, печатая ключ, двоеточие и значение.

+0

. Это то, что выглядит в текстовом файле, но \ t не отображается в текстовом файле. Вместо этого есть только пустое пространство. – Alex

+0

Ну, «\ t» - это то, как печатается конкретное белое пространство с символом ASCII 9, символ TAB, если вы хотите отличить его от другого пробела с кодом ASCII 32. ;-) Если у вас есть сомнения, посмотрите на это в шестнадцатеричном редакторе или посмотрите на спецификацию файла (есть один, не так ли?). В исходном коде программы «\ t» часто используется для указания (одиночной) TAB в этой позиции в строке. –

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