2017-01-27 9 views
1

Мне нужно проверить каждую строку, сгруппированную по дате, и подсчитать количество найденного в ней определенного шаблона. В этом примере найдите и подсчитайте «D;» на сегодняшний деньЧтение текстового файла и манипулирование данными с помощью ASP.net C#

Образец

enter image description here

My expected output to be displayed into textbox 

01 - 3 

02 - 0 

3 - 4 

Прямо сейчас, что я начал просто считывать информацию с дисплея Textfile только номер строки в текстовом файле.

protected void btnRead_Click(object sender, EventArgs e) 
    { 
     string text = String.Empty; 
     int i = 0; 
     using (StreamReader stRead = new StreamReader(FileUpload1.PostedFile.InputStream)) 
     { 

      //to write textfile content   
      while (!stRead.EndOfStream) 
      { 
       //ListBox1.Items.Add(stRead.ReadLine()); 

       text += stRead.ReadLine() + Environment.NewLine; 


       i++; 
      } 
     } 

     TextBox1.Text = text; 
     //Label1.Text = i.ToString(); 
     Label1.Text = this.TextBox1.Text.Split(new Char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Length.ToString(); 
     //populateListBox(); 


    } 

Просто простая идея о том, как начать это, будет большой помощью. Благодаря

ответ

2

Вы можете использовать Regex

string test = "D; sjhjsd D; sdsdjks D;"; 
MatchCollection collection = Regex.Matches(test, @"[D;]+"); 
var x= collection.Count; 

Результат: 3

Это изменение показать, как можно реализовать выше Regex для подсчета каждой прочтенных линии

protected void btnRead_Click(object sender, EventArgs e) 
{ 
    string text = String.Empty; 
    int i = 0; 
    int countedChars; 
    using (StreamReader stRead = new StreamReader(FileUpload1.PostedFile.InputStream)) 
    { 

     //to write textfile content   
     while (!stRead.EndOfStream) 
     { 
      var readedLine = stRead.ReadLine() 
      //ListBox1.Items.Add(readedLine); 

      if (!string.IsNullOrWhiteSpace(readedLine)) 
      { 
       MatchCollection collection = Regex.Matches(readedLine, @"D;"); 
       countedChars = collection.Count; 
       text += readedLine.Substring(0, readedLine.IndexOf(' ')) +" - "+countedChars + Environment.NewLine; 
      } 

      i++; 
     } 
    } 

    TextBox1.Text = text; 
    //Label1.Text = i.ToString(); 
    Label1.Text = this.TextBox1.Text.Split(new Char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Length.ToString(); 
    //populateListBox(); 


} 
+0

Спасибо вы gain .. попробует это :) – rickyProgrammer

+0

Я пробовал, но имел ошибку «Значение не может быть null» в этой строке MatchCollection collection = Regex.Matches (stRead.ReadLine(), @ "[D;] +"); – rickyProgrammer

+1

Проверить обновление вы можете использовать '! String.IsNullOrWhiteSpace (someText)' –

1

Используйте регулярные выражения:

MatchCollection mc = Regex.Matches(lineread, "D;"); 
int count = mc.Count; 

Whole функция будет выглядеть так:

string[] lines = System.IO.File.ReadAllLines("file.txt"); 
string result = ""; 
for(int i=0;i<lines.Length;i++) 
{ 
    MatchCollection mc = Regex.Matches(lines[i], "D;"); 
    result+= string.Format("{0} - {1}\r\n", i+1, mc.Count); 
} 
+0

lineread? нет параметров для него – rickyProgrammer

+0

Я имел в виду строку, которая читается. проверить мой отредактированный ответ –

+0

Сэр, могу ли я узнать, куда вставлять коды в мои текущие коды. Спасибо – rickyProgrammer

1

Try с этим:

var pattern = "D"; 
while (!stRead.EndOfStream) 
{ 
    line+= stRead.ReadLine(); 

    if (!string.IsNullOrEmpty(line)) 
    { 
     var matches = Regex.Matches(line, @"^\d{4}-\d{2}-(\d{2,3})\sproductkey=([\w;]*)"); 

     if (matches.Count > 0) 
     { 
      var day = matches[0].Groups[1].Value; 
      var productKey = matches[0].Groups[2].Value; 
      var count = Regex.Matches(productKey, pattern).Count; 

      text += string.Format("{0} - {1}{2}", day, count, Environment.NewLine); 
     } 
    } 
} 
TextBox1.Text = text; 

Выход:
01 - 3
02 - 0
03 - 4

Вы можете измените шаблон и даты, если хотите. Пример:

2016-12-07 ProductKey = D; D; D; 0; 0
2016-12-11 ProductKey = Y, Y, Y, 0, 0
2016-12-25 ProductKey = D; D; D; D; 0

var pattern = "Y"; 

Выход:
07 - 0
11 - 3
25 - 0

+0

Привет! спасибо за это, но он не дает правильного вывода – rickyProgrammer

+0

Не могли бы вы рассказать мне вход, который вы используете для тестирования? –

+0

Фактически, текстовый файл очень похож на пример, представленный в вопросе, это просто то, что есть групповые даты, за которыми не следует «ключ продукта» автоматически. он может быть другим в другие даты. и шаблон, который я должен учитывать, - «D»; – rickyProgrammer

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

  • Нет связанных вопросов^_^