2012-07-21 1 views
0

현재 RCon에 문제가 있습니다.
기본적으로 모든 플레이어의 목록을 수신하라는 요청을 보내고 있습니다. 이 같은 모든 플레이어의 목록
서버 응답 :C# RCon - 임의의 공간을 대체 하시겠습니까?

#  IP:Port  Ping ID   Name 
0  127.0.0.1 0  3523523  Bob 
12 192.168.0.1 120  342525523 Anna 
320 192.168.0.2 240  63463634634 Chuck Norris 
    ^^^   ^^ ^^^^^   ^

문제는, 내가 다른 태그 사이에 얼마나 많은 공간을 몰라, 그것은에 따라 방법 #/IP/핑 길이 ID가 있습니다.
공백은 1 공백과 5 공백이 다를 수 있습니다.
이름에 공백이있을 수 있으므로 한 칸으로 나눌 수 없습니다.

목록에서 IP, ping, id 및 name을 읽고 싶습니다.
저는 현재 지저분한 부분을 & 스플릿으로 대체하려고합니다.하지만 공백이 다를 경우 제대로 작동하지 않습니다.
정규식으로 뭔가를하는 것에 대해 생각했지만 정규식으로는별로 좋지 않습니다.
나는 이미 줄을 하나의 줄로 잘라 냈다. 플레이어는 모든 정보

여기

를 저장할 수
클래스는 어떤 일이 일어날해야한다 :

 // List to store all the players 
     List<Player> players = new List<Player>(); 
     // Using a StringReader to split up every line 
     StringReader reader = new StringReader(result); 

     string line; 
     int row = 0; 
     // Processing every line one after another 
     while ((line = reader.ReadLine()) != null) 
     { 
      row++; 
      // Doing some filtering to prevent empty lines and other stuff 
      if (row > 3 && !line.StartsWith("(") && line.Length > 0) 
      { 
       // Getting all the stuff I need here 
       // Then adding a player object to save the informations, ignore status 
       players.Add(new Player(ip, ping, id, name, status)); 
      } 
     } 

누구든지이 문제를 해결할 수있는 아이디어를 가지고?

답변

1

가장 간단한 방법은 line 5에 부품

var items = line.Split(new char[] {' '}, 5, StringSplitOptions.RemoveEmptyEntries); 
players.Add(new Player(items[1], items[2], items[3], items[4], "status?")); 
+0

이제는 정말 간단한 해결책입니다. 감사합니다. :) – user1137183

4

목록에서 IP, ping, id 및 name을 읽고 싶습니다.

매우 드물지만 이렇게 말하면 정규식 작업과 같아 보입니다. 지금 당장 실력이 좋지 않다면 이것을 배울 수있는 기회로 사용하십시오.

정규 표현식을 사용하면 모든 것을 일치시키고 그룹의 각 값을 캡처 한 다음 나중에 그룹을 가져올 수 있습니다.

샘플 코드 :

using System; 
using System.IO; 
using System.Linq; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     var regex = new Regex(@"^(?:\d+)\s+(?<ip>[\d.]+)\s+(?<ping>\d+)\s+(?<id>\d+)\s+(?<name>.*)$"); 
     var query = File.ReadLines("data.txt") 
         .Skip(1) 
         .Select(line => regex.Match(line)) 
         .Select(match => new { 
            IP = match.Groups["ip"].Value, 
            Ping = match.Groups["ping"].Value, 
            Id = match.Groups["id"].Value, 
            Name = match.Groups["name"].Value 
           }); 

     foreach (var entry in query) 
     { 
      Console.WriteLine(entry); 
     } 
    } 
} 

샘플 출력 :

{ IP = 127.0.0.1, Ping = 0, Id = 3523523, Name = Bob } 
{ IP = 192.168.0.1, Ping = 120, Id = 342525523, Name = Anna } 
{ IP = 192.168.0.2, Ping = 240, Id = 63463634634, Name = Chuck Norris } 

은 분명히 당신이 핑에 대한 텍스트를 구문 분석 할 수, IP 주소 등이 당신이 시작하는 데 불과했다.

+1

그것은 정규식 시간을 분할하는 것 (또한, 당신은 아마 ... 경기의 성공을 확인해야합니다)! 전혀. – starskythehutch

+0

Altough L.B의 솔루션은 내가 원하는 것에 대해 훨씬 나아졌습니다. 그것이 어떻게 작동하는지 알아낼 시간이 있다면 나는 그것을 자세히 살펴볼 것입니다. – user1137183

+0

@ user1137183 : 개인적으로 나는 개인적으로 이것을 위해 정규 표현식 접근법을 선호합니다. 일치 성공 여부를 확인한다고 가정하면 더 많은 자유 검증을 수행합니다. 그냥 개인적인 취향. –

관련 문제