Парсинг текста из файла в форму

173
24 марта 2018, 13:34

Делаю программу для парсинга текста из файлов. Программа для анкетирования. Суть в том что не могу написать как оно будет заносить из файла в label1,label2,label3,label4. Сам текстовый файл будет в виде:

*Что вы делаете?
$1.Работаю
&2.Играю
!3.Учусь
#
*Ваше хобби
$1.Авиамоделирование
&2.Математика
!3.Спорт
#

Вопросы обозначаются символом *, первый вопрос $, второй &, третий !. Код прилагаю. Может кто подскажет как тут грамотно порешать вопрос.

string stroka ="";
int count1 = 0;
int temp = 0;
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
int count2 = 0;
int count3 = 0;
int count4 = 0;
try
{
  var encoding = Encoding.GetEncoding(1251);
  using (var src = new StreamReader(path, encoding: encoding))
  {
    stroka = src.ReadToEnd();
    for (int i = 0; i < stroka.Length; i++)
    {
       if(stroka[i]=='*')
        {
            temp = count1;
            continue;
        }
       else if(count1>temp)
        {
            Ask.Text = string.Format(stroka[i].ToString());
        }
       else if(stroka[i]=='$')
        {
            temp1 = count2;
            count2++;
            continue;
        }
       else if(count2>temp1)
        {
            Question1.Text = string.Format(stroka[i].ToString());
        }
       else if(stroka[i]=='&')
        {
            temp2 = count3;
            count3++;
            continue;
        }
       else if(count3>temp2)
        {
            Question2.Text = string.Format(stroka[i].ToString());
        }
       else if(stroka[i]=='!')
        {
            temp3 = count4;
            count4++;
            continue;
        }
       else if(count4>temp3)
        {
            Question3.Text = string.Format(stroka[i].ToString());
        }
    }

Я пробовал разные способы. Но что то не получалось.

Answer 1

Если добавить этот класс:

public class QAs
{
 public string Question;
 public string Answer1;
 public string Answer2;
 public string Answer3;
 static public List<QAs> ReadFromFile(string path, Encoding enc)
 {
  List<QAs> list = new List<QAs>();
  StreamReader sr = new StreamReader(path, enc);
  string line;
  QAs qas = new QAs();
  while ((line = sr.ReadLine()) != null)
  {
   if (line.Length == 0) continue;
   switch (line[0])
   {
    case '*':
     qas.Question = line.Substring(1);
     break;
    case '$':
     qas.Answer1 = line.Substring(1);
     break;
    case '&':
     qas.Answer2 = line.Substring(1);
     break;
    case '!':
     qas.Answer3 = line.Substring(1);
     break;
    case '#':
     list.Add(qas);
     qas = new QAs();
     break;
   }
  }
  return list;
 }
}

то список объектов , в каждом из которых будет вопрос и ответы на него можно будет получить такой строкой:

List<QAs> list=QAs.ReadFromFile("test.txt",Encoding.GetEncoding(1251));

Снимок экрана отладки - строки загрузились.

Answer 2

Вот вам пример разбора:

class Program
{
    static void Main(string[] args)
    {
        // открыли файл
        using (var tr = new StreamReader(@"D:\x.txt", Encoding.GetEncoding(1251)))
        {
            foreach (var item in ParseFile(tr)) // вывели все элементы
            {
                Console.WriteLine($"Вопрос: {item.Question}");
                foreach (var answer in item.AnswerVariants)
                    Console.WriteLine($"  * {answer}");
            }
        }
    }
    static IEnumerable<QuizItem> ParseFile(TextReader tr)
    {
        while (true)
        {
            var item = ParseItem(tr); // распарсили следующий элемент
            if (item == null) // если конец файла, выходим
                yield break;
            yield return item;
        }
    }
    static QuizItem ParseItem(TextReader tr)
    {
        var q = GetNext(tr, "*"); // прочитали вопрос и ответы
        var a = new string[] {GetNext(tr, "$1."), GetNext(tr, "&2."), GetNext(tr, "!3.")};
        if (q == null || a.Any(s => s == null)) // кончился файл - выходим
            return null;
        return new QuizItem(q, a); // пакуем в класс
    }
    static string GetNext(TextReader tr, string expectedPrefix)
    {
        string s; // перечитываем пока не null и начинается с #
        do s = tr.ReadLine()?.Trim(); while (s != null && s.StartsWith("#"));
        if (s == null) // null - конец файлв
            return null;
        if (!s.StartsWith(expectedPrefix)) // проверяем начало
            throw new FormatException("Unexpected text in file");
        return s.Substring(expectedPrefix.Length).TrimStart();
    }
}
class QuizItem
{
    public string Question { get; }
    // по-хорошему нужно IReadOnlyCollection<string>, но для простоты просто массив
    public string[] AnswerVariants { get; }
    public QuizItem(string q, string[] a)
    {
        Question = q;
        AnswerVariants = a;
    }
}

Выводит:

Вопрос: Что вы делаете?
  * Работаю
  * Играю
  * Учусь
Вопрос: Ваше хобби
  * Авиамоделирование
  * Математика
  * Спорт
READ ALSO
Как узнать глубину рекурсии?

Как узнать глубину рекурсии?

как узнать глубину рекурсии или как реализовать эту программу:Написать для NodeJS функцию, которая рекурсивно выводит список всех файлов и папок...

266
Не работают функции slideDown и fadeOut

Не работают функции slideDown и fadeOut

По идее должно делать плавную анимацию и при загрузке плавно появляться, но выдает ошибку, что slideDown и fadeOut не являются функцией

194
js вытянуть значения ячеек Excel в переменные

js вытянуть значения ячеек Excel в переменные

Коллеги доброе время сутокЗаинтересовался реализацией "js вытянуть значения ячеек Excel в переменные"

217
Удалить из переменный часть текста

Удалить из переменный часть текста

Есть переменная fileWay - это пути к загруженным файлам на сервере разделенные символом ";" тегом перевода строки пример:

224