System.ArgumentOutOfRangeException [Résolu]

Vydc - 29 sept. 2017 à 08:27 - Dernière réponse : Whismeril 10727 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 8 janvier 2018 Dernière intervention
- 29 sept. 2017 à 23:02
Bonjour !
Je cherche à, dans un fichier texte tenant lieu de base de données et possédant à chaque ligne 26 caractères, en cherchant une chaîne de caractère en particulier, récupérer les 26 caractères qui la composent dans une variable string.
Pour cela, mon code est :
int i = strDuFichierTexte.IndexOf(strCherché);
string strARecuperer = strDuFichierTexte.Substring(i, i + 26);

Malheureusement, à chaque exécution - mis à part lorsque je recherche les 26 premiers caractères du fichier (ceux de la première ligne, donc), ce que je n'explique pas - même si la compilation se fait sans encombre, j'obtiens l'erreur suivante :

System.ArgumentOutOfRangeException : 'L'index et la longueur doivent faire référence à un emplacement situé dans la chaîne.
Nom du paramètre : length'


Un peu d'aide serait la bienvenue ! :)
Merci d'avance !
Afficher la suite 

7 réponses

Répondre au sujet
Reivax962 3112 Messages postés jeudi 16 juin 2005Date d'inscription 4 janvier 2018 Dernière intervention - 29 sept. 2017 à 09:45
0
Utile
1
Bonjour,

Le problème vient du fait que strDuFichierTexte a moins de i+26 caractères.

Es-tu sûr que cette chaîne contienne bien tout ton fichier, et pas uniquement la première ligne ?
Dans tous les cas il faudra vérifier que strDuFichier.Length > i + 26 avant de faire ton Substring

Tu devrais passer dessus en mode debug pour t'assurer que tu as bien la valeur attendue dans ta chaîne.

Xavier
J'avais déjà vérifié et c'était bien supérieur à i + 26.
Merci quand même ! :D
Commenter la réponse de Reivax962
Whismeril 10727 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 8 janvier 2018 Dernière intervention - 29 sept. 2017 à 13:56
0
Utile
1
Bonjour

Pour ce genre de recherche, la regex peut être une bonne solution.
Pour t’en proposer une il faudrait que tu montres une ligne exemple et un mot recherché exemple (avec des donnée non confidentielles).

Par contre, il est très très très déconseillé d’utiliser des noms avec des accents dans le code.
Merci pour ta réponse !
Voici un exemple de plusieurs lignes avec des données fictives :

LXrvsAragbdKwkDM S5ekL 023
xSY3UBdWLuGamD6j 215Zs 100
wm33mGkDSyDFERve 585E5 005

le mot recherché serait donc "wm33mGkDSyDFERve", dans le but d'ensuite récupérer la ligne "wm33mGkDSyDFERve 585E5 005" dans une variable string et de la spliter en un tableau de trois valeurs :

int i = strDuFichierTexte.IndexOf("wm33mGkDSyDFERve"); /*on associe à l'entier i le numéro d'index de la première lettre de "wm33mGkDSyDFERve" dans la chaîne de caractère "strDuFichierTexte" */
string strARecuperer = strDuFichierTexte.Substring(i, i + 26); /*on récupère la ligne de "wm33mGkDSyDFERve" pour que strARecuperer contienne "wm33mGkDSyDFERve 585E5 005" - chaîne de caractères qui contient bien 26 caractères au passage.*/
string[] tab = strARecuperer.Split(' '); /*tab[0] = "wm33mGkDSyDFERve", tab[1] = "585E5" et tab[2] = "005"*/
Commenter la réponse de Whismeril
Whismeril 10727 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 8 janvier 2018 Dernière intervention - 29 sept. 2017 à 17:29
0
Utile
1
Regarde là
http://regexstorm.net/tester?p=%28%3f%3a%5e%7c%5cn%29%28%3f%3ctexteATrouver%3ewm33mGkDSyDFERve%29+%28%3f%3ccode%3e%5cw%7b5%7d%29+%28%3f%3cnumero%3e%5cd%7b3%7d%29&i=wm33mGkDSyDFERve+585E5+005+%0d%0aLXrvsAragbdKwkDM+S5ekL+023+%0d%0axSY3UBdWLuGamD6j+215Zs+100+%0d%0awm33mGkDSyDFERve+585E5+005+%0d%0aLXrvsAragbdKwkDM+S5ekL+023+%0d%0aLXrvsAragbdKwkDM+S5ekL+023+%0d%0awm33mGkDSyDFERve+585E5+005+


Clique sur l'onglet, tu verras que les groupes contiennent ce que tu cherches.
Merci beaucoup, quel code dois-je saisir du coup ?
Commenter la réponse de Whismeril
Whismeril 10727 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 8 janvier 2018 Dernière intervention - 29 sept. 2017 à 23:02
0
Utile
Un truc comme ça
        private void TestVydc()
        {
            string texteComplet = @"wm33mGkDSyDFERve 585E6 006 
LXrvsAragbdKwkDM S5ekL 023 
xSY3UBdWLuGamD6j 215Zs 100 
wm33mGkDSyDFERve 585E5 005 
LXrvsAragbdKwkDM S5ekL 023 
LXrvsAragbdKwkDM S5ekL 023 
wm33mGkDSyDFERve 585E4 004 ";
            string aTrouver = "wm33mGkDSyDFERve";

            string pattern = @"(?:^|\n)(?<texteATrouver>" + aTrouver + @") (?<code>\w{5}) (?<numero>\d{3})";
            
            Regex maRegex = new Regex(pattern);

            List<ResVydc> resultats = new List<ResVydc>();
            foreach(Match m in maRegex.Matches(texteComplet))
            {
                resultats.Add(new ResVydc
                    {
                        Reference = m.Groups["texteATrouver"].Value,
                        Code = m.Groups["code"].Value,
                        Numero = Convert.ToInt32(m.Groups["numero"].Value),
                    });
            }
        }

Commenter la réponse de Whismeril