web-dev-qa-db-fra.com

Utilisation du délimiteur lors de la lecture d'un fichier

J'ai peu d'expérience dans l'utilisation des délimiteurs et j'ai besoin de lire un fichier texte contenant plusieurs objets dont les données sont stockées sur une seule ligne, séparées par des virgules (","). Les chaînes séparées sont ensuite utilisées pour créer un nouvel objet qui est ajouté à un arraylist.

Amadeus,Drama,160 Mins.,1984,14.83
As Good As It Gets,Drama,139 Mins.,1998,11.3
Batman,Action,126 Mins.,1989,10.15
Billy Elliot,Drama,111 Mins.,2001,10.23
Blade Runner,Science Fiction,117 Mins.,1982,11.98
Shadowlands,Drama,133 Mins.,1993,9.89
Shrek,Animation,93 Mins,2001,15.99
Snatch,Action,103 Mins,2001,20.67
The Lord of the Rings,Fantasy,178 Mins,2001,25.87

J'utilise Scanner pour lire le fichier, mais je reçois une erreur sans ligne trouvée et le fichier entier est stocké dans une chaîne:

Scanner read = new Scanner (new File("datafile.txt"));
read.useDelimiter(",");
String title, category, runningTime, year, price;

while (read.hasNext())
{
   title = read.nextLine();
   category = read.nextLine();
   runningTime = read.nextLine();
   year = read.nextLine();
   price = read.nextLine();
   System.out.println(title + " " + category + " " + runningTime + " " +
                      year + " " + price + "\n"); // just for debugging
}
read.close();
7
Robert Spratlin

Utilisez read.next () au lieu de read.nextLine ()

   title = read.next();
   category = read.next();
   runningTime = read.next();
   year = read.next();
   price = read.next();
13
muffy

Je pense que vous voulez appeler .next() qui renvoie une chaîne au lieu de .nextLine(). Votre appel .nextLine() dépasse la ligne actuelle.

Scanner read = new Scanner (new File("datafile.txt"));
   read.useDelimiter(",");
   String title, category, runningTime, year, price;

   while(read.hasNext())
   {
       title = read.next();
       category = read.next();
       runningTime = read.next();
       year = read.next();
       price = read.next();
     System.out.println(title + " " + category + " " + runningTime + " " + year + " " + price + "\n"); //just for debugging
   }
   read.close();
4
majorbanzai

Vous devriez utiliser next(); là où vous utilisez nextLine();

Consultez le didacticiel: http://docs.Oracle.com/javase/tutorial/essential/io/scanning.html

Remarquez les lignes:

try {
   s = new Scanner(new BufferedReader(new FileReader("xanadu.txt")));

   while (s.hasNext()) {
   System.out.println(s.next());
}
3
mcalex

Vous pouvez également utiliser une fonction String.split () pour convertir la chaîne en un tableau de chaînes, puis effectuer une itération sur chacune d'elles pour vos valeurs.

Comment convertir une chaîne séparée par des virgules en ArrayList? voir ceci pour plus de détails.

1
Aniket Inge

Toutes les réponses ci-dessus sont exactes et identiques. Cependant, un point important dont tout le monde devrait se rappeler que la Scanner a une taille de tampon de seulement 1024. Cela signifie que si la longueur du texte délimité est supérieure, l'analyse s'arrête. 

Donc, une petite amélioration à la solution donnée, utilisez BufferedReader au lieu de passer directement le fichier à Scanner. Exemple:

    BufferedReader in = new BufferedReader(new FileReader("datafile.txt"), 16*1024);
    Scanner read = new Scanner(in);
    read.useDelimiter(",");
    String title, category, runningTime, year, price;

    while(read.hasNext())
    {
        title = read.next();
        category = read.next();
        runningTime = read.next();
        year = read.next();
        price = read.next();
        System.out.println(title + " " + category + " " + runningTime + " " + year + " " + price + "\n"); //just for debugging
    }
    read.close();
0
user846316

Un problème est:

while(read.hasNext())
   {
       title = read.nextLine();
       category = read.nextLine();
       runningTime = read.nextLine();

hasNext()

Renvoie true si ce scanner a un autre jeton en entrée. Pas toute la ligne. Vous devez utiliser hasNextLine ()

Vous faites nextLine () trois fois. Je pense que ce que vous devez faire est, lisez la ligne et divisez la ligne.

0
kosa