1
votes

Rechercher une chaîne ou un tableau de chaînes dans un fichier, les séparer en Java

J'ai un fichier txt qui comprend:

Scanner scanner = new Scanner(fileName);
while (scanner.hasNextLine()) {
    String fileline = scanner.nextLine();
    String myStringsKey = "myStrings =";
    if(fileline.startsWith(myStringsKey)) { 

    }
}

Je voudrais lire le fichier pour trouver la chaîne "myStrings" puis avoir une boucle pour vérifier si l'une des valeurs myStrings [str1 , str2, str3] correspondent à une variable.

Actuellement, je trouve les myStrings comme ceci:

Hello Word
myStrings = [str1, str2, str3]
Goodbye Word

Comment puis-je obtenir str2 par exemple pour vérifier avec une var définie? Je suppose que je devrais utiliser "split".


0 commentaires

5 Réponses :


0
votes

Vous devez analyser le contenu de la ligne: vous devez d'abord déchirer les crochets, puis diviser la chaîne par des virgules et ajouter chaque élément à un Set , ce qui contiennent les différentes valeurs.

Ensuite, vérifier si cet ensemble contient la valeur souhaitée est immédiat.


0 commentaires

1
votes

Vous pouvez utiliser une expression régulière et l'inclure dans le bloc if:

if (fileline.startsWith(myStringsKey)) {
    // regex to extract text within brackets
    Pattern p = Pattern.compile("(?<=\\[).+?(?=\\])");  
    Matcher m = p.matcher(fileline);

    while (m.find()) {
        System.out.println(m.group().split(",")[1]); // str2
    }
} 


5 commentaires

mais j'ai besoin de vérifier si un var défini est égal à str1 ou str2 avons-nous un moyen de définir dynamiquement au lieu de sayin [1]?


Qu'est-ce que cela reviendra? Avec quelle chaîne il va comparer? Disons que c'est une chaîne "myStrings = [[st [r1, str2, str3]" et je veux str3 comme sortie


Je voulais dire par exemple que j'ai défini static var myStatic = "str3" et j'ai renvoyé str1, str2, str3 entre [-] ces caractères à votre guise. Comparaison mal faite entre myStatic et les 3 autres chaînes. si je donne [1] comme u n'a pas mal obtenu seulement str2 mais je veux trouver str3 ou str1 selon celui défini. - et dans mon projet var défini sera dynamique par exemple.


Vous pouvez parcourir le tableau plutôt que d'accéder directement à l'index, puis vérifier - est-ce ce dont vous avez besoin?


@Mak: Une fois la ligne divisée, vous pouvez la parcourir en boucle et vérifier. Est-ce votre vote défavorable?



0
votes

De manière très simple,

 Scanner scanner = new Scanner(fileName);
    while (scanner.hasNextLine()) {
        String fileline = scanner.nextLine();
        String myStringsKey = "myStrings =";
        if(fileline.startsWith(myStringsKey)) { 
            String[] temp = fileline.replaceAll("myStrings =","").replaceAll("\\[", "").replaceAll("\\]", "").trim().split(",");
                for (int i = 0; i < temp.length; i++) {
                    if(temp[i].trim().equalsIgnoreCase("str2")){
                        System.out.println("Str2 matched");
                    }
                }
        }
    }


2 commentaires

Cela échouerait si les chaînes incluent un crochet car il remplacera également les crochets dans chaque chaîne. Par exemple: ["ab [b", "zx [ccc"]


Il y a plusieurs façons de les empêcher de remplacer comme fileline.replaceFirst ("\ [", "") ou sous-chaîne excluant le premier et le dernier caractère, je lui montre juste la façon de faire.



1
votes

Pour analyser votre chaîne, vous pouvez utiliser la méthode simple suivante:

Scanner scanner = new Scanner(fileName);
while (scanner.hasNextLine()) {
    String fileline = scanner.nextLine();
    String myStringsKey = "myStrings =";
    if(fileline.startsWith(myStringsKey)) {

        String[] values = parseMyStrings(fileline);
        System.out.println(Arrays.toString(values));

    }
}

Ensuite, votre code final peut ressembler à ceci:

public String[] parseMyStrings(String s) {
    int beginIndex = s.indexOf("[") + 1;
    int endIndex = s.indexOf("]");

    s = s.substring(beginIndex, endIndex);

    // split and trim in one shot
    return s.split(("\\s*,\\s*"));
}

Je pense que votre code sera plus lisible et plus facile à étendre ou à modifier si vous mettez la logique d'analyse dans une méthode distincte.


0 commentaires

0
votes
scanner = new Scanner(new File(fileName));
while (scanner.hasNextLine()) {
   String fileline = scanner.nextLine();
   if(fileline.contains("myStrings")) {
      String string = fileline.substring(fileline.indexOf("[") + 1, fileline.indexOf("]"));
      String[] vars = string.split(",");
      System.out.println(Arrays.toString(vars));
   }
}

0 commentaires