none
Редактирование текста RRS feed

  • Вопрос

  • Привет всем.

    Часто бывает, что нужно отпарсить текстовый файл. Удалить пустые строки, удалить какие-то не нужные данные и т.д. Решил написать небольшую утилиту, начал с простого - с удаления пустых строк. Сделал самое простое, в чем более - менее понимаю. Создал проект виндовс форм, добавил текстбокс и кнопочку баттон. Вписываем нашь текст в форму текстбокс, а дальше по нажатию кнопочки должны удалятся пустые строки, только как это осуществить ? Понимаю что вопрос нубский, но хоть скажите где копать ?

    16 апреля 2011 г. 15:15

Ответы

  • Попробуйте следующий вариант:

          StringBuilder sb = new StringBuilder();
          foreach (string line in richTextBox1.Lines)
          {
            if (line != String.Empty)
              sb.AppendLine(line);
          }
    
          richTextBox1.Text = sb.ToString();
    

     


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 22 апреля 2011 г. 11:52
    18 апреля 2011 г. 6:14
  • 1. Книга - это хорошо...

    2. Точка останова, BreakPoint, - это когда у Вас все отранслировалось без ошибок,
    то перед запуском (кнопкой F5) или в процессе счета Вы можете
    остановить счет с целью диагностики в нужном месте программы.
    Для этого нужно ткнуть мышкой в серое поле
    слева от текста программы напротив того оператора, на котором хотите остановиться.
    Наведя мышку, не кликая, на любую из переменных Вы сможете увидеть во всплывшем окошечке значение этой переменной.
    У массива в этом окошке можно нажать на "+", тогда откроется часть значений массива.

    3. В новом проекте на форму добавьте контрол RichTextBox, он автоматом будет называться richTextBox1,
    кнопкой F7 откройте код,
    после namespace замените все что там есть на следующий текст

    namespace ...
    {	public partial class Form1	:	Form
    	{	public Form1	()		{	InitializeComponent();		Work();	}
    		public void Work	()
    		{	richTextBox1.AppendText("Hello,World!\n");
    			richTextBox1.AppendText("Hello,Life!\n\n");
    			richTextBox1.AppendText("Hello,Friends!\n");
    			
    			int L=richTextBox1.TextLength;
    string [] s=richTextBox1.Text.Split(',','!','\n');
    string [] S=richTextBox1.Text.Split('\n');
    } } }
    перед последними закрывающими скобками поставьте точку останова, см. выше,
    запустите программу кнопкой F5,
    она остановится в точке останова - смотрите и любуйтесь, что получилось.
    для продолжения работы программы нажмите "Shift+F11"

     






    • Помечено в качестве ответа zeoman 22 апреля 2011 г. 14:38
    18 апреля 2011 г. 15:06
  • В конструкторе на форме дважды нажмите на кнопку, которую хотите использовать, -
    в тексте программы появится строка типа
    private void Button1_Click (object sender, EventArgs e)
    {

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

    • Помечено в качестве ответа zeoman 22 апреля 2011 г. 14:38
    19 апреля 2011 г. 15:31
  • Вариантов несколько, я делаю так -


    string S="hdgdtt1@fo.&&:gd52j3b";
    string s=S.Split(':',';')[0];
    или проще -
    string s="hdgdtt1@fo.&&:gd52j3b".Split(':',';'); 

    Можно строковым методом Remove, но там нужно определить номер символа ':' в строке,
    а для этого использовать дополнительный метод IndexOf, но тоже работает -
    string S="hdgdtt1@fo.&&:gd52j3b";
    string s=S.Remove(S.IndexOf(':')); 

    Чтобы удалить текст -
    string s="hdgdtt1@fo.&&:gd52j3b".Replace("&&:gd",""); 

    Удалить строку из RichTexBox,
    в моем первом примере получаете массив строк
    string [] s=richTextBox1.Text.Split('\n'); 
    а потом собираете те, которые Вам нужны, например, непустые -

    richTextBox.Clear();
    for (int i=0;i<s.Length;i++) { if (s[i]!="") richTextBox1.AppendText(s[i]);} 

    Экспериментируйте, может быть и есть хорошие статьи, но я не видел. 



    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:54
    25 апреля 2011 г. 8:34
  • // Весь текст из richTextBox разделить (Split) на строки, и построчно записать в строковый массив
    string [] s=richTextBox1.Text.Split('\n');


    // Очистить richTextBox
    richTextBox.Clear();
    for (int i=0;i<s.Length;i++)  // В цикле

    // Если очередная строка не пустая
    if (s[i]!="") 

    // То эту строку разделить символами ':' или ';' на подстроки и первую, [0], из них записать в richTextBox,
    // здесь я забыл в конце каждой записи поставить '\n', символ перехода на другую строку, поэтому все строчки
    // слились в одну, сейчас правильно.
    richTextBox1.AppendText(s[i].Split(':',';')[0]+"\n");
    }


    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:53
    26 апреля 2011 г. 17:12
  • 1. Записать в массив - это значит, что весь текст, накопленный в richTextBox, rtB, будет переписан в строковый массив,
    каждый элемент которого, строка, в результате будет содержать очередную строку из rtB.
    Это можно увидеть, если поставить точку останова напротив второго оператора.
    После запуска программа остановится в этой точке.
    Не нажимая, наведите мышку на переменную "s" - в маленьком окошечке увидите "+s{string[Число]}",
    это означает, что s - строковый массив, содержащий означенное число элементов, строк.
    Если также не нажимая, вы подведете курсор на "+", то окошечко раскроется и
    покажет Вам несколько первых элементов массива s - это строки, полученные из Вашего rtB.

    2 и 3. Цикл - это в данном случае поэлементная обработка массива s, начиная с начального, нулевого, 
    элемента, первой строки в этом массиве, затем 1, 2, и т.д. и заканчивая последним, (s.Length-1) элементом,
    строкой в этом массиве. Length - одно из свойств массива, размер массива, количество строк,
    формируется и корректируется автоматически, i - переменная цикла, это с каждым разом увеличивающийся
    номер обрабатываемого элемента, строки в массиве.
    Чтобы посмотреть, какие есть другие свойства и методы у массива, надо в строке 
    for ... удалить точку после s, а затем снова эту точку поставить - в подсказывающем окошечке появляются 
    методы, помеченные красным, Aggregate<>, All<>,...,  и свойства с указующим пальцем.
    Каждая строчка снабжена кратким пояснением, что это. 
    Исчерпывающая информация в MSDN, в справочнике для разработчиков  - 
    http://msdn.microsoft.com/ru-ru/library/system.string.aspx
    Здесь нужно полазить, разобраться, как этот справочник устроен -
    более подробной информации нет нигде.


    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:53
    27 апреля 2011 г. 17:57
  • // Этот метод используется, когда нужно что-либо сделать после изменения 
    // в textBox2, например, после введения или удаления символа. Здесь этот метод не нужен.
    private void textBox2_TextChanged(object sender, EventArgs e)	
    {
    }
    
    // Этот метод вызывается автоматически при нажатии на кнопку button1
    private void button3_Click(object sender, EventArgs e)
    // Для многострочного текста обычно применяют RichTextBox - контрол,
    // в котором этот текст можно удобно просмотреть, поскольку есть скроллинг.
    // TextBox используется для однострочного текста,
    // поэтому следующий оператор, в котором текст из textBox2 построчно переписывается в массив s,
    // не верен.
     string[] s = textBox2.Text.Split('\n');
    // Здесь textBox1 очищается, пропадает все, что было
     textBox1.Clear();
    // У TextBox-а нет метода Append. Думаю, что под именем textBox1,
    // на самом деле скрывается RichTextBox, иначе этот код не работает.
    // Если это все же RichTextBox, то в этом цикле Вы переписываете
    // непустые строки из массива s в textBox1. 
     for (int i = 0; i < s.Length; i++) { if (s[i] != "") textBox1.AppendText(s[i]); }
    }
    .
    Таким образом, никакого удаления в Вашей программе не предусмотрено.
    .
    Чтобы из текста удалить заданную подстроку, набор символов, 
    обычно я использую оператор 
    .
    richTextBox1.Text.Replace(tB2.Text,"");
    .
    который во всем тексте richTextBox1.Text находит и заменяет
    все подстроки, заданные в tB2.Text, на пустышку "".

    В этом последнем операторе удалите и снова поставьте точку
    перед Replace - увидите подсказку обо всех свойствах и методах класса string.
    Передвигая курсор вверх-вниз увидите подсказку о каждом.
    См.также
    http://msdn.microsoft.com/ru-ru/library/fk49wtc1(VS.90).aspx

     

    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:53
    30 апреля 2011 г. 15:38
  • richTextBox1.Text=richTextBox1.Text.Replace(textBox1.Text, "");
    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:53
  • Проверка файлов на текстовые совпадения.

    Чтобы полностью ответить на Ваш вопрос, 
    надо написать приличную программу, для меня это не реально - потребуется немало времени.
    Но принцип таков.

    Посмотрите
    http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/cf8bace9-0abb-422b-a114-c06cb01a9a5d
    Там речь о выявлении плагиата, приводится литература по теме.
    А плагиат - это тоже текстовые совпадения.

    Но существует легальная задача индексирования текстов, 
    широко применяемая в поисковых системах - Google, Яndex, и пр.
    Смысл состоит в том, чтобы среди моря информации дать пользователю 
    возможность искать в интернете нужные ему документы по 
    заданным ключевым словам.
    Для этого поисковые сайты индексируют ВСЕ документы, вращающиеся в интернете -
    это колоссальная работа.

    В чем смысл индексации?
    Создается словарь, для каждого слова в этом словаре создается список ссылок на тексты,
    в которых это слово присутстует. Это миллионы пунктов по каждому слову,
    причем не забывайте, у каждого слова возможны падежи, склонения и т.д.,
    а также английские и пр. аналоги, 
    а поисковая система предлагает еще исправить ошибку в ключевом слове, 
    если таковая имеется. 
    Для ответа на запрос система по созданному
    индексированному словарю находит пересечения, т.е. множество ссылок на тексты,
    в которых одновременно присутствуют все или большая часть ключевых слов.

    Как в действительности работает такая система - это предмет копирайта,
    защиты авторского права.

    Но простая система может быть основана на классе SortedDictionary в формате -

    SortedDictionary<string,List<string>> WordBook = new SortedDictionary<string,List<string>>();

    Здесь первый string - ключевое слово, List<string> - список адресов в строковом виде,
    где это слово присутствует, это может быть название файла и, например, номер начального байта, 
    или номер слова в тексте, или номер строки, или номер строки и номер байта в строке.
    Посмотрите http://msdn.microsoft.com/ru-ru/library/f7fta44c.aspx?ppud=4











    • Помечено в качестве ответа zeoman 7 мая 2011 г. 4:38
  • RichTextBox rtB=new RichTextBox();
    rtB.Add("200451 Abramov Serg");
    rtB.Add("200451 Popov Alex");
    ... 
    // Весь текст из ричтекстбокса построчно записать в массив строк
    string [] strArr=RichTextBox.text.Split('\n');
    // Очистить ричтекстбокс 
    rtB.Clear();
    string [] s; 
    int Remainder; 
    for (int i=0;i<strArr.Length;i++)
    {
    // Очередную строку разделить на 3-и подстроки, вторую и третью подстроки одной строкой записать в RichTextBox
    s=strArr[i].Split(' ');
    rtB.Add(s[1]+" "+s[2]);
    // Если номер строки кратен 40, вставить пустую строку
    Math.DivRem(i,40,out Remainder);
    if (Remainder==0)	rtB.Add("\n");
    }

    • Помечено в качестве ответа zeoman 19 мая 2011 г. 20:18
  • 1. VS ругается на Remainder (элемент не существует в данном контексте)
    Remainder, остаток от деления - это переменная, объявленная в моем примере как int Remainder; - 
    если эта строка есть, то такой ошибки быть не должно. 

    2. Add (System.Windows.Forms.RichTextBox не содержит определения для Add...
    Пардон, не Add, а AppendText...
    Но Вы должны уже это знать,  у Вас это уже было.

    3. И этих пронумерованных строк тысячи... чтобы остались только фамилии...
    Значит rtB.AppendText(s[1]);

     

     


    • Помечено в качестве ответа zeoman 20 мая 2011 г. 8:48

Все ответы

  • У всех символов, в том числе у пробелов, переносов строки и т.д. есть код.

    Удаление можно сделать следующим образом (к примеру):

    TextBox1.Text = TextBox1.Text.Replace (Chr(13),"")

    В данном случае Chr(13) это символ переноса строки. Функцию Chr стоит использовать если символ нельзя записать обычным способом. В других случаях вполне подойдет

    TextBox1.Text = TextBox1.Text.Replace (" ","") - удаление всех пробелов.


    16 апреля 2011 г. 15:22
    Отвечающий
  •     private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
    
        }
    
        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
          richTextBox1.Text = richTextBox1.Text.Replace (" ", "");
        }
      }
    }
    Так сделать ?
    16 апреля 2011 г. 15:38
  • Я в С# не силен, но по всему выглядит, что так
    16 апреля 2011 г. 17:20
    Отвечающий
  • Не работает
    17 апреля 2011 г. 5:31
  • Прошу прощения не доглядел, что вы делаете замену в событии TextChanged

    Так делать не нужно! Редко бывает полезным, что бы событие вызывало само себя

    Перенесите эту строку в событие нажатия кнопки например.


    17 апреля 2011 г. 6:35
    Отвечающий
  • Нужно удаление пустых строк отступа допустим из такого текста:

    hdgdtt1@fo.&&;gd52j3b
    
    
    
    hd655@fo.&&;dh73gcw
    
    
    
    2174h@fo.&&;gsd57cv1

    17 апреля 2011 г. 6:58
  • Как я и написал выше символ переноса строки (то что вы называете пустой строкой отступа) можно написать по средствам функции Chr

    Вам понадобятся коды 13 и возможно 10

    то есть сделайте вот так: richTextBox1.Text = richTextBox1.Text.Replace (Chr(13),"").Replace (Chr(10),"")

    17 апреля 2011 г. 7:54
    Отвечающий
  • Ошибка    1    Элемент "Chr" не существует в текущем контексте.    C:\Users\1234\Documents\Visual Studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Parser.cs    26    59    WindowsFormsApplication2

    ------------------------------------------------------------------------------------------------------------------

    Ошибка    2    Элемент "Chr" не существует в текущем контексте.    C:\Users\1234\Documents\Visual Studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Parser.cs    26    80    WindowsFormsApplication2
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
     public partial class Form1 : Form
     {
      public Form1()
      {
       InitializeComponent();
      }
    
      private void Form1_Load(object sender, EventArgs e)
      {
    
      }
    
      private void button1_Click(object sender, EventArgs e)
      {
       richTextBox1.Text = richTextBox1.Text.Replace(Chr(13), "").Replace(Chr(10), "");
      }
    
      private void richTextBox1_TextChanged(object sender, EventArgs e)
      {
    
      }
     }
    }

    17 апреля 2011 г. 7:59
  • Функция Chr находится в пространстве имен  Microsoft.VisualBasic.Strings

    Судя по всему в проекте C# это пространство имен автоматом не добавляется, так что либо ищите аналог функции для своего проекта, либо добавляйте ссылку на Microsoft.VisualBasic

    17 апреля 2011 г. 8:20
    Отвечающий
  • На одном из форумов мне написали следующее:

    Почитай о String.Split(). Так как Пустая строка - это строка состоящая либо из пробелов(" "), табов(\t), переносов каретки(\n), то можно так задать параметры функции Split(), что она вернет тебе массив строк(состоящих толко с символов), а потом выведешь их назад в текстбоск и вставишь при выводе между словами пробелы. Вот такой алгоритм.
    Почитай о функции Split()
    http://msdn.microsoft.com/ru-ru/libr...ing.split.aspx
    Но я не совсем понял какую именно функцию нужно выбрать и как прописать это. К сожалению примеров нигде нет. Важно не просто вставить, а понять как это работает.
    17 апреля 2011 г. 9:06
  • В программировании всегда есть несколько решений одной задачи. Проблема только в том, что я не смогу подсказать вам на C#

    Как сделать используя Split я то знаю, но как это перевести на нужный вам C#???

    Как вариант подождите ответа других участников форума...

    17 апреля 2011 г. 9:41
    Отвечающий
  • Боюсь никто не ответит, но подождать стоит
    17 апреля 2011 г. 12:12
  • Добрый вечер, zeoman .
    --------------
    Меня заинтересовал Ваш вопрос.
    В С# я понимаю явно не больше участников дискуссии.
    Мои попытки решить Вашу задачу привели к написанию следующего кода:
    (писал в проекте WindowsFormsApplication, поэтому предполагаю, что написанное относится к С#).

        private void button1_Click(object sender, EventArgs e)
        {
          //У меня TextBox1 - System.Windows.Controls (Framework 4)
          //для сохранения обработанного текста
          TextBox tb2=new TextBox();
          int index=0,length;
          string wstring;
          //для статистики
          int EmptyString = 0, TrimString = 0, Count = 0;
          try
          {
            while (true)
            {
              wstring = textBox1.Lines.ElementAt(index);
              if (0 == (length = wstring.Length))
              {
                EmptyString++;
              }
              else
              {//попытка обработать строку с пробелами
                wstring = wstring.Trim();
                int l2=length;
                length=wstring.Length;
                if(l2!=length)TrimString++;
              }
              if (length > 0)
              {
                //добавить строчку
                if (Count != 0)
                {
                  Count += 2;
                  tb2.AppendText("\r\n");
                }
                tb2.AppendText(wstring);
                Count += length;
              }
              index++;
            }
          }
          catch (System.ArgumentOutOfRangeException Ae)
          {
            string a=Ae.ToString();//посмотреть исключение
          }
          if ((EmptyString | TrimString) != 0)
          {
            string statistic =
            "Просмотрено строк: " + index.ToString();
            if (0 != EmptyString) statistic +=
               ("\r\nПустых строк: " + EmptyString.ToString());
            if (0 != TrimString) statistic +=
               ("\r\nОбработанных строк: " + TrimString.ToString());
            statistic +=("\r\nСчётчик знаков текста : " + Count.ToString());
            MessageBox.Show(statistic);
            //обновим вид 
            textBox1.Text = tb2.Text;
            //textBox1.Refresh();
         
          }
          textBox1.Focus();//поставить фокус
          textBox1.DeselectAll();//отменить выделение
        }
    
    

     

    17 апреля 2011 г. 18:04
  • Вот программка, разберитесь во всех используемых инструментах.
    Поставьте точки останова, посмотрите, как что работает.
    using System; // Используемые пространства имен
    using System.IO; // 
    using System.Collections.Generic; // Для List<string>
    public partial class Form1 :Form
    { public Form1 () { InitializeComponent(); MyMetod (); }
    public void MyMetod ()
    { List<string> StringLst=new List<string>(); // Результативный список строк
    string file=@"C:...File.txt"; // Спецификация файла
    StreamReader r=new StreamReader (file); // Спецификация исходного файла while (true) { string S=r.ReadLine(); // Чтение строки из файла if (S==null) break; // Выход по окончании файла if (S!="") StringLst.Add (S); // Если прочитанная строка не пустая, то добавить ее в список строк string []s=S.Split(' ',','); // Разобрать строку на составляющие слова, разделенные пробелом или запятой } r.Close(); } }


    17 апреля 2011 г. 18:48
  • Добрый вечер, QazRdx .
    Ваш пример мне интересен(имеется список строк, StreamReader, Split...),
    но нельзя ли показать (или привести пример), как правильно редактировать текст именно в TextBox?
    17 апреля 2011 г. 19:24
  • Попробуйте следующий вариант:

          StringBuilder sb = new StringBuilder();
          foreach (string line in richTextBox1.Lines)
          {
            if (line != String.Empty)
              sb.AppendLine(line);
          }
    
          richTextBox1.Text = sb.ToString();
    

     


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 22 апреля 2011 г. 11:52
    18 апреля 2011 г. 6:14
  • 1. Вам нужно определиться, на каком языке Вам хотелось бы программировать;
    2. Вводить в текст-бокс данные, чтобы потом их редактировать - это нонсенс,
        строковые редакторы умерли с появлением экранных годах эдак в 70-х прошлого века;
    3. Создавать свой экранный текстовый редактор на основе RichTextBox-а - не разумно, 
        разве что, в учебных целях - есть куча готовых полнофункциональных, 
        да к тому же, программируемых, если уж Вам захотелось чего-нибудь 
        оригинальненького сверх всякой меры...
     */
    using System;
    using System.Windows.Forms;
    namespace richTextBox
    {	public partial class MainForm	:	Form
    	{	public MainForm	()				{	InitializeComponent();		Work();	}
    		public void Work	()
    		{	rtBox.AppendText("Hello,World!\n");
    			rtBox.AppendText("Hello,Life!\n\n");
    			rtBox.AppendText("Hello,Friends!\n");
    			
    			int L=rtBox.TextLength;
    			string [] s=rtBox.Text.Split(',','!','\n');
    			string [] S=rtBox.Text.Split('\n');
    }	}	}
    /*
    Переменная L
    		L		41			int
    Массив s[]
    		[0]	"Hello"		string
    		[1]	"World"	string
    		[2]	""				string
    		[3]	"Hello"		string
    		[4]	"Life"		string
    		[5]	""				string
    		[6]	""				string
    		[7]	"Hello"		string
    		[8]	"Friends"	string
    		[9]	""				string
    		[10]	""				string
    
    Массив S[] 
    		[0]	"Hello,World!"		string
    		[1]	"Hello,Life!"		string
    		[2]	""							string
    		[3]	"Hello,Friends!"	string
    		[4]	""							string
     */
    18 апреля 2011 г. 7:40
  •  1 'Без Петрова и сыновей'

    Заменил в коде все textBox1 на свой richTextBox1. При отладке вылетает ошибка: Ошибка    1    "WindowsFormsApplication1.Form1" не содержит определения для "richTextBox1_TextChanged" и не был найден метод расширения "richTextBox1_TextChanged", принимающий тип "WindowsFormsApplication1.Form1" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).

     

     QazRdx

    Читаю книгу, жду когда докачаются видеоуроки.

    К сожалению еще не знаю что такое: точки останова.

    Пробовал в новый проект форм этот код вписать. Вылетает куча ошибок. Извините, не силен пока.

    Код для себя сохранил

     

     Abolmasov Dmitry

    Все получается без кнопочки при копировании текста в форму. Потрясающе.

    Спасибо.

     

     

    СПАСИБО ЗА ВАШИ ОТВЕТЫ! ОЧЕНЬ ПРИЗНАТЕЛЕН ТЕМ КТО ПОМОГАЕТ!

      

    18 апреля 2011 г. 13:33
  • 1. Книга - это хорошо...

    2. Точка останова, BreakPoint, - это когда у Вас все отранслировалось без ошибок,
    то перед запуском (кнопкой F5) или в процессе счета Вы можете
    остановить счет с целью диагностики в нужном месте программы.
    Для этого нужно ткнуть мышкой в серое поле
    слева от текста программы напротив того оператора, на котором хотите остановиться.
    Наведя мышку, не кликая, на любую из переменных Вы сможете увидеть во всплывшем окошечке значение этой переменной.
    У массива в этом окошке можно нажать на "+", тогда откроется часть значений массива.

    3. В новом проекте на форму добавьте контрол RichTextBox, он автоматом будет называться richTextBox1,
    кнопкой F7 откройте код,
    после namespace замените все что там есть на следующий текст

    namespace ...
    {	public partial class Form1	:	Form
    	{	public Form1	()		{	InitializeComponent();		Work();	}
    		public void Work	()
    		{	richTextBox1.AppendText("Hello,World!\n");
    			richTextBox1.AppendText("Hello,Life!\n\n");
    			richTextBox1.AppendText("Hello,Friends!\n");
    			
    			int L=richTextBox1.TextLength;
    string [] s=richTextBox1.Text.Split(',','!','\n');
    string [] S=richTextBox1.Text.Split('\n');
    } } }
    перед последними закрывающими скобками поставьте точку останова, см. выше,
    запустите программу кнопкой F5,
    она остановится в точке останова - смотрите и любуйтесь, что получилось.
    для продолжения работы программы нажмите "Shift+F11"

     






    • Помечено в качестве ответа zeoman 22 апреля 2011 г. 14:38
    18 апреля 2011 г. 15:06
  • Спасибо за подробную информацию. Попробую и отпишу
    18 апреля 2011 г. 16:22
  • Можно как то так.

     static void Delete(RichTextBox rtb)
        {
          if (rtb == null)
            throw new ArgumentNullException("rtb");
          var str = rtb.Text;
          if (string.IsNullOrEmpty(str))
            return;
          var clearStr = str.Where(ch => ch != (char)10).Where(ch => ch != (char)13).Where(ch => ch != (char)9);
          var res = new string(clearStr.ToArray());
          rtb.Text = res;
        }
    
    19 апреля 2011 г. 8:14
  • Кто-то может подсказать как сделать удаление отступов по клику кнопки ?

     

      StringBuilder sb = new StringBuilder();
      foreach (string line in richTextBox1.Lines)
      {
      if (line != String.Empty)
       sb.AppendLine(line);
      }
    
      richTextBox1.Text = sb.ToString();
    Этот код отлично работает и удаляет отступы без каких либо лишних манипуляций. Вставил текст в форму и он сразу сменился.
    Но если мне вдруг нужно будет что-то другое сделать с текстом, не удаляя пробелы. Придется прибегнуть к кнопкам. А как привязать нажатие к этому действию ?

     


    Извиняюсь . Забыл сказать что учусь программировать на C#
    19 апреля 2011 г. 15:19
  • В конструкторе на форме дважды нажмите на кнопку, которую хотите использовать, -
    в тексте программы появится строка типа
    private void Button1_Click (object sender, EventArgs e)
    {

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

    • Помечено в качестве ответа zeoman 22 апреля 2011 г. 14:38
    19 апреля 2011 г. 15:31
  • В конструкторе на форме дважды нажмите на кнопку, которую хотите использовать, -
    в тексте программы появится строка типа
    private void Button1_Click (object sender, EventArgs e)
    {

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


    Огромное спасибо
    19 апреля 2011 г. 16:01
  • zeoman, ваш вопрос решен. Отметьте, пожалуйста сообщения, решившие проблему, с помощью кнопки 'Пометить как ответ'. Спасибо.
    Для связи [mail]
    19 апреля 2011 г. 17:34
  • 1. Как осуществить удаление части текста после определенного символа (: ;) вместе с этим символом ?

    Допустим из такого текста

    hdgdtt1@fo.&&:gd52j3b
    hd655@fo.&&;dh73gcw
    2174h@fo.&&:gsd57cv1

    Оставить только такой

    hdgdtt1@fo.&&
    hd655@fo.&&
    2174h@fo.&&

    2. Как осуществить удаление определенных строк из текста.

    Допустим из большого текстовика нужно удалить определенный текст. Указываем в текстбоксе сам текст и в другом текстбоксе что именно нужно удалить и по нажатию кнопки софт ищет и удаляет это. Сейчас пользуюсь текстовым редактором. Заменяю строки которые нужно удалить на пробелы, а потом пробелы удаляю, если не нужны. Очень неудобно

     

    Если кто-то располагает ссылкой на статью по работе и редактированию текста на C# поделитесь пожалуйста. Буду очень признателен

    25 апреля 2011 г. 5:30
  • Вариантов несколько, я делаю так -


    string S="hdgdtt1@fo.&&:gd52j3b";
    string s=S.Split(':',';')[0];
    или проще -
    string s="hdgdtt1@fo.&&:gd52j3b".Split(':',';'); 

    Можно строковым методом Remove, но там нужно определить номер символа ':' в строке,
    а для этого использовать дополнительный метод IndexOf, но тоже работает -
    string S="hdgdtt1@fo.&&:gd52j3b";
    string s=S.Remove(S.IndexOf(':')); 

    Чтобы удалить текст -
    string s="hdgdtt1@fo.&&:gd52j3b".Replace("&&:gd",""); 

    Удалить строку из RichTexBox,
    в моем первом примере получаете массив строк
    string [] s=richTextBox1.Text.Split('\n'); 
    а потом собираете те, которые Вам нужны, например, непустые -

    richTextBox.Clear();
    for (int i=0;i<s.Length;i++) { if (s[i]!="") richTextBox1.AppendText(s[i]);} 

    Экспериментируйте, может быть и есть хорошие статьи, но я не видел. 



    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:54
    25 апреля 2011 г. 8:34
  • А если таких строк тысячи и все они разные.

    Как в таком случае удалить все после знака и сам знак двоеточие или точка с запятой ?

    25 апреля 2011 г. 9:08
  • string [] s=richTextBox1.Text.Split('\n');
    richTextBox.Clear();
    for (int i=0;i<s.Length;i++) 
    if (s[i]!="")
    richTextBox1.AppendText(s[i].Split(':',';')[0]);

    25 апреля 2011 г. 9:55
  • string [] s=richTextBox1.Text.Split('\n');


    richTextBox.Clear();
    for (int i=0;i<s.Length;i++) 


    if (s[i]!="")
    richTextBox1.AppendText(s[i].Split(':',';')[0]);


    После этого строки сливаются в одну и получается так:
    hdgdtt1@fo.&&hd655@fo.&&2174h@fo.&&

    Если можно оставьте пожалуйста комментарии после каждого действия.
    26 апреля 2011 г. 4:55
  • // Весь текст из richTextBox разделить (Split) на строки, и построчно записать в строковый массив
    string [] s=richTextBox1.Text.Split('\n');


    // Очистить richTextBox
    richTextBox.Clear();
    for (int i=0;i<s.Length;i++)  // В цикле

    // Если очередная строка не пустая
    if (s[i]!="") 

    // То эту строку разделить символами ':' или ';' на подстроки и первую, [0], из них записать в richTextBox,
    // здесь я забыл в конце каждой записи поставить '\n', символ перехода на другую строку, поэтому все строчки
    // слились в одну, сейчас правильно.
    richTextBox1.AppendText(s[i].Split(':',';')[0]+"\n");
    }


    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:53
    26 апреля 2011 г. 17:12
  • Спасибо за код и комментарии. Добавил их в свой код. Несколько вопросов к вам: 1. Что значит записать в масив ? Это запись в память ? 2. Что значит в цикле ? Зачем это делается ? 3. Код for (int i=0;i<s.Length;i ) тут вы добавляете новую целую (int) переменную i, присваиваете ей значение 0, указываете что она меньше s.Length и указываете что переменная i увеличивается. Правильно ли я все понял и что такое s.Length ? Пожалуйста поподробней. Ваши комментарии очень мне помогают. Я на лист бумаги выписал все комментарии и пытался понять как работает данный код. Пока не все получается.
    27 апреля 2011 г. 12:55
  • 1. Записать в массив - это значит, что весь текст, накопленный в richTextBox, rtB, будет переписан в строковый массив,
    каждый элемент которого, строка, в результате будет содержать очередную строку из rtB.
    Это можно увидеть, если поставить точку останова напротив второго оператора.
    После запуска программа остановится в этой точке.
    Не нажимая, наведите мышку на переменную "s" - в маленьком окошечке увидите "+s{string[Число]}",
    это означает, что s - строковый массив, содержащий означенное число элементов, строк.
    Если также не нажимая, вы подведете курсор на "+", то окошечко раскроется и
    покажет Вам несколько первых элементов массива s - это строки, полученные из Вашего rtB.

    2 и 3. Цикл - это в данном случае поэлементная обработка массива s, начиная с начального, нулевого, 
    элемента, первой строки в этом массиве, затем 1, 2, и т.д. и заканчивая последним, (s.Length-1) элементом,
    строкой в этом массиве. Length - одно из свойств массива, размер массива, количество строк,
    формируется и корректируется автоматически, i - переменная цикла, это с каждым разом увеличивающийся
    номер обрабатываемого элемента, строки в массиве.
    Чтобы посмотреть, какие есть другие свойства и методы у массива, надо в строке 
    for ... удалить точку после s, а затем снова эту точку поставить - в подсказывающем окошечке появляются 
    методы, помеченные красным, Aggregate<>, All<>,...,  и свойства с указующим пальцем.
    Каждая строчка снабжена кратким пояснением, что это. 
    Исчерпывающая информация в MSDN, в справочнике для разработчиков  - 
    http://msdn.microsoft.com/ru-ru/library/system.string.aspx
    Здесь нужно полазить, разобраться, как этот справочник устроен -
    более подробной информации нет нигде.


    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:53
    27 апреля 2011 г. 17:57
  • Спасибо. Буду дальше разбираться
    27 апреля 2011 г. 18:44
  • Вписываем в tB1 текст, вписываем в tB2 текст который нужно удалить.

    При нажатии button3 из tB1 удаляется только тот текст, который указан в tB2.

    Этот код удаляет все из tB1 и вписывает туда все что указано в tB2. Что нужно подправить чтобы удалялось только то, что в tB2 ?

    Сам код:

     

      private void textBox2_TextChanged(object sender, EventArgs e)
      {
    
      }
    
      private void button3_Click(object sender, EventArgs e)
      {
       string[] s = textBox2.Text.Split('\n');
       textBox1.Clear();
       for (int i = 0; i < s.Length; i++) { if (s[i] != "") textBox1.AppendText(s[i]); }
      }
     }
    }

     


    Если можно, комментируйте пожалуйста все действия.
    30 апреля 2011 г. 5:24
  • // Этот метод используется, когда нужно что-либо сделать после изменения 
    // в textBox2, например, после введения или удаления символа. Здесь этот метод не нужен.
    private void textBox2_TextChanged(object sender, EventArgs e)	
    {
    }
    
    // Этот метод вызывается автоматически при нажатии на кнопку button1
    private void button3_Click(object sender, EventArgs e)
    // Для многострочного текста обычно применяют RichTextBox - контрол,
    // в котором этот текст можно удобно просмотреть, поскольку есть скроллинг.
    // TextBox используется для однострочного текста,
    // поэтому следующий оператор, в котором текст из textBox2 построчно переписывается в массив s,
    // не верен.
     string[] s = textBox2.Text.Split('\n');
    // Здесь textBox1 очищается, пропадает все, что было
     textBox1.Clear();
    // У TextBox-а нет метода Append. Думаю, что под именем textBox1,
    // на самом деле скрывается RichTextBox, иначе этот код не работает.
    // Если это все же RichTextBox, то в этом цикле Вы переписываете
    // непустые строки из массива s в textBox1. 
     for (int i = 0; i < s.Length; i++) { if (s[i] != "") textBox1.AppendText(s[i]); }
    }
    .
    Таким образом, никакого удаления в Вашей программе не предусмотрено.
    .
    Чтобы из текста удалить заданную подстроку, набор символов, 
    обычно я использую оператор 
    .
    richTextBox1.Text.Replace(tB2.Text,"");
    .
    который во всем тексте richTextBox1.Text находит и заменяет
    все подстроки, заданные в tB2.Text, на пустышку "".

    В этом последнем операторе удалите и снова поставьте точку
    перед Replace - увидите подсказку обо всех свойствах и методах класса string.
    Передвигая курсор вверх-вниз увидите подсказку о каждом.
    См.также
    http://msdn.microsoft.com/ru-ru/library/fk49wtc1(VS.90).aspx

     

    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:53
    30 апреля 2011 г. 15:38
  •     private void textBox1_TextChanged(object sender, EventArgs e)
        {
    
        }
    
        private void button3_Click(object sender, EventArgs e)
        {
          richTextBox1.Text.Replace(textBox1.Text, "");
        }
      }
    }
    
    Не срабатывает. В richTextBox1 введен текст. В textBox1 ввожу строку которую нужно удалить и при нажатии на button3 ничего не происходит.
  • richTextBox1.Text=richTextBox1.Text.Replace(textBox1.Text, "");
    • Помечено в качестве ответа zeoman 3 мая 2011 г. 17:53
  • Спасибо. Все заработало
  • Приветствую всех.

    Такая задумка. Проверка текстового файла (1) на присутствие там строк или символов из других нескольких файлов (2;3;4;5) и запись положительного результата в текстовый файл (6). То есть если в текстовом файле находятся строки идентичные каким-то строкам или символам в других нескольких файлах, то эти строки записываются в отдельный текстовый файл. Прочитал много о чтении из фала и запись в файл, но как это все организовать даже не знаю.

    Буду признателен за вашу помощь и примеры.

  • Проверка файлов на текстовые совпадения.

    Чтобы полностью ответить на Ваш вопрос, 
    надо написать приличную программу, для меня это не реально - потребуется немало времени.
    Но принцип таков.

    Посмотрите
    http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/cf8bace9-0abb-422b-a114-c06cb01a9a5d
    Там речь о выявлении плагиата, приводится литература по теме.
    А плагиат - это тоже текстовые совпадения.

    Но существует легальная задача индексирования текстов, 
    широко применяемая в поисковых системах - Google, Яndex, и пр.
    Смысл состоит в том, чтобы среди моря информации дать пользователю 
    возможность искать в интернете нужные ему документы по 
    заданным ключевым словам.
    Для этого поисковые сайты индексируют ВСЕ документы, вращающиеся в интернете -
    это колоссальная работа.

    В чем смысл индексации?
    Создается словарь, для каждого слова в этом словаре создается список ссылок на тексты,
    в которых это слово присутстует. Это миллионы пунктов по каждому слову,
    причем не забывайте, у каждого слова возможны падежи, склонения и т.д.,
    а также английские и пр. аналоги, 
    а поисковая система предлагает еще исправить ошибку в ключевом слове, 
    если таковая имеется. 
    Для ответа на запрос система по созданному
    индексированному словарю находит пересечения, т.е. множество ссылок на тексты,
    в которых одновременно присутствуют все или большая часть ключевых слов.

    Как в действительности работает такая система - это предмет копирайта,
    защиты авторского права.

    Но простая система может быть основана на классе SortedDictionary в формате -

    SortedDictionary<string,List<string>> WordBook = new SortedDictionary<string,List<string>>();

    Здесь первый string - ключевое слово, List<string> - список адресов в строковом виде,
    где это слово присутствует, это может быть название файла и, например, номер начального байта, 
    или номер слова в тексте, или номер строки, или номер строки и номер байта в строке.
    Посмотрите http://msdn.microsoft.com/ru-ru/library/f7fta44c.aspx?ppud=4











    • Помечено в качестве ответа zeoman 7 мая 2011 г. 4:38
  • Здравствуйте.

    Возникло несколько вопросов:

    1. Как удалять нужный текст уже понятно, но вот если в строках идет нумерация так:

    | 200451 | Abramov Serg.
    | 200451 | Popov Alex.
    
    
    как удалить такую нумерацию по одному клику ? То есть удалить все до фамилий

    2. Как разделить текст в текстовом файле на блоки ?

    Допустим после каждой 40 строки сделать отступ (пробел) или два отступа

  • Изучите методы класса String и применяйте их. Вам нужно придумать лишь алгоритм.

    Или изучите регулярные выражения и применяйте их, но это уже сложнее.

    И лучше было создать новый топик-вопрос, а не продолжать этот, потому как тут уже не разберешься что к чему и нужно прочитать весь топик.


    Для связи [mail]
  • Изучите методы класса String и применяйте их. Вам нужно придумать лишь алгоритм.

    Или изучите регулярные выражения и применяйте их, но это уже сложнее.

    И лучше было создать новый топик-вопрос, а не продолжать этот, потому как тут уже не разберешься что к чему и нужно прочитать весь топик.


    Для связи [mail]

    QazRdx

    помогал мне в этом топике. Думаю он отпишется здесь.

    Это тема по работе с текстом. Думаю если кто-то другой задастся этими же вопросами, то он найдет их здесь.

  • RichTextBox rtB=new RichTextBox();
    rtB.Add("200451 Abramov Serg");
    rtB.Add("200451 Popov Alex");
    ... 
    // Весь текст из ричтекстбокса построчно записать в массив строк
    string [] strArr=RichTextBox.text.Split('\n');
    // Очистить ричтекстбокс 
    rtB.Clear();
    string [] s; 
    int Remainder; 
    for (int i=0;i<strArr.Length;i++)
    {
    // Очередную строку разделить на 3-и подстроки, вторую и третью подстроки одной строкой записать в RichTextBox
    s=strArr[i].Split(' ');
    rtB.Add(s[1]+" "+s[2]);
    // Если номер строки кратен 40, вставить пустую строку
    Math.DivRem(i,40,out Remainder);
    if (Remainder==0)	rtB.Add("\n");
    }

    • Помечено в качестве ответа zeoman 19 мая 2011 г. 20:18
  • Извиняюсь не правильно задал вопрос.

    Нумерация там такая

    | 200451 | Abramov Serg.
    | 200452 | Popov Alex.

    И этих пронумерованных строк тысячи. Из каждой строки нужно отсеять только это | ****** |,

    чтобы остались только фамилии.

          Math.DivRem(i,40,out Remainder);
    
          if (Remainder==0)	richTextBox1.Add("\n");
        }
    
    VS ругается на Remainder (элемент не существует в данном контексте) и Add (System.Windows.Forms.RichTextBox не содержит определения для Add и не был найден метод расширения для Add, принимающий тип System.Windows.Forms.RichTextBox в качестве первого аргумента (возможно пропущена директива using или ссылка на сборку)

  • 1. VS ругается на Remainder (элемент не существует в данном контексте)
    Remainder, остаток от деления - это переменная, объявленная в моем примере как int Remainder; - 
    если эта строка есть, то такой ошибки быть не должно. 

    2. Add (System.Windows.Forms.RichTextBox не содержит определения для Add...
    Пардон, не Add, а AppendText...
    Но Вы должны уже это знать,  у Вас это уже было.

    3. И этих пронумерованных строк тысячи... чтобы остались только фамилии...
    Значит rtB.AppendText(s[1]);

     

     


    • Помечено в качестве ответа zeoman 20 мая 2011 г. 8:48
  • получилось так:

        private void button4_Click(object sender, EventArgs e)
        {
          RichTextBox rtB=new RichTextBox();
          // Весь текст из ричтекстбокса построчно записать в массив строк
          string[] strArr = RichTextBox.text.Split('\n');
          // Очистить ричтекстбокс 
          rtB.Clear();
          string [] s; 
          int Remainder; 
          for (int i=0;i<strArr.Length;i++)
        {
          // Очередную строку разделить на 3-и подстроки, вторую и третью подстроки одной строкой записать в RichTextBox
          s=strArr[i].Split(' ');
          rtB.AppendText(s[1]);
          // Если номер строки кратен 40, вставить пустую строку
          Math.DivRem(i,10,out Remainder);
          if (Remainder == 0) rtB.AppendText("\n");
        }
    
    }
    
    Но VS ругается на string[] strArr = RichTextBox.[b]text[/b].Split('\n');

    System.Windows.Forms.RichTextBox не содержит определения для text

    Посмотрите пожалуйста код - правильно ли я все сделал

  • text с большой буквы T должен быть.


    Для связи [mail]
    • Помечено в качестве ответа zeoman 20 мая 2011 г. 8:48
    • Снята пометка об ответе Abolmasov Dmitry 20 мая 2011 г. 9:01
  • text с большой буквы T должен быть.


    Для связи [mail]

    уже менял, но тогда ругается на RichTextBox.Text

    Для нестатического поля, метода или свойства "System.Windows.Forms.Control.Text.get" требуется ссылка на объект  

  • Не отмечайте все подряд как ответ.

    вместо RichTextBox - должен быть объект rtB


    Для связи [mail]
  • RichTextBox создается в конструкторе, при создании проекта,
    заполняется как-то - или из файла, или в ручную, как Вы это организуете.
    И только потом нужно делать то, что у Вас записано в методе button4_Click.
    Я вставил сюда  RichTextBox rtB, чтобы было понятно, что это такое.
    Но после new RichTextBox() этот контрол пуст и обрабатывать там нечего.
    Поэтому 2 строка в этом методе не нужна - предполагается,
    что перед этим кликом rtB уже сформирован и готов к обработке.



  • RichTextBox создается в конструкторе, при создании проекта,
    заполняется как-то - или из файла, или в ручную, как Вы это организуете.
    И только потом нужно делать то, что у Вас записано в методе button4_Click.
    Я вставил сюда  RichTextBox rtB, чтобы было понятно, что это такое.
    Но после new RichTextBox() этот контрол пуст и обрабатывать там нечего.
    Поэтому 2 строка в этом методе не нужна - предполагается,
    что перед этим кликом rtB уже сформирован и готов к обработке.




    То есть эту строку убрать RichTextBox rtB=new RichTextBox();

    и везде где rtB написать RichTextBox1 ?

  • Если у Вас RichTextBox конструктором создан с именем richTextBox1, то это имя и нужно использовать.
    Посмотрите прежние записи в этом топике, там мы подробно разбирали создание проекта с этим контролом. 
  •     private void button4_Click(object sender, EventArgs e)
        {
          // Весь текст из ричтекстбокса построчно записать в массив строк
          string[] strArr = richTextBox1.Text.Split('\n');
          // Очистить ричтекстбокс 
          richTextBox1.Clear();
          string [] s; 
          int Remainder; 
          for (int i=0;i<strArr.Length;i++)
        {
          // Очередную строку разделить на 3-и подстроки, вторую и третью подстроки одной строкой записать в RichTextBox
          s=strArr[i].Split(' ');
          richTextBox1.AppendText(s[1]);
          // Если номер строки кратен 40, вставить пустую строку
          Math.DivRem(i,10,out Remainder);
          if (Remainder == 0) richTextBox1.AppendText("\n");
        }
    

    Удаляются фамилии а в rtB записываются номера строк

    | 200451| 200452 |
  • Значит нужно посмотреть на массив s - в каком именно члене этого массива расположена фамилия,
    и этот член и записывать в ричтекстбокс