Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/39: Рейтинг темы: голосов - 39, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 9

Удаление диапазона символов из String

17.01.2012, 18:08. Показов 7837. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется текстовый документ вида:
[0000.0000] R:173 G:181 B:049
[0000.0001] R:181 G:181 B:057
[0000.0002] R:181 G:189 B:066

и так очень много строк. Мне нужно его несколько уменьшить (убрать область в скобках), преобразовать числа в HEX, и записать в одну едиственную строку:
ADB531B5B539B5BD42 и т.д.

В принципе я знаю как убрать символы перехода на новую строку, и как убрать все "R:", но вот никак не пойму как вырезать область в начале.
З.Ы. Диапазон большой, 76800 строк.

Добавлено через 23 минуты
Вот попробовал один способ:
C#
1
2
3
4
while (buf.LastIndexOf("]") != -1)
        {
           buf = buf.Remove(buf.IndexOf("["), 12);
        }
Уже что то.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2012, 18:08
Ответы с готовыми решениями:

Удалить конец строки символов. Ввести кол-во удаляемых символов , вывести результат ,String ,задачка,С++
Удалить конец строки символов. Ввести количество удаляемых символов , вывести результат на печать . Помогите плиз с задачкой. тема :...

Удаление диапазона ячеек
Добрый день, форумчане! Как из DataGridView удалить диапазон ячеек, если известен номер начальной и конечной ячейки?

Удаление числа из диапазона random
Доброго времени суток! Есть таймер с рандом, у которого диапазон от 0 до 5. Каждое из этих чисел должно выбраться заданное количество раз....

17
 Аватар для Высокий
250 / 250 / 135
Регистрация: 09.04.2011
Сообщений: 524
17.01.2012, 18:20
Решение корявенькое на мой взгляд, но со строкой предложенного виды работает:
C#
1
2
3
string s = "[0000.0000] R:173 G:181 B:049";            
Regex regex = new Regex(@"\[\S+\]");
s = regex.Replace(s, "");
Либо построчно перебрать весь массив, либо (если память позволяет) загрузить в s сразу весь диапазон.

Добавлено через 1 минуту
Нужно подключить библиотеку System.Text.RegularExpressions;
1
 Аватар для _Vladimir_
57 / 55 / 10
Регистрация: 27.07.2010
Сообщений: 279
17.01.2012, 18:28
Так можно оставить нужную часть строки:
C#
1
str = str.Substring(str.IndexOf(']')+1);
затем Replace();
0
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 9
17.01.2012, 18:34  [ТС]
Память позволяет. А пробел каким символом в этом regex ? Пока что оно вырезает но оствляет пробел, тот что после скобок.
И еще, а в HEX то как преобразовать? Считывать по 3 числа и проганять через switch-case как то явно не оптимально.
0
Заблокирован
17.01.2012, 18:36
попробуйте так построчно
C#
1
2
3
4
5
6
        string s = "[0000.0000] R:173 G:181 B:049";
        string[] z = s.Split(new char[] { ' ', 'R', 'G', 'B', ':' }, StringSplitOptions.RemoveEmptyEntries);
        Console.Write((Convert.ToString(int.Parse(z[1]), 16)).ToUpper());
        Console.Write((Convert.ToString(int.Parse(z[2]), 16)).ToUpper());
        Console.Write((Convert.ToString(int.Parse(z[3]), 16)).ToUpper());
        Console.ReadKey();
1
Заблокирован
17.01.2012, 18:58
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Linq;
 
class Program
{
    static void Main()
    {
        string str = @"[0000.0000] R:173 G:181 B:049
                       [0000.0001] R:181 G:181 B:057
                       [0000.0002] R:181 G:189 B:066";
        string[] split = str.Split(new string[] { " ", ":", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        var d = split.Where(p => char.IsDigit(p[0]));
        Console.WriteLine(string.Join("", d.Select(c => int.Parse(c).ToString("X2")).ToArray()));
        Console.ReadKey();
 
    }
}
1
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 9
17.01.2012, 19:10  [ТС]
Большое всем спасибо!
0
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 9
19.01.2012, 18:23  [ТС]
Появилась еще одна проблемка, мне нужно текстовый документ перевести из 16-го вида в документ, где каждая пара символов (например 0F) будет переведена в соответствующий этому числу ASCII символ.
Мой текстовый документ имеет вид "ADB531B5B539B5BD42", нужно получить что-то наподобие такого "*µ1µµ9µ½B".
Нашел похожий пример:
C#
1
2
3
4
5
6
7
8
9
10
public string HexAsciiConvert(string hex)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i <= hex.Length - 2; i += 2)
        {
            sb.Append(Convert.ToString(Convert.ToChar(Int32.Parse(hex.Substring(i, 2),
            System.Globalization.NumberStyles.HexNumber))));            
        }        
        return sb.ToString();
    }
