c # regex? ¿Cadena de texto del archivo y clasificación en matriz de búsqueda?

Tengo el siguiente texto de un archivo:

{"players":[{"i":11,"p":0,"a":3186,"n":"IanHx","f":1,"ps":0,"pd":0,"bc":0},{"i":12,"p":0,"a":115,"n":"LoZtamnik","f":1,"ps":0,"pd":0,"bc":0},{"i":58,"p":0,"a":156,"n":"Mr701","f":2,"ps":0,"pd":0,"bc":0},{"i":59,"p":0,"a":156,"n":"B0NE4","f":2,"ps":0,"pd":0,"bc":0},{"i":64,"p":0,"a":324,"n":"5teveJ","f":1,"ps":0,"pd":0,"bc":0}],[....... 

Lo que estoy tratando de hacer es analizar el texto, para terminar con una matriz para cada bit de datos entre {…}

para que el resultado final se vea como

 i=11 p=0 a=3186 n=IanHx f=1 ps=0 pd=0 bc=0 

entonces puedo almacenar estos en una base de datos

hasta ahora tengo algo como esto:

 string contents = System.IO.File.ReadAllText("local text file"); //load string contents with text file Regex regex1 = new Regex("\"players\":\\[(?.*)\\]"); //find the players section "players":[.......] Match match1 = regex1.Match(contents); //load match1 Regex regex2 = new Regex("{(?([^}]*))}"); // then break down each player {....} MatchCollection match2 = regex2.Matches(match1.Groups["players"].Value); //load match2 with each player 

¿Entonces me quedo atascado tratando de dividir la cadena de coincidencia [] de alguna manera y mirarlo puede ser demasiado complicado?

Cualquier puntero a una solución más fácil para el análisis de datos.

Gracias

Los datos contenidos en su archivo están en formato JSON . JSON es bastante simple de leer, si está formateado correctamente. Si reformateo tu entrada, la estructura se vuelve más clara:

 { "players": [ { "i": 11, "p": 0, "a": 3186, "n": "IanHx", "f": 1, "ps": 0, "pd": 0, "bc": 0 }, { "i": 12, "p": 0, "a": 115, "n": "LoZtamnik", "f": 1, "ps": 0, "pd": 0, "bc": 0 }, { "i": 58, "p": 0, "a": 156, "n": "Mr701", "f": 2, "ps": 0, "pd": 0, "bc": 0 }, { "i": 59, "p": 0, "a": 156, "n": "B0NE4", "f": 2, "ps": 0, "pd": 0, "bc": 0 }, { "i": 64, "p": 0, "a": 324, "n": "5teveJ", "f": 1, "ps": 0, "pd": 0, "bc": 0 } ] } 

En JSON, cualquier cosa encerrada en [ ] denota una colección y cualquier cosa encerrada en { } denota un objeto. Entonces, puedes ver que tienes una colección llamada players que contiene 5 objetos (ya que hay 5 pares de { } dentro de players [ ] ) con 8 propiedades cada uno. Si piensa en estos términos en C #, tendría una clase llamada Player con esas 8 propiedades y una List para contener cada instancia del Player . Luego, puede tomar los datos JSON y deserializarlos en sus contrapartes de C # para que pueda manipularlos como mejor le parezca, como Dave Bish ha señalado en su respuesta.

Hay una manera muy fácil de crear las clases de C # a partir de sus datos JSON automáticamente:

  • Cree una nueva clase en su proyecto, asígnele el nombre que desee y borre todo su contenido
  • Copie los datos JSON (ya sea de mi ejemplo o el suyo)
  • Vuelva a la clase y haga clic en Edit -> Paste Special -> Paste JSON As Classes

Voila Visual Studio tiene tu espalda. Ahora deberías ver algo en este sentido:

 public class Rootobject { public Player[] players { get; set; } } public class Player { public int i { get; set; } public int p { get; set; } public int a { get; set; } public string n { get; set; } public int f { get; set; } public int ps { get; set; } public int pd { get; set; } public int bc { get; set; } } 

Luego, puede hacer lo que mejor se adapte a su situación, por ejemplo, agregue System.Collections.Generic namespace para que el Player[] una List lugar.

Ahora, para manipular los datos JSON y deserializarlos en la clase C # que acabamos de crear, puede usar la excelente biblioteca Json.NET . Para agregarlo, haga clic derecho en su aplicación desde el explorador de soluciones y haga clic en "Manage NuGet Packages..." . Escribe "Json.NET" en el cuadro de búsqueda e instálalo.

Una vez que tenga eso en su lugar, agregue el espacio de nombres Newtonsoft.Json y Newtonsoft.Json listo. Ahora puede usar el método DeserializeObject() de DeserializeObject() para deserializar los datos JSON en las clases de C # que hemos creado:

 //i've hardcoded the JSON data here, obviously you would extract them from your file var jsonData = @"{""players"":[{""i"":11,""p"":0,""a"":3186,""n"":""IanHx"",""f"":1,""ps"":0,""pd"":0,""bc"":0},{""i"":12,""p"":0,""a"":115,""n"":""LoZtamnik"",""f"":1,""ps"":0,""pd"":0,""bc"":0},{""i"":58,""p"":0,""a"":156,""n"":""Mr701"",""f"":2,""ps"":0,""pd"":0,""bc"":0},{""i"":59,""p"":0,""a"":156,""n"":""B0NE4"",""f"":2,""ps"":0,""pd"":0,""bc"":0},{""i"":64,""p"":0,""a"":324,""n"":""5teveJ"",""f"":1,""ps"":0,""pd"":0,""bc"":0}]}"; //deserialize the JSON into the C# class we created and store it in myPlayerData var myPlayerData = JsonConvert.DeserializeObject(jsonData); //you can now do stuff such as.. foreach(Player player in myPlayerData.players) { MessageBox.Show(string.Format("Player {0} has an i of {1} and an a of {2}", player.n, player.i, player.a)); } 

Es mucho mejor intentar deserializar esto con Json.Net de NuGet

Defina algunas clases para que coincidan con su estructura de archivos:

 public class Root { public List players {get; set;} } public class Something { public string i {get; set;} public string p {get; set;} public string a {get; set;} public string n {get; set;} public string f {get; set;} public string ps {get; set;} public string pd {get; set;} public string bc {get; set;} } 

usa Json.Net para hacer crujido:

 var json = @"{""players"":[{""i"":11,""p"":0,""a"":3186,""n"":""IanHx"",""f"":1,""ps"":0,""pd"":0,""bc"":0},{""i"":12,""p"":0,""a"":115,""n"":""LoZtamnik"",""f"":1,""ps"":0,""pd"":0,""bc"":0},{""i"":58,""p"":0,""a"":156,""n"":""Mr701"",""f"":2,""ps"":0,""pd"":0,""bc"":0},{""i"":59,""p"":0,""a"":156,""n"":""B0NE4"",""f"":2,""ps"":0,""pd"":0,""bc"":0},{""i"":64,""p"":0,""a"":324,""n"":""5teveJ"",""f"":1,""ps"":0,""pd"":0,""bc"":0}]}"; var data = JsonConvert.DeserializeObject(json);