-1
votes

Supprimer un personnage, prenant le numéro après cela, enlever le prochain et ainsi de suite

J'essaie de faire comme suit en C #: J'ai une chaîne avec les données suivantes (il s'agit d'un exemple avec la chaîne la plus longue disponible, il est extrait d'une base de données, la base de données peut renvoyer différents numéros dans la chaîne en fonction de laquelle je choisis le choix): | 1 |, | 2 |, | 3 |, | 4 |, | 5 |, | 6 |, | 7 |, | 10 |, | 11 |, | 11 | , | 13 |, | 14 |, | 15 |, | 16 |, | 17 |, | 18 |, | 19 |, | 20 |, | 23 |, | 23 |, | 24 |, | 25 |, | 26 |, | 27 |, | 28 |, | 29 |, | 30 |, | 31 |, | 32 |, | 33 |, | 36 |, | 37 | , | 38 |, | 39 |, | 40 |, | 41 |, | 42 |, | 43 |, | 44 |, | 47 |, | 49 |, | 49 |, | 49 |, | 50 |, | 51 |, | 52 |, | 53 |

Ce sont des semaines de l'année, je veux supprimer chaque "|" et "," et stocker chaque entier dans un index dans une liste comme suit: xxx

Comment cela peut-il être atteint? J'ai beaucoup lu sur Regex mais je n'ai pas trouvé de moyen de le faire du tout ...


4 commentaires

string.split avec plusieurs séparateurs dans un char [] devrait fournir ce que vous recherchez.


Vous ne devriez vraiment pas stocker des données de cette façon dans une DB. Au lieu d'une colonne avec une liste de valeurs dans un format de chaîne, vous devez disposer d'une relation 1 à de nombreuses relations avec une table contenant les valeurs individuelles.


@juhararr - Je ne suis pas celui qui les stocke de cette façon. Si c'était moi, j'aurais seulement utilisé des entiers et les ai séparés d'une virgule. C'est une DB qui a été faite il y a un moment et pour moi de modifier chaque rangée serait une grosse douleur


@Kzander juste pour être clair que les tuyaux ne sont pas le problème. Il stocke des valeurs entières en tant que chaîne séparée par des virgules. Les DBS sont conçus pour représenter une collection de données dans une table. De plus, si vous avez la capacité de corriger la DB, je vous suggère fortement de le faire. Vous devriez être capable d'écrire du code qui fera les conversions pour vous.


4 Réponses :


2
votes

1) diviser votre chaîne avec une virgule (, code>).

2) Coupez chaque élément dans une chaîne écatée avec espace de caractères ( code>) et tuyau ( | code>) p>

3) Analysez chaque élément sur INT CODE> P>

int[] arr = str.Replace("|", "")
               .Replace(" ", "")
               .Split(',')
               .Select(x => int.Parse(x))
               .ToArray();


4 commentaires

La principale chose que je ne comprends pas vraiment est de savoir où elle comprend qu'il y a 2 entiers après l'autre? Pour ex. 21 .. Est-ce à la sélection (x => int.parse (x))?


Sélectionnez (x => x.trim (nouveau caractère [] {'' '' '' '' '|'})) <= Ceci vous donnera la liste des chaînes au lieu de gros entier comme vous le pensez 123456789101112 ....


Et après la liste ci-dessus, nous analysons simplement chaque article dans des entiers, l'ai eu?


Voir Alternative section en réponse pour une meilleure compréhension.



1
votes

Cela fonctionnera pour vous:

        string str = "|1|,|2|,|3|,|4|,|5|,|6|,|7|,|8|,|9|,|10|,|11|,|12|,|13|,|14|,|15|,|16|,|17|,|18|,|19|,|20|,|21|,|22|,|23|,|24|,|25|,|26|,|27|,|28|,|29|,|30|,|31|,|32|,|33|,|34|,|35|,|36|,|37|,|38|,|39|,|40|,|41|,|42|,|43|,|44|,|45|,|46|,|47|,|48|,|49|,|50|,|51|,|52|,|53|";
        str = str.Replace("|", "");

        string[] subStrings = str.Split(',');
        int[] ints = new int[subStrings.Length];
        for (int i = 0; i < subStrings.Length; i++)
        {
            ints[i] = Convert.ToInt32(subStrings[i]);
        } 


1 commentaires

heureux d'avoir pu aider! :)



1
votes

Je suis venu avec l'approche de regex que vous avez demandée. Vous devez d'abord trouver tous les chiffres à l'aide de la motion Regex \ d + forte>, ce modèle correspond à un ou plusieurs numéros. Utilisez RegexStorm Testé pour tester votre regex. Boucle à travers les allumettes et assigner à votre tableau.

Voici un échantillon que j'ai proposé avec C # Interactive: P>

string input = "| 1 |,| 2 |,| 3 |,| 4 |,| 5 |,| 6 |,| 7 |,| 8 |,| 9 |,| 10 |,| 11 |,| 12 |,| 13 |,| 14 |,| 15 |,| 16 |,| 17 |,| 18 |,| 19 |,| 20 |,| 21 |,| 22 |,| 23 |,| 24 |,| 25 |,| 26 |,| 27 |,| 28 |,| 29 |,| 30 |,| 31 |,| 32 |,| 33 |,| 34 |,| 35 |,| 36 |,| 37 |,| 38 |,| 39 |,| 40 |,| 41 |,| 42 |,| 43 |,| 44 |,| 45 |,| 46 |,| 47 |,| 48 |,| 49 |,| 50 |,| 51 |,| 52 |,| 53 |";
MatchCollection matches = Regex.Matches(input, @"\d+");
int[] values = new int[matches.Count];
for (int i = 0; i < matches.Count; i++)
    values[i] = Convert.ToInt32(matches[i].Value);


0 commentaires

0
votes
private void button1_Click(obj sender,EventArgs e)
{
String str = "|1|,|2|,|3|,|4|...";
char[] ch =str.ToArray(),weekList=new char[ch.Length];
Int index=1;
for (int i=1;i < ch.Length ;i++)
{
if(index < ch.length-1)
{
weekList[i] = ch[index];
Index += 4;
}
}
MessageBox.Show(weekList[0]);//1
MessageBox.Show(weekList[9]);//10
}

0 commentaires