2013-07-29 10 views
-1

J'ai une application supposée lire les données du fichier texte avec les détails de l'étudiant (student.txt), de sorte que j'ai un studentNo, StudentName, Marks, etc. .Erreur lors de la lecture des données du fichier texte

Voici un échantillon des données qui est dans le fichier texte:

20405587 "ZULU,B M" 65 67 
20407388 "JUGGERNATH,N" 66 63 
20408427 "KHATHI,P X" 60 60 
20409821 "SINGH,T" 62 59 
20410422 "NKOMO,N N" 58 60 

J'utilise un scanner pour lire le fichier, voici mon code jusqu'à présent. . .it me donne une erreur

try 
{ 
    BufferedReader br = new BufferedReader(new FileReader("student.txt")); 
    String line = br.readLine(); 

    while (line!=null) 
    { 
     Scanner scan = new Scanner(line); 
     scan.useDelimiter(" "); 
     String dummystudent=scan.next(); 
     int studentNo= Integer.parseInt(dummystudent); 
     String dummyname1 = scan.next(); 
     String dummyname2 = scan.next(); 
     String studentName = dummyname1+dummyname2; 
     String dummytest1 = scan.next(); 
     int test1= Integer.parseInt(dummytest1); 
     String dummytest2 = scan.next(); 
     int test2= Integer.parseInt(dummytest2); 
     tad1.setText(tad1.getText()+"Student Number: " + studentNo + '\n' + "Student Name :" + studentName); 

     line = br.readLine(); 
    } 
    br.close(); 
} 
catch(Exception b) 
{ 
    JOptionPane.showMessageDialog(null,b.getMessage()); 
} 
+4

Quelle erreur obtenez-vous et sur quelle ligne? – svz

+0

quelle est l'erreur? Qu'est-ce qui ne fonctionne pas? – sanbhat

+1

s'il vous plaît, ne pas rétrograder, laissez-le fixer 1er –

Répondre

0

Vous devez utiliser le séparateur "? +"?, le délimiteur est une expression régulière, et votre chaîne a plusieurs espaces pour séparer les champs, vous devez également prendre en citations de compte autour de champs de chaîne. Je suis encore à l'entraînement comment résoudre les champs de chaîne avec des espaces.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#useDelimiter(java.lang.String)


utilisant l'expression rationnelle, vous devriez être en mesure de le faire en utilisant la chaîne ci-dessous regex, et sélectionnez les sous-groupes 1-4, grâce à un Matcher

([0-9]{8}) +"([A-Z, ]+)" +([0-9]{2}) +([0-9]{2}) 
+0

J'ai mis le code scan.useDelimiter ("+") et if (scan.hasNext()), il affiche seulement: StudentNo 20405587 Nom de l'étudiant: "ZULU, BM", mais ne pas lire d'autres lignes ou afficher le reste de la les données dans le fichier texte. . . .Lire une seule ligne –

+0

Je reçois une erreur en disant Méta personnage qui pend? près de l'index 0 ? + Je pense que cela a à voir avec le délimiteur et les espaces font que les autres élèves ont deux initiales et d'autres seulement un seul, et je dois garder la trace du nom complet, y compris l'espace sur les initiales –

+0

utiliser regex pour extraire les parties? Plus d'informations exactes – Robadob

0

Vous définissez le délimiteur un seul espace. C'est le problème. next renverra une chaîne vide plusieurs fois car ces lignes ont plus d'un espace.

Au lieu de cela que vous voulez dire un ou plusieurs espaces:

sc.useDelimiter(" +"); 

Il est pas encore à 100% depuis "ZULU,B M" a un espace au milieu et ne "JUGGERNATH,N" pas, mais je vais laisser vous se rendre compte. Peut-être:

sc.useDelimiter("\""); 

quelque part au milieu.

Le + concerne les expressions régulières, voir this pour plus d'informations en général et this pour plus d'informations spécifiques à Java.

0

Votre analyse syntaxique semble être trop lourde. Vous pouvez utiliser Scanner pour lire la ligne et utiliser StringUtils.split() pour analyser la ligne.

Voici un code:

 public static void main(String[] args) 
    { 
     int index = 1; // Just for printing. 

     for (String current : input) 
     { 
      String[] split1; // result: number, name, numbers 
      String[] split2; 
      String studentName1; 
      String studentName2; 
      String studentNumber; 
      String testScore1; 
      String testScore2; 

      split1 = StringUtils.split(current, '"'); 

      studentNumber = StringUtils.trim(split1[0]); 

      split2 = StringUtils.split(split1[1], ','); 

      studentName1 = StringUtils.trim(split2[0]); 
      studentName2 = StringUtils.trim(split2[1]); 

      split2 = StringUtils.split(split1[2]); // default seperator is whitespace. 

      testScore1 = StringUtils.trim(split2[0]); 
      testScore2 = StringUtils.trim(split2[1]); 

      System.out.println(
       index + ":" + 
       " Number: " + ">" + studentNumber + "" + studentName1 + "" + studentName2 + "" + testScore1 + "" + testScore2 + "

Note: StringUtils est de Apache Commons Lang

+0

L'utilisation d'Apache est exagérée, puisque 'String' a déjà des fonctions' split' et 'trim'. – Dukeling

+0

String.split a quelques cas de bord désagréables que l'utilitaire d'Apache contourne. – Amalgovinus

0

Easiest façon de mettre fin serait d'être en ligne aller par ligne.

Pattern filePatten = Pattern.compile("\\s*(\\d+)\\s+(\"[^\"]+\")\\s+(\\d+)\\s+(\\d+)\\s*"); 
while (scanner.hasNextLine()) { 
    String line = scanner.nextLine(); 
    Matcher matcher = filePattern.matcher(line); 
    if (matcher.matches()) { 
     String id = matcher.group(1); 
     String name = matcher.group(2); 

     //etc 
    } else { 
     //Warn : Fragile Regex 
    } 
} 

Chaque groupe de l'expression régulière capture une partie de la ligne. Le deuxième groupe capture le nom avec des guillemets. Vous pourriez vouloir l'enlever.

+0

Dois-je importer quelque chose pour utiliser "Pattern"? –

+0

@OupaMcCarthy 'import java.util.regex. *;' – bsd

Questions connexes