2016-04-13 2 views
3

прямо сейчас Я читаю несколько строк из .txt. Допустим, пользователь вводит свое имя, а в .txt будет сохранен «Записано в {username} 13/04/2016 в 10:55 утра». (Только пример.)Получите определенное слово из строки, прочитанной с .txt

Теперь я хочу прочитать .txt и напечатать только определенные части в текстовое поле. Значение, в текстовом поле должно появиться «{Username} - 13/04/2016 - 10:55 am».

До сих пор я могу читать из .txt и печатать всю строку.

private void button_print_results_Click(object sender, RoutedEventArgs e) 
{ 
    int counter = 0; 
    string actual_line; 


    System.IO.StreamReader file_to_read = 
    new System.IO.StreamReader("myText.txt"); 
    while ((actual_line = file_to_read.ReadLine()) != null) 
    { 

     textBox_results.Text = textBox_results.Text +"\n"+ actual_line; 
     counter++; 
    } 

    file_to_read.Close(); 
} 

Есть ли способ, чтобы достичь этого без перезаписи всего файла?

И нет, я не могу изменить формат сохранения имен и т. Д. (Я использовал их здесь для лучшего понимания, фактические строки, которые мне нужны для чтения/проверки, отличаются и автоматически генерируются).

Я не ожидаю полного рабочего кода, было бы здорово, если бы вы могли сказать мне, для каких команд мне нужно посмотреть. Прошло много времени с тех пор я в последний раз работал с C#/WPF, и я никогда не работал много с StreamReader ...

Благодаря

ответ

1

Вы можете разделить actual_line строки, так что вы получите массив строк. А затем заполните строки, которые вы хотите показать в TextBox.

string[] values = actual_line.Split(' '); 
textBox_results.Text = textBox_results.Text + "\n" + values[2] + " " + values[6] + " " + values[7]; 

текст в TextBox, например, является "{имя пользователя} 10:55 утра"

+0

Это нормально, если имя пользователя не содержит пространство, кроме того, что это решение было бы справедливо – Ian

1

Есть несколько возможных решений для этого. Одним из самых простых способов для вашего дела было бы использовать Substring и Replace.

Поскольку ранее string всегда Logged in (обратите внимание на последнее место), и вы просто хотите, чтобы получить остатки на string после фразы, заменяя только предлог время слов («на», «в») с тиром ("-") вы можете воспользоваться на что:

string str = "Logged in {username} on 13/04/2016 at 10:55 am"; 
string substr = str.Substring(("Logged in ").Length) //note the last space 
        .Replace(" on ", " - ") 
        .Replace(" at ", " - "); 

в своей реализации, это то, как она выглядит следующим образом:

while ((actual_line = file_to_read.ReadLine()) != null) 
{ 
    actual_line = actual_line.Substring(("Logged in ").Length) //note the last space 
        .Replace(" on ", " - ") 
        .Replace(" at ", " - "); 
    textBox_results.Text = textBox_results.Text +"\n"+ actual_line; 
    counter++; 
} 

(Примечание: решение выше предполагает, что {username} делает не содержат разнесен предлог временных слов - которые почти вероятно, будут случаем для {username})

1

Я думаю, что регулярные выражения являются лучшим инструментом для того, что вы пытаетесь достичь. Вы можете написать что-то вроде этого:

Regex regex = new Regex("Logged in (?<userName>.+) on (?<loginTime>.+)"); 
while ((actual_line = file_to_read.ReadLine()) != null) 
{ 
    Match match = regex.Match(actual_line); 
    if (match.Success) { 
     string loginInfo = string.Format("{0} - {1}", match.Groups["userName"], match.Groups["loginTime"]); 
     textBox_results.Text = textBox_results.Text +"\n"+ loginInfo; 
    } 
} 
+0

Regex это лучший способ здесь, хотя, если формат даты и времени всегда то же самое, вы можете использовать более конкретный шаблон. Я придумал «Записан» (? {. +}) На (? \ d + \/\ d + \/\ d +) в (?

0

Вы можете использовать Regex для лучшего выступления, как @ Дмитрий-Rotay предложил в предыдущем комментарии, но если вы Jave не-так большой файл вашего цикла + со строками является приемлемый компромисс.

Всегда используйте Environment.NewLine вместо «\ n», это более портативно.

while ((actual_line = file_to_read.ReadLine()) != null) 
{ 
    actual_line = actual_line 
       .Replace(("Logged in "), String.Empty) 
       .Replace(" on ", " - ") 
       .Replace(" at ", " - "); 
    textBox_results.Text = textBox_results.Text 
       + System.Environment.NewLine 
       + actual_line; 
    counter++; 
} 
Смежные вопросы