Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Futtoto
12 / 1 / 3
Регистрация: 26.06.2016
Сообщений: 87
1

Из текста удалить все символы, кроме указанных

10.08.2016, 20:06. Просмотров 1570. Ответов 31
Метки нет (Все метки)

как сделать так чтобы из текста удались все символы кроме тех, которые заранее можно указать?

поподробнее... имеется строка, закодированная Base64 + в этом же файле имеются символы переноса строки, нулевые символы и другие... на выходе должна получится строка с символами, которые используются в кодировке Base64, а все лишнее должно удалиться. Обрабатываемые файлы могут достигать размера 5 Мбайт, так что желательно чтобы все эти преобразования делались как можно шустрее.

Добавлено через 32 минуты
никто не знает? ((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2016, 20:06
Ответы с готовыми решениями:

Удалить из папки все файлы, кроме указанных
Здравствуйте уважаемые форумчане! Необходимо удалить из папки все файлы, кроме...

Удалить все символы строки кроме первого
Собственно вся суть в сабже. Есть строка с одним словом. В этом слове нужно...

Удалить из однотипных строчек все буквы и символы кроме цифр
есть переменная в которой храниться значение вот такого типа...

Удалить из строк все символы, кроме букв английского алфавита
Как сделать это проще? Желательно без foreach, for или while. static...

Убить все процессы кроме указанных (системных)
например есть лист: List<string> name = new List<string>{"svchost", "csrss",...

31
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
10.08.2016, 20:09 2
прочитать файл, посмотреть что за символ, и сформировать нужную строку из символов прошедшие валидацию.
0
Futtoto
12 / 1 / 3
Регистрация: 26.06.2016
Сообщений: 87
10.08.2016, 20:28  [ТС] 3
эт понятно, что надо каждый символ сравнивать с символами словаря, если совпадает, то записывать в другой файл, если не совпадает, то пропускать... а как все это на c# сделать-то?

Добавлено через 13 минут
подскажите пожалуйста
0
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
10.08.2016, 20:44 4
Цитата Сообщение от Futtoto Посмотреть сообщение
подскажите пожалуйста
C#
1
2
3
4
5
6
7
8
        static string Remove(string inPuth, string alfavit)
        {
            string outPuth = "";
            foreach (char item in inPuth)
                if (alfavit.IndexOf(item) != -1)
                    outPuth += item;
            return outPuth;
        }
прочти личку
0
Lexeq
649 / 539 / 393
Регистрация: 21.01.2014
Сообщений: 1,480
Завершенные тесты: 2
10.08.2016, 23:27 5
Prizrak86, пощадите сборщика мусора, воспользуйтесь StringBuilder'ом.
0
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
10.08.2016, 23:33 6
Цитата Сообщение от Lexeq Посмотреть сообщение
пощадите сборщика мусора, воспользуйтесь StringBuilder'ом.
как проверить эффективность этого способа?
я к тому что, как устроен механизм в этом классе удаления символов, не сходит ли и в нем сборщик мусора сума?
0
Lexeq
649 / 539 / 393
Регистрация: 21.01.2014
Сообщений: 1,480
Завершенные тесты: 2
10.08.2016, 23:39 7
Так как строки в C# неизменяемые, то вот тут
C#
1
outPuth += item;
каждый раз будет создаваться новая. При размере файла в 5Мб это просто катастрофа.
0
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
10.08.2016, 23:53 8
да, при этом старая тут же будет уничтожатся, давай экперимент проведем с мои кодом, глянем как оператива, будет скакать или нет?

Добавлено через 6 минут
вот файл на 5 метров https://yadi.sk/i/d05KS65Ku7v27
возьмем алфавит fzkdgxbdf
0
kolorotur
Эксперт .NET
10485 / 8673 / 2157
Регистрация: 17.09.2011
Сообщений: 14,888
Завершенные тесты: 1
10.08.2016, 23:56 9
Цитата Сообщение от Futtoto Посмотреть сообщение
как сделать так чтобы из текста удались все символы кроме тех, которые заранее можно указать?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static class StringExtensions
{
   public static string Remove(this string s, params char[] charsToRemove)
   {
      var buffer = new char[s.Length];
      var hash   = new HashSet<char>(charsToRemove);
 
      int j = 0;
      foreach (var c in s)
         if (!hash.Contains(c)) buffer[j++] = c;
 
      return new string(buffer, 0, j);
   }
}
Использование:
C#
1
2
string str = "Hello world!";
str = str.Remove(' ', '!', 'o');
1
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
10.08.2016, 23:57 10
код программы следующий
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        static void Main(string[] args)
        {
            Console.WriteLine("read");
            string strInPuth = File.ReadAllText("InPuth.txt");
            Console.WriteLine("remove");
            string strOutPuth = Remove(strInPuth, "fzkdgxbdf");
            Console.WriteLine("write");
            File.WriteAllText("OutPuth.txt", strOutPuth);
            Console.WriteLine("end");
            Console.ReadLine();
        }
        static string Remove(string inPuth, string alfavit)
        {
            string outPuth = "";
            foreach (char item in inPuth)
                if (alfavit.IndexOf(item) != -1)
                    outPuth += item;
            return outPuth;
        }
0
КОП
522 / 379 / 120
Регистрация: 15.08.2010
Сообщений: 1,055
Завершенные тесты: 1
11.08.2016, 00:17 11
Цитата Сообщение от Prizrak86 Посмотреть сообщение
код программы следующий
сам то хоть протестировал оба варианта?
0
Lexeq
649 / 539 / 393
Регистрация: 21.01.2014
Сообщений: 1,480
Завершенные тесты: 2
11.08.2016, 00:23 12
Засек время: 58200ms через сложение строк против 23ms через StringBuilder. И это на файле 700кб, а не 5Мб.
0
КОП
11.08.2016, 00:24
  #13

Не по теме:

Цитата Сообщение от Lexeq Посмотреть сообщение
Засек время: 58200ms через сложение строк против 23ms через StringBuilder. И это на файле 700кб, а не 5Мб.
я на 5 не дождался, убил процесс :D

0
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
11.08.2016, 00:27 14
Цитата Сообщение от КОП Посмотреть сообщение
сам то хоть протестировал оба варианта?
ХОТЬ и тестирую, мой на долго залип, уже минут 7 лопатит, потом протестирую еще два которые здесь предлагались, результаты будут в виде диаграммы потребления оперативной памяти

Добавлено через 1 минуту
че-то страшно стало за такое время обработки

Добавлено через 57 секунд
а по поводу сборщика мусора, так 10 минут работы программы, пиковаый забив оперативы 100мб
0
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
11.08.2016, 00:29 15
не дождался окончания по моему алгоритму так с памятью
Из текста удалить все символы, кроме указанных
, сейчас остальные попробую
0
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
11.08.2016, 00:34 16
так, второй вариант тестирую, вот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static void Main(string[] args)
        {
            DateTime dtStart = DateTime.Now;
            Console.WriteLine("read");
            string strInPuth = File.ReadAllText("InPuth.txt");
            Console.WriteLine("end read "+(DateTime.Now - dtStart));
            Console.WriteLine("remove");
            string strOutPuth = Remove(new StringBuilder(strInPuth), "fzkdgxbdf");
            //string strOutPuth = Remove(strInPuth, "fzkdgxbdf");
            Console.WriteLine("end remove " + (DateTime.Now - dtStart));
            Console.WriteLine("write");
            File.WriteAllText("OutPuth.txt", strOutPuth);
            Console.WriteLine("end write " + (DateTime.Now - dtStart));
            Console.ReadLine();
        }
 
 
        static string Remove(StringBuilder inPuth, string alfavit)
        {
            for (int i = 0; i < inPuth.Length; i++)
                if (alfavit.IndexOf(inPuth[i]) != -1)
                {
                    inPuth.Remove(i, 1);
                    i--;
                }
            return inPuth.ToString();
        }
0
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
11.08.2016, 00:36 17
сразу могу сказать что сборщик мусора не сходит сума, пока так
Из текста удалить все символы, кроме указанных
0
Lexeq
649 / 539 / 393
Регистрация: 21.01.2014
Сообщений: 1,480
Завершенные тесты: 2
11.08.2016, 00:38 18
Prizrak86, только учти, что код kolorotur удаляет символы, которые передаются в метод Remove, а у тебя наоборот.
Цитата Сообщение от Prizrak86 Посмотреть сообщение
пиковаый забив оперативы 100мб
Ну так сборщик напряженно работает, вычищая все лишнее. Но и 100Мб согласитесь не мало для такой простой задачи.
Цитата Сообщение от Prizrak86 Посмотреть сообщение
сборщик мусора не сходит сума
Так вон на первом скриншоте, каждые несколько секунд потеет.
0
Prizrak86
51 / 51 / 18
Регистрация: 20.03.2015
Сообщений: 278
11.08.2016, 00:45 19
Цитата Сообщение от Lexeq Посмотреть сообщение
Но и 100Мб согласитесь не мало для такой простой задачи.
соглашусь. мой вариант бесспорно проигрывает, со стрингбилдером на отметке 40мб держится стабильно

Добавлено через 4 минуты
Цитата Сообщение от Lexeq Посмотреть сообщение
Сообщение от Prizrak86
сборщик мусора не сходит сума
Так вон на первом скриншоте, каждые несколько секунд потеет.
это я уже про второй эксперимент говорил что НЕ сходит, а в моем, очередь пулеметная, индский код...
0
КОП
522 / 379 / 120
Регистрация: 15.08.2010
Сообщений: 1,055
Завершенные тесты: 1
11.08.2016, 00:47 20
Цитата Сообщение от Prizrak86 Посмотреть сообщение
соглашусь. мой вариант бесспорно проигрывает, со стрингбилдером на отметке 40мб держится стабильно
вариант с билдером ведь у тебя примерно так выглядит? а то на последнем скриншоте время выполнения чет большое сильно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
 
            string s = File.ReadAllText(@"inPut.txt");
 
            sw.Start();
 
            s = RemoveSB(s, "fzkdgxbdf");
 
            sw.Stop();
 
            File.WriteAllText(@"output.txt", s);
            
            Console.WriteLine(sw.ElapsedMilliseconds);
            Console.Read();
 
        }
 
        static string RemoveSB(string inPut, string alfavit)
        {
            StringBuilder outPuth = new StringBuilder();
            foreach (char item in inPut)
                if (alfavit.IndexOf(item) != -1)
                    outPuth.Append(item);
            return outPuth.ToString();
        }
0
11.08.2016, 00:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2016, 00:47

Регулярное выражение, принимающее все символы, кроме цифр и точки
Маленький вопрос. Как правильно составить регулярное выражение, которое бы...

Регулярные выражения. Выбрать все символы кроме цифр и первого плюса
Подскажите пожалуйста как правильно написать регулярку. Есть примерно такая...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru