Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
165 / 137 / 23
Регистрация: 02.01.2011
Сообщений: 913
1

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

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

Есть текстовый фаил такого типа. Помогите, пожалуйста распарсить его, т.е вытащить все значения справа от "=".Все, что слева - забито железно, названия секции- тоже забиты. Про 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2012, 16:17
Ответы с готовыми решениями:

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

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

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

Распарсить текстовый файл
помогите пожалуйста допустим у нас есть текстовый документ list.txt в котором есть некая база ...

10
425 / 426 / 93
Регистрация: 16.07.2012
Сообщений: 886
31.07.2012, 16:51 2
А в чем загвоздка? Читаете из файла все строки через File.ReadLines, перебираете строки, те которые начинаются с < отбрасываете при помощи String.StartsWith("<"), все остальные разбиваете напополам через String.Split('='), получаете пары имя-значение.
1
152 / 152 / 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
707 / 674 / 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
165 / 137 / 23
Регистрация: 02.01.2011
Сообщений: 913
01.08.2012, 09:42  [ТС] 5
Спасибо- всем. Сейчас буду пробовать!

Добавлено через 1 час 41 минуту
Опять я затосковала. Мне надо записать каждую секцию в отдельныи лист, т.е. прежде, чем выкинуть название секции, надо проверить, что эта секция началась(и закончилась?) Как это сделать? спасибо!
0
707 / 674 / 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
165 / 137 / 23
Регистрация: 02.01.2011
Сообщений: 913
01.08.2012, 10:49  [ТС] 7
Tessen, спасибо огромное! Но я что-то запуталась, не могли бы Вы пояснить свои код?
0
707 / 674 / 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
165 / 137 / 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
30 / 30 / 4
Регистрация: 14.05.2010
Сообщений: 57
01.08.2012, 11:48 10
попробуйте вот-так
C#
1
string s = Sections[0].Name;
1
707 / 674 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2012, 12:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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