Tshumore Ответов: 3

Как я могу перебирать все строки в многострочной строке


У меня есть программа, которая считывает это с сервера. Возвращаемые данные состоят из многострочной строки. Мое требование состоит в том, чтобы привести содержащие подстроки (для всех строк) к модели, а затем сохранить в таблице базы данных.

Это образец моих данных :
Filesystem           1024-blocks        Used   Available Capacity  Mounted on
rpool/ROOT/solaris-0    47185886    39055271     6723316    86%    /
rpool/ROOT/solaris-0/var    47185886      334036     6723316     5%    /var
/dev                           0           0           0     0%    /dev
/u01                   104857600    92783432    12074167    89%    /u01
proc                           0           0           0     0%    /proc
ctfs                           0           0           0     0%    /system/contract


И для каждой строки Я хочу привести все содержащие подстроки к свойствам модели. Модель (Weblogic.cs) выглядит следующим образом :
public String Filesystem { get; set; }

       public string Blocks { get; set; }

       public string Used { get; set; }

       public string Available { get; set; }

       public string Capacity { get; set; }

       public string Mount { get; set; }


На данный момент я сделал все свойства модели строками и сделаю преобразование при сохранении данных.

Моя проблема заключается в том, что моя логика возвращает данные только из первой строки, то есть когда я прохожу через код. серверы свойство имеет кол-во 1:

<pre> using (SshClient ssh = new SshClient("+ server +",
                "+username+", "+password+"))
                {
                    ssh.Connect();
                    var result = ssh.RunCommand("df -k");
                    var rss = result.Result;
                    string[] lines = rss.Split('\n');
                    lines = lines.Skip(1).ToArray();
                    Int32 count = 6;
                    String[] separator = { " " };

                    var servers = new List<Weblogic>();


                    List<string> infos = new List<string>();
                    for (int i = 0; i < lines.Length; i++)
                    {
                        String[] strlist = lines[i].Split(separator, count,
                        StringSplitOptions.RemoveEmptyEntries);

                      
                            foreach (var value in strlist)
                            {

                                Weblogic ci = new Weblogic();

                                ci.Filesystem = strlist[0];
                                ci.Blocks = strlist[1];
                                ci.Used = strlist[2];
                                ci.Available = strlist[3];
                                ci.Capacity = strlist[4];
                                ci.Mount = strlist[5];

                                servers.Add(ci);
                               }
					    					   
							   
				}
							   
		  }


Что я уже пробовал:

Когда я пытаюсь использовать этот подход, я могу захватить все подстроки из всех строк :
<pre>  using (SshClient ssh = new SshClient("+server+",
                "+username+", "+password+"))
                {
                    ssh.Connect();
                    var result = ssh.RunCommand("df -k");
                    var rss = result.Result;
                    string[] lines = rss.Split('\n');
                    lines = lines.Skip(1).ToArray();
                    Int32 countt = 6;
                    String[] separator = { " " };

                    var servers = new List<Weblogic>();
                 
                    for (int i = 0; i < lines.Length; i++)
                    {
                        String[] strlist = lines[i].Split(separator, countt,
                        StringSplitOptions.RemoveEmptyEntries);

                        for (int j = 0; j < strlist.Length; j++)
                        {
						 string s = strlist[j];
                            Console.WriteLine(s);
                            Console.ReadKey();
                                                     
                        }

                    }
		}

TheRealSteveJudge

Как выглядит объект "линии" при отладке?
Это массив? Если да, то сколько записей в нем есть?

Tshumore

Его массив содержит 24 элемента, что в действительности является целым набором данных. Однако проблема заключается в том, что я читаю и добавляю их в объект servers. Я получаю только 1

TheRealSteveJudge

ОК. Пожалуйста, взгляните на решения 2 и 3...

Tshumore

Я внес поправки в Кодекс, как и в решениях. Проблема заключается в String[] strlist . strlist возвращает только 6 подстрок - на самом деле только 6 подстрок для первой строки. Он не повторяется для каждой возвращенной строки. Если только я не упускаю что-то очень очевидное, я думаю, что именно здесь поток терпит неудачу

3 Ответов

Рейтинг:
21

OriginalGriff

Мы не можем получить точный доступ к данным, с которыми вы работаете - хорошо, вы показали образец, но мы не можем сказать, что он содержит: например, пробелы и табуляции выглядят одинаково, строки могут иметь несколько символов Терминатора, а не только "\n", и так далее.

И данные являются фундаментальными для этой проблемы.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
18

Richard MacCutchan

Ваша внутренняя петля не правильна и не нужна, попробуйте это:

// this line is not needed either : List<string> infos = new List<string>();
for (int i = 0; i < lines.Length; i++) // repeat for each returned line
{
    // split the line into 6 fields
    String[] strlist = lines[i].Split(separator, count,
    StringSplitOptions.RemoveEmptyEntries);
    
    // create a new Weblogic objuect 
    Weblogic ci = new Weblogic();
    
    // add the detail fields
    ci.Filesystem = strlist[0];
    ci.Blocks = strlist[1];
    ci.Used = strlist[2];
    ci.Available = strlist[3];
    ci.Capacity = strlist[4];
    ci.Mount = strlist[5];
    
    // add this object to the servers list
    servers.Add(ci);
}


Tshumore

Проблема заключается в String[] strlist . strlist возвращает только 6 подстрок - фактически 6 подстрок только для первой строки. Он не повторяется для каждой возвращенной строки.

Richard MacCutchan

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

Рейтинг:
10

TheRealSteveJudge

Взгляните на это

foreach (var value in strlist)
Вы никогда не используете переменную "value".

Вы должны заменить
foreach (var value in strlist)
{
	Weblogic ci = new Weblogic();

	ci.Filesystem = strlist[0];
	ci.Blocks = strlist[1];
	ci.Used = strlist[2];
	ci.Available = strlist[3];
	ci.Capacity = strlist[4];
	ci.Mount = strlist[5];

	servers.Add(ci);
}
около
Weblogic ci = new Weblogic();

ci.Filesystem = strlist[0];
ci.Blocks = strlist[1];
ci.Used = strlist[2];
ci.Available = strlist[3];
ci.Capacity = strlist[4];
ci.Mount = strlist[5];

servers.Add(ci);