2010-03-20 5 views
2

J'essaie de trouver une expression régulière dans une ligne d'un fichier .csv, de sorte que je puisse éventuellement sauvegarder toutes les correspondances dans un autre fichier et perdre toutes les autres données indésirables.Imprimer une chaîne qui contient un certain modèle en Java

donc une ligne dans mon dossier pourrait ressembler à: MachineName, utilisateur, IP, variableData, Emplacement

Le variableData est ce que je veux correspondre, et s'il y a un match, imprimer la ligne. J'utilise un motif pour cela parce que je veux seulement 3 variations de VariableData sur 10, et sur ces 3, elles sont numérotées différemment (par exemple, "pc104, pccrt102, pccart65"). J'essaie de le faire en utilisant la classe Scanner et de le garder aussi simple que possible afin que je puisse le comprendre. Voici où je me dirigeais avec ça ... (le motif n'est pas complet, juste comme ça pour tester).

import java.io.File; 
import java.util.Scanner; 
import java.util.regex.Pattern; 


public class pcv { 

public static void main(String[] args) { 

    File myFile = new File("c:\\temp\\report.csv"); 

    Pattern myPat = Pattern.compile("pc"); 

    try{ 
    Scanner myScan = new Scanner(myFile); 

    while(myScan.hasNext()){ 

     if(myScan.hasNext(myPat)){ 
      System.out.println("Test"); 
     } 

    } 

    }catch(Exception e){ 

    } 


} 

} 

Cette boucles code, im deviner les méthodes .hasNext() sont eux-mêmes la réinitialisation. J'ai un peu joué avec la classe Matcher, mais j'ai seulement trouvé un moyen de faire correspondre l'expression mais pas la ligne entière.

Mon autre chemin était peut-être de compter la ligne qui contient le motif, puis de revenir en arrière et d'imprimer la ligne qui correspond aux comptages.

+0

Je connais sa sémantique, mais n'est-ce pas _match_ le motif, pas _contain_ it? –

Répondre

2

C'est quelque chose grep est conçu pour, mais si vous voulez le faire en Java, vous pouvez utiliser ce corps de la boucle while à la place:

while(myScan.hasNext()){ 
    String line = myScan.nextLine(); 
    if (myPat.matcher(line).find()) { 
     System.out.println(line); 
    } 
} 

Comme d'autres l'ont mentionné, le problème avec votre code d'origine est qu'il ne fait pas avancer le fait Scanner.

+0

Tout est beaucoup plus logique maintenant. Merci à tous pour votre aide. – jjpotter

1

Au moment où vous êtes seulement demander au scanner si elle a une autre entrée, et pas vraiment l'obtenir (via next())

1

conjecture d'abord pourquoi vous êtes en boucle est toujours que la classe Scanner a deux méthodes: hasNext et next.

hasNext testerons s'il y a un autre jeton qui correspond, sans déplacer la position du Scanner dans le fichier.

next renverra le jeton suivant et lancera une exception si cela ne fonctionne pas pour une raison quelconque.

Donc, en général, vous verrez les deux utilisés comme ceci:

String token = ""; 
if(myScan.hasNext(wtv)) { 
    token = myScan.next(wtv); 
} 
Questions connexes