Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/48: Рейтинг темы: голосов - 48, средняя оценка - 4.71
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
1

Распарсить файл

31.07.2012, 16:17. Показов 8802. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть текстовый фаил такого типа. Помогите, пожалуйста распарсить его, т.е вытащить все значения справа от "=".Все, что слева - забито железно, названия секции- тоже забиты. Про XML я в курсе. Формат текстового файла определен не мнои И изменять его на что-либо удобоваримое я не могу. Спасибо!
<section U>
"Name1"=0545771280
"Name2"=9899
<endsection U>
<section A>
Sensor=A
H_T=215
Time=120
Err=0
Sensor =B
H_T=44
Time=420
Err=4
<endsection A>
и таких секции - до фига
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.07.2012, 16:17
Ответы с готовыми решениями:

Распарсить файл csv
Здравствуйте, при считывании из файла csv в котором строки разделяются точкой с запятой, требуется чтобы от ; до ; должны быть слова...

Распарсить текстовый файл
Добрый вечер. Есть файл, который загружается в TextBox. В каждой строке находятся данные о квартире: 4 1 100 Проспект мира ( 4 это...

Распарсить текстовый файл
Добрый вечер. Нужно распарсить текстовый файл, пример, текста: Вид деятельности: футболист Возраст: 32 Пол: мужчина Наград: 16 и...

10
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
31.07.2012, 16:51 2
А в чем загвоздка? Читаете из файла все строки через File.ReadLines, перебираете строки, те которые начинаются с < отбрасываете при помощи String.StartsWith("<"), все остальные разбиваете напополам через String.Split('='), получаете пары имя-значение.
1
155 / 155 / 30
Регистрация: 19.10.2009
Сообщений: 319
31.07.2012, 17:31 3
Можно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  private void Parse(string fileName)
  {
    var regex = new Regex(@"<([^/>]*)\b[^>]*>([^<]*)<end\1>");
    var subregex = new Regex(@"([^=]*)=([^\n]*\n)");
    string content;
    using (StreamReader file = new StreamReader(fileName))
      content = file.ReadToEnd();
    var matches = regex.Matches(content);
    foreach (Match match in matches)
    {
      Console.WriteLine("Раздел {0}:", match.Groups[1].Value);
      var submatches = subregex.Matches(match.Groups[2].Value);
      foreach (Match submatch in submatches)
    Console.WriteLine("Значение {0} равно {1}", submatch.Groups[1].Value, submatch.Groups[1].Value);
    }
  }
1
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
31.07.2012, 17:32 4
вариант из 1го ответа выглядит проще и короче
C#
1
2
3
4
5
6
7
8
9
10
11
12
        struct str
        {
            public string Name;
            public string Value;
        }
        static void Main(string[] args)
        {
            var list=new List<str>();
            foreach (string s in File.ReadAllLines(@"C:\1.txt"))
                if (!s.TrimStart(' ').StartsWith("<"))
                    list.Add(new str { Name = s.Split('=')[0], Value = s.Split('=')[1] });
        }
1
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
01.08.2012, 09:42  [ТС] 5
Спасибо- всем. Сейчас буду пробовать!

Добавлено через 1 час 41 минуту
Опять я затосковала. Мне надо записать каждую секцию в отдельныи лист, т.е. прежде, чем выкинуть название секции, надо проверить, что эта секция началась(и закончилась?) Как это сделать? спасибо!
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
01.08.2012, 10:12 6
думаю можно намного проще и короче, это просто что первое в голову пришло )
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
40
41
42
43
44
namespace ConsoleApplication1
{
    class Program
    {
        public class Section
        {
            public string Name;
            public List<obj> Params;
            public Section()
            {
                Params = new List<obj>();
            }
        }
        public struct obj
        {
            public string Name;
            public string Value;
        }
        public static List<Section> Parse(string path)
        {
            var reg = new Regex(@"(?<=<section )[\w\d]+(?=\>)");
            var list = new List<Section>();
            Section sec = null;
            foreach (string s in File.ReadAllLines(@"C:\1.txt"))
                if (reg.IsMatch(s))
                {
                    if (sec != null)
                        list.Add(sec);
                    sec = new Section();
                    sec.Name = reg.Match(s).Value;
                }
                else 
                    if (!s.Trim(' ').StartsWith("<end"))
                        sec.Params.Add(new obj { Name = s.Split('=')[0], Value = s.Split('=')[1] });
            if (sec != null)
                list.Add(sec);
            return list;
        }
        static void Main(string[] args)
        {
            List<Section> Sections = Parse(@"C:\1.txt");
        }
    }
}
1
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
01.08.2012, 10:49  [ТС] 7
Tessen, спасибо огромное! Но я что-то запуталась, не могли бы Вы пояснить свои код?
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
01.08.2012, 10:54 8
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
40
41
42
43
44
namespace ConsoleApplication1
{
    class Program
    {
        public class Section // класс секции
        {
            public string Name; // содержит ее имя
            public List<obj> Params; //и список параметров
            public Section() // конструктор секции
            {
                Params = new List<obj>(); //инициализирует лист
            }
        }
        public struct obj //структура данных-параметров
        {
            public string Name; // содержит имя
            public string Value; // и значение
        }
        public static List<Section> Parse(string path) //метод парс, принимает путь к файлу возвращает лист
        {
            var reg = new Regex(@"(?<=<section )[\w\d]+(?=\>)"); //регулярное выражение для поиска начала секции
            var list = new List<Section>(); // лист объектов класса секция
            Section sec = null; // создаем новую ссылку на объект типа секция
            foreach (string s in File.ReadAllLines(path)) // здесь в посте выше ошибка - должно быть path вместо пути, копировал просто, цикл выполняется для каждой строки в файле
                if (reg.IsMatch(s)) // если найдено совпадение (начало секции)
                {
                    if (sec != null) // если у нас уже есть объект секции т.е. ссылка не null
                        list.Add(sec); //записываем в лист
                    sec = new Section(); // создаем новый объект секции
                    sec.Name = reg.Match(s).Value; //записываем имя секции
                }
                else // если нет совпадения (не начало секции
                    if (!s.Trim(' ').StartsWith("<end")) // и не строка обозначающая ее конец
                        sec.Params.Add(new obj { Name = s.Split('=')[0], Value = s.Split('=')[1] }); //добавляем параметр в лист
            if (sec != null) // это нужно для файла без секций т.е. пустого
                list.Add(sec); //записываем последнюю секцию
            return list; //возвращаем лист
        }
        static void Main(string[] args)
        {
            List<Section> Sections = Parse(@"C:\1.txt"); // вызываем метод парс
        }
    }
}
1
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
01.08.2012, 11:38  [ТС] 9
Tessen, спасибо и извините за назойливость! Мне надо каждую секцию из фаила считать в определенную DataGridView. Т.е. содержимое секции, например, <sectionU> , в DataGridView -User с определенного столбца. Но у меня не получается по вашему коду найти имя секции в листеТ.е. делаю так
C#
1
2
List<Section> Sections = Parse(filename);
string s = Sections.Name;
но такого нет, а ведь в классе Section есть public string Name;?
0
 Аватар для Reiji Cross
