2010-11-01 24 views
1

J'ai un fichier texte où chaque ligne impaire contient un nombre entier (String ofcourse depuis son dans un fichier texte), même les lignes ont un temps. Je veux seulement lire les nombres, donc le nombre impair de lignes d'un fichier texte. Comment je fais ça?Comment lire un nombre impair de lignes à partir d'un fichier texte en utilisant Java?

import java.io.*; 

public class File { 

BufferedReader in; 
String read; 
int linenum =12; 


public File(){ 
try { 
in = new BufferedReader(new FileReader("MAP_allData.txt")); 

for (linenum=0; linenum<20; linenum++){ 

read = in.readLine(); 
if(read==null){} 
else{ 
System.out.println(read); } 
} 
in.close(); 
}catch(IOException e){ System.out.println("There was a problem:" + e); 

} 
} 

public static void main(String[] args){ 
File File = new File(); 
} 
} 

A partir de maintenant, il va lire toutes les lignes (paires et impaires) jusqu'à ce qu'il n'y a pas de plus à lire (null)

Depuis mes lignes paires de nombres est un horodatage comme 13:44:23 si puis-je faire quelque chose comme

if (lire == null oU si lecture comprend un temps ou des points-virgules ) {} else { SOP (lire);}

Répondre

2

Mettre un simple in.readLine() juste avant la fermeture de votre for -loop va régler cela?

-à-dire:

for (linenum=0; linenum<20; linenum++) { 

    read = in.readLine(); 
    if(read==null){} 
    else{ 
     System.out.println(read); 
    } 
    in.readLine(); 
} 
+0

merci, cela fonctionne. – razshan

4

Lit toutes les lignes et ignore les autres.

int lineNum = 0; 
String line = null; 
while ((line = reader.readLine()) != null) { 
    lineNum++; 
if (lineNum % 2 == 0) continue; 
    //else deal with it 
} 

Ou tout simplement appeler readLine() deux fois par boucle, en ignorant la deuxième fois, et éviter d'avoir un compteur (sécurité puisque tous les appels à READLINE null retour après la fin du cours d'eau a été atteint).

Modifier Si l'efficacité est absolument clé et les lignes de date avait un format de longueur fixe, vous pouvez utiliser skip(15) ou similaire pour sauter efficacement les lignes que vous ne se soucient pas.

+0

La boucle 'while' indéfinie est une bien meilleure option qu'une boucle' for'! – Philip

+0

@Philip: pour être honnête, j'utilise toujours typiquement une boucle for pour que 'line' soit correctement portée:' for (String line = null; (ligne = lecteur.readLine())! = Null;) {... "Mais votre point est bien fait de toute façon. –

0

Vous avez déjà un LineCounter, donc si vous voulez utiliser toutes les autres lignes, utilisez le contrôle modulo

if((linenum % 2) == 1){ 
    System.out.println(read); 
} 
0

Juste effectuer quelque chose comme ça à chaque fois que vous lisez dans une ligne:

String str = read; 
char[] all = str.toCharArray(); 
bool isInt = true; 
for(int i = 0; i < all.length;i++) { 
    if(!Character.isDigit(all[i])) { 
     isInt = false; 
    } 
    else { 
     isInt = true; 
    } 
} 
if isInt { 
    //INTEGER LINE 
} else { 
    //DO SOMETHING WITH THE TIME 
} 

Cela rend le code dynamique. Si le fichier texte change et que les entiers apparaissent sur des lignes numérotées différentes, votre code peut rester le même.

+0

Si le format de fichier texte change, je voudrais que mon code casse. Qui sait si c'est en fait la sémantique qui a changé, auquel cas ne pas rompre conduirait à des bugs obscurs? –

+1

Tout dépend du domaine que je suppose ... juste un autre moyen de le regarder. – Scott

+0

C'est vrai. Si c'était moi et que je devais adopter cette approche, je préférerais probablement passer la ligne 'Integer.parseInt()' ou 'Integer.valueOf()' et attraper n'importe quelle 'NumberFormatException'. Vous allez finalement vouloir le faire de toute façon, pour transformer l'entrée en int/Integer. De cette façon est verbeux et fragile. Par exemple, votre méthode n'autorise pas les nombres négatifs. –