2015-06-05 4 views
3

Я пытаюсь понять, как разбить некоторый вывод cmd на несколько строк, которые я могу использовать позже, чтобы установить метки.C# Разбиение строк строки на несколько строк

Код, я использую это:

ProcessStartInfo diskdrive = new ProcessStartInfo("wmic", " diskdrive get index, model, interfacetype, size"); 
diskdrive.UseShellExecute = false; 
diskdrive.RedirectStandardOutput = true; 
diskdrive.CreateNoWindow = true; 
var proc = Process.Start(diskdrive); 

string s = proc.StandardOutput.ReadToEnd(); 

Это дает выход так:

Index InterfaceType Model     Size   
2  IDE   WesternDigital 1000202273280 
1  IDE   Seagate    500105249280 
0  IDE   SAMSUNG SSD 830 Series 128034708480 

Можно ли поставить это в список или массив, так что я могу получить для например размер диска 2 или межфазный тип диска 0. Я могу сделать некоторые основные вещи на C#, но это над моей головой: I

+0

Di вы пытаетесь с [ 'String.Split'] (https: // msdn.microsoft.com/en-us/library/system.string.split(v=vs.110).aspx)? Или ['Regex'] (https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex (v = vs.110) .aspx)? – Kryptos

+0

'String.Split' будет проблематичным, если в некоторых ячейках есть пробелы (как в« SAMSUNG SSD 830 Series ». – adv12

+0

Сплит-строка не будет делать это здесь, из-за пробелов, которые я не знаю, как справиться с этим. – Zenkaipu

ответ

1

Вот пример работы. «result» будет содержать список с необходимыми вами частями. Это первый проход и я уверен, что может быть переработана несколько:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace columnmatch 
{ 
    internal class Program 
    { 

     private const string Ex1 = "2  IDE   WesternDigital 1000202273280"; 
     private const string Ex2 = "1  IDE   Seagate    500105249280 "; 
     private const string Ex3 = "0  IDE   SAMSUNG SSD 830 Series 128034708480"; 

     private static void Main(string[] args) 
     { 
      var result = new List<MyModel>(); 
      result.Add(ParseItem(Ex1)); 
      result.Add(ParseItem(Ex2)); 
      result.Add(ParseItem(Ex3)); 
     } 

     private static MyModel ParseItem(string example) 
     { 
      var columnSplit = example.Split((char[]) null, StringSplitOptions.RemoveEmptyEntries); 

      int index = -1; 
      string interfaceType = string.Empty; 
      long size = -1; 
      string model = string.Empty; 

      if (columnSplit.Count() == 4) 
      { 
       //direct match (no spaces in input) 
       index = Convert.ToInt32(columnSplit[0]); 
       interfaceType = columnSplit[1]; 
       model = columnSplit[2]; 
       size = Convert.ToInt64(columnSplit[3]); 
      } 
      else 
      { 
       string modelDescription = string.Empty; 

       for (int i = 0; i < columnSplit.Count(); i++) 
       { 
        if (i == 0) 
        { 
         index = Convert.ToInt32(columnSplit[i]); 
        } 
        else if (i == 1) 
        { 
         interfaceType = columnSplit[i]; 
        } 
        else if (i == columnSplit.Count() - 1) //last 
        { 
         size = Convert.ToInt64(columnSplit[i]); 
        } 
        else 
        { 
         //build the model 
         modelDescription += columnSplit[i] + ' '; 
        } 
       } 

       model = modelDescription.TrimEnd(); 
      } 

      var myItem = BuildResultItem(index, interfaceType, model, size); 
      return myItem; 
     } 

     private static MyModel BuildResultItem(int index, string interfaceType, string model, long size) 
     { 
      var myItem = new MyModel 
      { 
       Index = index, 
       InterfaceType = interfaceType, 
       Model = model, 
       Size = size 
      }; 

      return myItem; 
     } 

     private class MyModel 
     { 
      public int Index { get; set; } 
      public string InterfaceType { get; set; } 
      public string Model { get; set; } 
      public long Size { get; set; } 
     } 
    } 
} 

Этот ответ следует факты из моего комментария: всегда будет 4 колонки, то первый и последний столбец всегда будет числовым, и строит оттуда.

0

Кажется, что выполняемая вами команда обеспечивает двойное пространство между каждым столбцом. Тогда дело в том, что нужно разбить строку на двойные строки.

Таким образом, учитывая вашу строку s тогда это работает для меня:

var map = 
    s 
     .Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
     .Skip(1) 
     .Select(x => x.Split(new [] { " " }, StringSplitOptions.RemoveEmptyEntries)) 
     .Select(x => x.Select(y => y.Trim()).ToArray()) 
     .ToDictionary(
      x => int.Parse(x[0]), 
      x => new 
      { 
       InterfaceType = x[1], 
       Model = x[2], 
       Size = ulong.Parse(x[3]), 
      }); 

Я тогда можно сделать:

string it = map[0].InterfaceType; 
ulong size = map[2].Size; 
Смежные вопросы