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

"Вытаскивание" и форматирование нужных строчек из файла

18.03.2014, 16:48. Просмотров 640. Ответов 4
Метки нет (Все метки)

Добрый день, есть файлы RDP примерно такого содержания:
screen mode id:i:2
use multimon:i:0
desktopwidth:i:800
desktopheight:i:600
session bpp:i:32
winposstr:s:0,3,0,0,800,600
compression:i:1
keyboardhook:i:2
audiocapturemode:i:0
videoplaybackmode:i:1
connection type:i:7
networkautodetect:i:1
bandwidthautodetect:i:1
displayconnectionbar:i:1
enableworkspacereconnect:i:0
disable wallpaper:i:0
allow font smoothing:i:0
allow desktop composition:i:0
disable full window drag:i:1
disable menu anims:i:1
disable themes:i:0
disable cursor setting:i:0
bitmapcachepersistenable:i:1
full address:s:xxx.xxx.xxx.xxx:xxxx /admin /control
audiomode:i:0
redirectprinters:i:1
redirectcomports:i:0
redirectsmartcards:i:1
redirectclipboard:i:1
redirectposdevices:i:0
autoreconnection enabled:i:1
authentication level:i:2
prompt for credentials:i:0
negotiate security layer:i:1
remoteapplicationmode:i:0
alternate shell:s:
shell working directory:s:
gatewayhostname:s:
gatewayusagemethod:i:4
gatewaycredentialssource:i:4
gatewayprofileusagemethod:i:0
promptcredentialonce:i:0
use redirection server name:i:0
rdgiskdcproxy:i:0
kdcproxyname:s:
Нужно вытащить строчку: full address:s:xxx.xxx.xxx.xxx:xxxx /admin /control
Я реализовал так:

C#
1
2
3
4
5
6
7
8
 var SearhOnRDPFiles = from iFileName in Directory.EnumerateFiles(iTBFullPath.Text, "*." + iCBExt.Text, SearchOption.TopDirectoryOnly)
                        from iLineName in File.ReadLines(iFileName)
                        where iLineName.Contains("full address")
                        select new
                        {
                            File = iFileName,
                            Line = iLineName
                        };