Но при просмотре текста HEX-редактором оказывается, что добавились еще непечатаемые символы "C2", чего мне совсем не нужно. Как от них избавиться?
0
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 9
31.01.2012, 00:55  [ТС]
Народ, помогите, осталось чуток доделать программу. Вот листинг
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
28
29
30
31
32
33
34
35
36
37
38
39
class change
{
    public string HexAsciiConvert(string hex)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i <= hex.Length - 2; i += 2)
        {
            sb.Append(Convert.ToString(Convert.ToChar(Int32.Parse(hex.Substring(i, 2),
            System.Globalization.NumberStyles.HexNumber))));            
        }
        
        return sb.ToString();
        
 
    }
}
 
 
class Program
{
    static void Main()
    {
        string path = @"C:\Users\rand0m\Desktop\raw.txt";
        if (File.Exists(path))
        {
            string str = File.ReadAllText(path, Encoding.UTF8);
 
            string[] split = str.Split(new string[] { " ", ":", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
            var d = split.Where(p => char.IsDigit(p[0]));
            str = string.Join("", d.Select(c => int.Parse(c).ToString("X2")).ToArray());
 
            change hex = new change();
            str = hex.HexAsciiConvert(str); 
                        
            System.IO.File.WriteAllText(@"C:\Users\rand0m\Desktop\Text.txt", str);
 
        }        
    }
}
Исходный файл как и прежде вида:
[0000.0000] R:173 G:181 B:049
[0000.0001] R:181 G:181 B:057
[0000.0002] R:181 G:189 B:066

Файл на выходе имеет вид:
*µ1µµ9µ½B
но при просмотре HEX редактором видно, что добавились лишние символы, вместо
ADB531B5B539B5BD

имеется
C2 AD C2 B5 31 C2 B5 C2 B5 39 C2 B5 C2 BD 42

За счет чего они генерируются, как от них избавиться?
Миниатюры
Удаление диапазона символов из String  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.01.2012, 12:09
Цитата Сообщение от vetal_alien Посмотреть сообщение
За счет чего они генерируются, как от них избавиться?
Генерируются они за счет того, что вы текст пишете в кодировке utf-8, где один символ может быть отображен более чем одним байтом, вот у вас на выходе и получается:
C2AD
C2B5
31
C2B5
C2B5
39
C2B5
C2BD
42

Избавиться от них можно, сохраняя файл в другой кодировке.
Правда, в случае с ASCII, все символы со значением выше 128-и будут сохранены как "?", в результате чего полетят все данные.

Короче, записывайте в бинарный файл.
0
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 9
31.01.2012, 22:02  [ТС]
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
static void Main()
    {
        string path = @"C:\Users\rand0m\Desktop\raw.txt";
        if (File.Exists(path))
        {
            string str = File.ReadAllText(path, Encoding.ASCII);
 
            string[] split = str.Split(new string[] { " ", ":", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
            var d = split.Where(p => char.IsDigit(p[0]));
            str = string.Join("", d.Select(c => int.Parse(c).ToString("X2")).ToArray());
 
            change hex = new change();
            str = hex.HexAsciiConvert(str);
 
            FileStream fs = new FileStream(@"C:\Users\rand0m\Desktop\ne.bin", FileMode.CreateNew);           
            BinaryWriter w = new BinaryWriter(fs);
 
            w.Write(str);
 
            w.Close();
            fs.Close();
           
 
        }
Итого теперь на выходе, через HEX-редактор:
0F C2 AD C2 B5 31 C2 B5 C2 B5 39 C2 B5 C2 BD 42

То есть добавилось еще и 0F в начале. Я уже не знаю что делать, совсем зеленый еще.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
01.02.2012, 06:58
Цитата Сообщение от vetal_alien Посмотреть сообщение
Я уже не знаю что делать
дебажить - почти железное решение, если что-то не так работает
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.02.2012, 10:35
Цитата Сообщение от vetal_alien Посмотреть сообщение
Я уже не знаю что делать
В вашем случае - только изменять постановку задачи.
Выше вы написали:
Цитата Сообщение от vetal_alien Посмотреть сообщение
мне нужно текстовый документ перевести из 16-го вида в документ, где каждая пара символов (например 0F) будет переведена в соответствующий этому числу ASCII символ.
Дело в том, что данная задача невыполнима по определению, т.к. у вас диапазон допустимых значений 0-255 (0х00 - 0хFF), а диапазон символов в таблице кодировки ASCII - 0-127 (0х00 - 0х7F). То есть не все значения, которые могут быть в вашем файле, возможно отобразить в виде символа из таблицы ASCII.
Отсюда и "волшебные" значения при чтении файла хекс-редактором.
0
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 9
01.02.2012, 10:40  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
То есть не все значения, которые могут быть в вашем файле, возможно отобразить в виде символа из таблицы ASCII.
Мне и не критично отображать все, мне только необходимо сохранить данные числа 0x00 - 0xFF в текстовый документ, все остальное сделает устройство в железе.
Единственное что критично - отсутствие символов, которых не было в исходном файле.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
01.02.2012, 17:09
Записывайте напрямую байты в поток.

подправленный HexConverter
C#
1
2
3
4
5
6
7
8
9
        private static byte[] HexAsciiConvert(string hex)
        {
            byte[] arr = new byte[hex.Length / 2];
 
            for (int i = 0, j=0; i <= hex.Length - 2; i += 2, j++)
                arr[j] = Byte.Parse(hex.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
            
            return arr;
        }
и запись
C#
1
2
3
4
5
6
                byte[] res = HexAsciiConvert(str);
 
                FileStream fs = new FileStream(@"D:\2.txt", FileMode.OpenOrCreate);
                BinaryWriter w = new BinaryWriter(fs);
 
                w.Write(res);
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.02.2012, 17:12
Цитата Сообщение от vetal_alien Посмотреть сообщение
Мне и не критично отображать все, мне только необходимо сохранить данные числа 0x00 - 0xFF в текстовый документ, все остальное сделает устройство в железе.
У меня сильное подозрение, что вы как-то не так пытаетесь реализовать поставленную задачу.
Что на входе ожидает "устройство в железе"?
0
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 9
01.02.2012, 17:18  [ТС]
turbanoff, заработало! Огромная вам благодарность!

kolorotur, оно ожидает поток чисел в 16й форме. Программа, отсылающая файл передает его шестнадцатеричный вид, поэтому такой гемморой.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.02.2012, 23:09
Ну, собственно, вам можно было и не заморачиваться с переводом чисел в шестнадцатеричный вид, а потом снова в буквы, а просто записывать в двоичный файл уже готовые числа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.02.2012, 23:09
Помогаю со студенческими работами здесь

Удаление на листах определенного диапазона
Подскажите пожалуйста, как осуществить удаление на листах со 2 по 7 и только 30 столбцов(и только первые 15 сверху строк) после указанного...

Удаление пустых ячеек из диапазона
Добрый день, Уважаемые программисты, администраторы и гости этого Форума! Может кто-нибудь из вас сталкивался с подобной проблемой?!? ...

Ввод только определенных символов, удаление запрещенных символов из ячейки ввода
Добрый вечер! Подскажите, пожалуйста, как можно такое реализовать посредством jQuery. Вот форма: &lt;div id=&quot;comment&quot;&gt; ...

Удаление из имён файлов определённых символов и сочетаний символов
Есть много обложек и в названиях присутствуют знаки &quot;%2C+&quot; и &quot;+&quot; (без кавычек) пример: название1%2C+название2+3.jpg как бы их убрать, в...

Вставка в строку нескольких символов и удаление символов из строки
не могу найти информацию про это:( какими операторами это делается?


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru