2016-10-16 6 views
1

EDIT:私はこの質問をよりよく表現する必要があります。それを削除する代わりに、他の人が学ぶためにここに残しておきます。複数の区切り文字を使用して文字列を分割する方法

これはしばらくの間作業していましたが、私はまだこれに答える別の投稿を見つける必要があります。

私は、分割しようとしているリストは、次のようになります。

0. Yersinia Pestis, 76561198010013870 
1. CatharsisLtd., 76561198056110126 
2. Nut~Taco, 76561198072105032 

それはプレイヤーの名前とID番号の一覧です。私はxを削除しようとしています。私はこのようになりますリストが残っています、そのように、各ラインの開始、および,直前にID番号から:

Yersinia Pestis 
76561198010013870 
CatharsisLtd. 
76561198056110126 
Nut~Taco 
76561198072105032 

は、私はこのような何かを使用して解決策を見つけたと思った:

string [] split = strings .Split(new Char [] {',' , '\n' }); 

しかし、プレイヤーは「、」のようなものを持つことができます。その名前に他の記号が付いています。私は

string splitter = i.ToString()+". "; 
and then something like ", any17DigitNumber" 

任意の助けをいただければ幸いような何かを行う方法があると確信している、私は完全にすべてのシナリオのためにこの仕事をするためにどのように困惑しています。唯一の定数はIDの索引付けと長さです。

+0

データの元の形式を管理していますか?もしそうなら、あなたはそれを後で簡単に解析できるように変更する方が良いでしょう。 –

+0

残念ながら私はそうではありません。これはサーバーからの応答が来る形式です。私はそれを変更する方法がありません:( – thermite

+0

ユーザーは名前に印刷可能な文字を許可されていますか? –

答えて

1

はあなたのリストは、常にあなたの例で提供されるもののような3つの列に分かれている場合:

0. Yersinia Pestis, 76561198010013870 
1. CatharsisLtd., 76561198056110126 
2. Nut~Taco, 76561198072105032 

そして、あなたがそれらを分割し、最後の2つの列を取得したい、あなたは最初に文字列を分割しない理由<Space>、次に:

  1. shift()で最初の列を省略します。あなたは基本的に戻って、カンマで<space>と削除最後の文字、と列のID番号
  2. 参加()休みですHow to shift the start of an array in C#?
  3. ポップ()最後の列、を見てすることができます。

この方法で、あなたが望むものが残されます。

+0

スペースで区切ると、スペースを含む最初のもののようなユーザ名で問題を引き起こさないでしょうか? – thermite

+0

これは、上記のステップで3番目のステップがある理由です。 –

+0

その初期文字列を配列に変換する方法を研究しています。 リスト list = newリスト(Regex.Split(input、Environment.NewLine)); – thermite

2

たぶんの線に沿って何か:

public class Player 
{ 
    public int Index { get; set; } 
    public long Id { get; set; } 
    public string Name { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Player(Index={0}, Id={1}, Name={2})", Index, Id, Name); 
    } 
} 

public static Player ParsePlayer(string line) 
{ 
    var dot = line.IndexOf("."); 
    var comma = line.LastIndexOf(","); 
    return 
     new Player 
     { 
      Index = int.Parse(line.Substring(0, dot).Trim()), 
      Id = long.Parse(line.Substring(comma + 1).Trim()), 
      Name = line.Substring(dot + 1, comma - (dot + 1)).Trim() 
     }; 
} 

public static void Main() 
{ 
    var data = new[] { 
     "0. Yersinia Pestis, 76561198010013870", 
     "1. CatharsisLtd., 76561198056110126", 
     "2. Nut~Taco, 76561198072105032", 
     "3. Smith, John, 76561198072105033", 
     " 4.Allen, Paul,76561198072105034 " 
    }; 

    var players = new List<Player>(); 

    // parse 
    foreach (var line in data) 
    { 
     players.Add(ParsePlayer(line)); 
    } 

    // check 
    foreach (var player in players) 
    { 
     Console.WriteLine(player); 
    } 
} 

テスト可能here

レディコメントで示唆したように、代わりに、あなたはまた、名前のキャプチャグループと、正規表現を試すことができます。

public static Player ParsePlayer(string line) 
{ 
    var regex = new Regex(@"\s*(?<index>[0-9]+)\s*\.\s*(?<name>.+)\s*,\s*(?<id>[0-9]+)\s*"); 
    var match = regex.Match(line); 
    return 
     new Player 
     { 
      Index = int.Parse(match.Groups["index"].Value), 
      Id = long.Parse(match.Groups["id"].Value), 
      Name = match.Groups["name"].Value 
     }; 
} 

テスト可能here

'これは役立ちます。

+0

最高の選択肢。早速のご返事ありがとうございます。ちなみに、dotnetfiddleについてはまったく知らなかった、それは素晴らしいことです:D 私は一度このソリューションにタグを付けて動作させます。 – thermite

+0

@thermite最高です、わかりません。うまくいけば、始めるには、簡単で簡単な理由があります。 – YSharp

0
string data = "..."; 
var matches = new Regex("...(.+?),\\s([0-9]+)?").Matches(data); 
for (int i = 0; i < matches.Count; i++) { 
    Console.WriteLine(matches[i].Groups[1].Value); 
    Console.WriteLine(matches[i].Groups[2].Value); 
} 

https://dotnetfiddle.net/GixJ4y

1

私は、このアプローチが好き:

var source = @"0. Yersinia Pestis, 76561198010013870 
1. CatharsisLtd., 76561198056110126 
2. Nut~Taco, 76561198072105032"; 

var results = 
    source 
     .Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
     .Select(x => x.Substring(x.IndexOf('.') + 2)) 
     .SelectMany(x => new [] 
     { 
      x.Substring(0, x.LastIndexOf(',')), 
      x.Substring(x.LastIndexOf(',') + 2) 
     }); 

それは私を与える:

results

またあなたはこれで.SelectManyを置き換えることができます:

 .Select(x => new 
     { 
      Name = x.Substring(0, x.LastIndexOf(',')), 
      Id = x.Substring(x.LastIndexOf(',') + 2) 
     }); 

...そしてあなたが得る:解決策を掲載人々に

results

0

感謝を。サーバーレスポンスのためにどちらも使用できませんでしたが、どちらも正しい方向に向かっています。コマンドを送信した人のIDを取得する必要があったのです。 `//両方のサーバからすべてのオンラインプレーヤーを取得します。 string centerPlayers = await messenger.ExecuteCommandAsync(" ListPlayers "); string scorchedPlayers = messengerB.ExecuteCommandAsync( "ListPlayers");待機します。

   //use players discord ID number to locate them in playerData, then find users in game name from there 
       bool foundPlayer = false; 
       for (int i = 0; i < playerData.Count/10 - 1; i++) 
       { 
        if(playerData[i*10+9] == discordID) 
        { 
         Console.WriteLine("Player found in playerData"); 
         if (centerPlayers.Contains(playerData[i * 10])) 
         { 
          Console.WriteLine("Player found online on center"); 
          foundPlayer = true; 
          //break off user's steam ID from centerPlayers 
          string name = playerData[i * 10]+ ", "; 
          string[] temp = Regex.Split(centerPlayers, name); 
          string tempb = temp[1]; 
          string[] tempc = tempb.Split(' '); 
          Console.WriteLine("Steam ID:" + tempc[0]); 
          //can give gold here, then break 
         } 
         else if (scorchedPlayers.Contains(playerData[i * 10])) 
         { 
          foundPlayer = true; 
          Console.WriteLine("Player found online on scorched"); 
          //break off user's steam ID from centerPlayers 
          //can give gold here, then break 
         } 
         else 
         { 
          foundPlayer = true; 
          Console.WriteLine("Player is not online"); 
          break; 
         } 
        } 

ロングストーリーは、これはRCON経由でゲームサーバーを管理する不協和音です。すべてのプレーヤーデータが配列に格納されます。プレイヤーはゲームのキャラクターを不一致IDにリンクすることができます。これにより、ボットが追跡したプレイ時間を介してポイントを得ることができます。このメソッドは私がplayerData []を通して検索することを可能にし、不一致IDがあるかどうかを確認します。そうであれば、いくつかの場所をたどり、プレイヤーのゲーム名を取得できます。私はその名前を取得した後、オンラインプレーヤーのリストを検索することができます。私は+ "、"という名前でリストを分割し、次のスペースに再び分割します。これは私にリストから適切なIDを与えます。今私はプレーヤーがオンラインであり、登録されていることを知っている。今プレイヤーは不協和音でポイントを取引することができ、ボットはRCONを適切なサーバー(これは2つの異なるサーバーを監視します)で使用してプレーヤーに金を渡すことができます。

もう一度お返事ありがとうございます。

関連する問題