После отформатировал текст, под свой listView, в нем 4 колонки: Имя, IP, Port, Ключи.
Вот код форматирования текста..
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
foreach (var iFactoryFile in SearhOnRDPFiles)
            {
                try
                {
                    ListViewItem lvi = new ListViewItem(iFactoryFile.File.Replace(iTBFullPath.Text + @"\", "").Replace(".rdp", ""));
                    string fLines = iFactoryFile.Line.Replace("full address:s:", "");
                    if (fLines.IndexOf(':') != -1 ) 
                    {
                        int iCount = 0;
                        ipAddressPort = fLines.Split(':');
                        
                        foreach (string tmpVars in ipAddressPort)
                        {
                            if (iCount==1)
                            {
                                if (tmpVars.IndexOf('/') != -1)
                                {
 
                                    string[] tmpVarsKeys = tmpVars.Split(' ');
                                    foreach(string _tmpVarsKeys in tmpVarsKeys)
                                    {
                                        lvi.SubItems.Add(""+_tmpVarsKeys);
                                    }
                                }
                                iCount= 0;
                            }
                            else
                            {
                                lvi.SubItems.Add(tmpVars);
                                iCount++;
                            }
                        }
                    }
                    else
                    {
                        int iCount = 0;
                        ipAddressPort = fLines.Split(' ');
                        foreach(string tmpVarsKeys in ipAddressPort)
                        {
                            if (iCount == 1)
                            {
                                lvi.SubItems.Add("3389");
                                iCount++;
                            }
                            if (iCount == 2)
                            {
                                lvi.SubItems.Add(tmpVarsKeys);
                                iCount = 0;
                            }
                            else
                            {
                                lvi.SubItems.Add(tmpVarsKeys);
                                iCount++;
                            }
                        }
                    }
                    iListView.Items.Add(lvi);
                }
 
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
ВСе работает хорошо, однако если строчка такая, xxx.xxx.xxx.xxx:xxxxx или xxx.xxx.xxx.xxx /admin

Как можно поправить код?

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

Вытаскивание рандомных строчек из файла
Привет! Задача в следующем: есть тхт-файл, в котором есть много строк. Каждая...

Описать класс "поезд", содержащий поля "пункт назначения", "номер поезда", "время отправления"
Помогите пожалуйста с классом Описать класс «поезд», содержащий следующие...

Методом вычислить тип треугольника: "не существует", "тупоугольный", "прямоугольный", "остроугольный"
Помогите пожалуйста С помощью метода вычислить тип треугольника::cry: 1) если...

Проблема при сравнении: "Оператор ">" не может применяться к операндам типа "Т" и "Т""
Добрый день , пишу сортировку , все делаю на основе Т , но вот в чем проблемма...

Построить иерархию классов "Студент", "преподаватель", "персона", "заведующий кафедрой"
Построить иерархию классов: Студент, преподаватель, персона, заведующий...

4
Psilon
Master of Orion
Эксперт .NET
5994 / 4847 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
18.03.2014, 18:18 #2
C#
1
2
3
4
5
6
7
            var regex = new Regex(@"full address:s:(\d+.\d+.\d+.\d+):?(\d+)?\s+(.+)");
            string ex = "full address:s:172.172.16.16:2626 /admin /control";
            Match match = regex.Match(ex);
            foreach (Group g in match.Groups)
            {
                Console.WriteLine(g.Value);
            }
соответственно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            var text = iTBFullPath.Text;
            var searchPattern = "*." + iCBExt.Text;
            var files = Directory.EnumerateFiles(text, searchPattern, SearchOption.TopDirectoryOnly).Select(File.ReadAllText);
            var regex = new Regex(@"full address:s:(\d+.\d+.\d+.\d+):?(\d+)?\s*(.+)?");
 
 
            var results = files.Select(x => regex.Match(x))
                .Where(m => m.Success)
                .Select(x => new
                {
                    Adress = x.Groups[1].Value,
                    Port = x.Groups[2].Value,
                    Keys = x.Groups[3].Value
                });
1
fixNoobi
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 4
02.04.2014, 18:34  [ТС] #3
Спасибо, это помогло, не могу только понять, как еще можно вытащить имя файла?

Цитата Сообщение от Psilon Посмотреть сообщение
C#
1
var files = Directory.EnumerateFiles(text, searchPattern, SearchOption.TopDirectoryOnly).Select(File.ReadAllText)
Здесь идет сразу чтение файла, как можно и здесь же, или по другому
получить имя файла, который читаем?
0
Learx
1045 / 852 / 194
Регистрация: 31.03.2010
Сообщений: 2,486
02.04.2014, 19:05 #4
fixNoobi,
C#
1
2
3
4
5
6
7
8
9
10
11
 
var files = Directory.EnumerateFiles(text, searchPattern, SearchOption.TopDirectoryOnly).Select(s=>new { n = s.FileName, t = File.ReadAllText(s)});
var results = files.Select(x => new {m= regex.Match(x.t), n=x.n)
                .Where(w => w.m.Success)
                .Select(x => new
                {
                    FileName = x.n,
                    Adress = x.Groups[1].Value,
                    Port = x.Groups[2].Value,
                    Keys = x.Groups[3].Value
                });
1
fixNoobi
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 4
03.04.2014, 11:03  [ТС] #5
Спасибо всем, итоговый год такой, если кому пригодится!

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
 private void GetIpPortOnRdpFiles()
        {
            var SearhOnRDPFiles = Directory.EnumerateFiles(iTBFullPath.Text, "*."+iCBExt.Text, SearchOption.TopDirectoryOnly).Select(s=>new
            {
              n = Path.GetFileName(s), 
              t = File.ReadAllText(s)
            });
 
            var regex = new Regex(@"full address:s:(\d+.\d+.\d+.\d+):?(\d+)?\s*(.+)?");
 
            var iResultRDPFiles = SearhOnRDPFiles.Select(x => new { m = regex.Match(x.t), n = x.n })
                .Where(w => w.m.Success)
                .Select(x => new
                {
                    FileName = x.n,
                    Adress = x.m.Groups[1].Value,
                    Port = x.m.Groups[2].Value,
                    Keys = x.m.Groups[3].Value
                });
 
            foreach (var iFactoryFile in iResultRDPFiles)
            {
                try
                {
                    ListViewItem lvi = new ListViewItem(iFactoryFile.FileName);
                    lvi.SubItems.Add(iFactoryFile.Adress);
                    lvi.SubItems.Add(iFactoryFile.Port);
                    lvi.SubItems.Add(iFactoryFile.Keys.Replace("audiomode:i:0",""));
                    iListView.Items.Add(lvi);
                }
                catch
                {
 
                }
                    
            }
        }
0
03.04.2014, 11:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2014, 11:03

Форматирование строки чисел "Запятая под зяпятой"
В строке два числа (координата) X:23,8976 Y:1212,3218 Подобных строк...

Напишите программу, которая подсчитывает, сколько учащихся получило "2", "3", "4" и "5"
Помогите, пожалуйста, с решением следующей задачи: учащиеся сдают экзамены по...

Форматирование строки с числом, используя флаг "C"
Пишу: Console.WriteLine("C Format: {0:C}", 99989.987); ...


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

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

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