30 / 30 / 4
Регистрация: 14.05.2010
Сообщений: 57
01.08.2012, 11:48 10
попробуйте вот-так
C#
1
string s = Sections[0].Name;
1
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
01.08.2012, 12:00 11
Цитата Сообщение от iva_a Посмотреть сообщение
Tessen, спасибо и извините за назойливость! Мне надо каждую секцию из фаила считать в определенную DataGridView. Т.е. содержимое секции, например, <sectionU> , в DataGridView -User с определенного столбца. Но у меня не получается по вашему коду найти имя секции в листеТ.е. делаю так
C#
1
2
List<Section> Sections = Parse(filename);
string s = Sections.Name;
но такого нет, а ведь в классе Section есть public string Name;?
имя то есть, но Sections это не объект класса Section, а лист таких объектов
следовательно чтобы добраться до самого объекта вам надо указать его индекс в листе, пример вам привели выше
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.08.2012, 12:00
Помогаю со студенческими работами здесь

Распарсить текстовый файл
помогите пожалуйста допустим у нас есть текстовый документ list.txt в котором есть некая база // это list.txt { id: '1'; ...

Распарсить текстовый файл
Привет всем. Есть файл 1.txt . В нем строки table2495gjbo4 table240gb354 //98 table24g3545 Мне нужно вытащить из файла...

