Java, lecture de nombres à partir de fichiers txt avec des symboles spéciaux dans un tableau bidimensionnel d'entiers


Donc, pour commencer je vais essayer d'expliquer ce que j'essaie d'accomplir. Je suis nouveau sur java et je suis prêt à l'apprendre. Le problème:

Supposons que j'ai un fichier txt rempli de quelque chose comme ceci:

Le modèle est : | a b |, quand a est un ID et b est le nombre réel. J'ai lu sur les classes Scanner, FileReader et BufferedReader en java, j'ai essayé de les utiliser pour récupérer les entiers du fichier et les enregistrer dans mes deux tableau dimesnional d'entiers ([2] [1000]). Le[0] [0-999] serait ID et 1[0-999] serait des chiffres réels. Maintenant, voici le moment où je suis coincé - je peux lire les deux premiers zéros, mais je ne sais pas comment ignorer le symbole|.

Mon code pour l'instant :

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class ShortSearching {
    public static void main(String[] args) {

        int[] tall = new int[100];
        int i = 0, k = 0;
        Tab tablica = new Tab();
        File textFile = new File("byteObs.txt");
        try (Scanner scanner = new Scanner(textFile)) {
            while (scanner.hasNextInt()) {
                k++;
                tall[i++] = scanner.nextInt();
                System.out.println(tall[i]);
                if (k == 2) {
                    scanner.findInLine("|");
                    scanner.skip("|");
                    k = 0;
                }
            }

        } catch (FileNotFoundException e) {
            System.out.println("File not found: " + textFile.toString());
            //e.printStackTrace();
        }



        /*String byteObs = "byteObs.txt";
        File textFile = new File(byteObs);
        Scanner input = new Scanner(textFile);
        //short[] tabID,tabVal = new short[1000];
        byte k = 0;

        while (input.hasNextLine()) {


            for (int i = 0; i <= 999; i++) {
                for (int j = 0; j <= 999; j++) {
                    if (k != 2) {
                        if (input.hasNextShort()) {
                            //matrix[i][j] = input.nextShort();
                            //System.out.printf("%d ", matrix[i][j]);
                            k++;
                        }
                    }
                    else {
                        input.skip("|");
                        k=0;
                    }
                }
            }


        }
        input.close(); */
    }}

Je l'ai essayé de plusieurs façons, je ne peux pas en coller certaines, car elles sont déjà supprimées. Je serais reconnaissant si quelqu'un me pointait au moins vers la méthode que je devrais lire pour pouvoir ignorer ce / symbole dans mon texte fichier.

PS. Je sais que les numéros de boucles for sont faux, je les changerai quand je corrigerai les trucs de symbole de saut.

MODIFIER http://wklej.org/id/1543739/

Voici le texte complet.

Author: ArtKorchagin, 2014-11-30

1 answers

Scanner dans beaucoup de ses méthodes attend un motif représentant des expressions régulières (regex). Cela se produit également dans le cas de la méthode skip, mais dans regex | est un méta-caractère représentant l'opérateur OR. Pour le rendre littéral simple, vous devez l'échapper en ajoutant \ avant (rappelez-vous que pour créer \ littéral dans String, vous devez également l'échapper avec un autre \).

Donc regex représentant | caractère est \| qui doit être écrit sous forme de chaîne "\\|".

Un autre problème est que skip nécessite une expression régulière qui doit correspondre à une partie entière qui doit être ignorée et cette partie doit apparaître exactement après la position du curseur du scanner, donc dans le cas de données comme

1 |

Lorsque nous invoquerons nextInt() le curseur sera placé juste après 1 (je le marquerai avec I)

1I |

, Donc modèle que nous voulons ignorer est space+|.

Le dernier problème est que votre fichier n'a pas de valeurs correctes dans toutes les lignes (il a lignes contenant seulement
| | où nous ne pourrons pas utiliser nextInt() car l'élément suivant ne sera pas int. Dans ce cas, nous pouvons simplement tester si cette ligne commence par un entier en utilisant hasNextInt() et si elle ne lit pas, consommez-la sans traiter son contenu en appelant nextLine().

Donc votre code peut ressembler à

File textFile = new File("input.txt");
try (Scanner sc = new Scanner(textFile)) {
    while (sc.hasNextLine()) {
        if (sc.hasNextInt()) {
            System.out.println("id    = " + sc.nextInt());
            System.out.println("value = " + sc.nextInt());
            if (sc.hasNext("\\|"))
                sc.skip(" \\|");
        } else {
            sc.nextLine(); // skip line if it doens't contain more integers
        }
    }
} catch (FileNotFoundException e) {
    System.out.println("File not found: " + textFile);
}
 2
Author: Pshemo, 2014-11-30 21:14:13