Распарсить текстовый файл
Есть текстовый файл. Вот пример его содержания: Как сделать так, чтоб в файле удалилось всё, кроме &quot;id: 514350,&quot; и...

Распарсить текстовый файл
t=-100 t=-75 t=-50 t=0 t=50 t=100 t=300 1 1,0000 , 1,0000 , 1,0000 , 1,0000 , 1,0000 , 1,0000 , 1,0000 ...

Распарсить Json файл с координатами
Здравствуйте, помогите с задачей. У меня имеется Json файл с координатами штатов в виде {&quot;WA&quot;: , , , ...} Стоит такая задача,...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Неблокируемый стек в C++26: реализуем простой сборщик мусора
stackOverflow 02.03.2025
Многопоточные приложения требуют надежных и производительных структур данных, способных эффективно работать в условиях конкурентного доступа. Неблокируемые структуры данных представляют собой особый. . .
Шаблон REQ/REP в ZeroMQ: сверхбыстрый обмен сообщениями в C++ и Python
stackOverflow 02.03.2025
Построение высоконагруженных распределенных систем требует надежного и производительного механизма обмена сообщениями. ZeroMQ выделяется среди прочих решений своей невероятной скоростью работы и. . .
Нестандартные приемы работы с итераторами в C++
stackOverflow 02.03.2025
Итераторы - один из краеугольных камней C++, предоставляющий универсальный механизм обхода и манипуляции данными в контейнерах. Появившись как замена небезопасным указателям, они эволюционировали от. . .
Лексический анализ и регулярные выражения в C++26
stackOverflow 02.03.2025
Лексический анализ - ядро любого компилятора и инструмента обработки текста. Каждый программист сталкивается с задачами парсинга строк, обработки файлов конфигурации или анализа пользовательского. . .
Подробно о std::mdspan в C++23
stackOverflow 02.03.2025
Работа с многомерными массивами данных традиционно была одной из сложных задач в C++. Программистам приходилось создавать собственные абстракции или использовать сторонние библиотеки для эффективной. . .
Колмогоровская сложность в C++: Путь к совершенному коду
stackOverflow 02.03.2025
Абстрактная математическая теория Колмогорова стала мощным средством оценки и улучшения программного кода. Сложность алгоритма - не только в его вычислительной эффективности, но и в том, насколько. . .
Изменения в C# 14
stackOverflow 02.03.2025
Одно из самых значимых изменений в C# 14 - поддержка коллекционных выражений, которые позволяют создавать и инициализировать коллекции с помощью нового лаконичного синтаксиса. Это нововведение. . .
Разработка кроссплатформен­­­­ного мобильного приложения для iOS/Android на C++
bytestream 02.03.2025
C++ как язык программирования высокого уровня с прямым доступом к аппаратным ресурсам позволяет создавать приложения, работающие одинаково быстро как на iOS, так и на Android устройствах. Ни для кого. . .
Аутентификация/авторизация на Golang
bytestream 02.03.2025
Go предлагает множество возможностей для создания надежных систем аутентификации. Встроенные криптографические пакеты, высокая производительность и простота параллельной обработки запросов делают его. . .
Нововведения TypeScript 5.8
bytestream 02.03.2025
TypeScript 5. 8 приносит много возможностей и оптимизаций, которые существенно расширяют границы типобезопасного программирования на JavaScript. Эта версия включает ряд значительных улучшений в работе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru