How can I deal with the scanner (java)?

I have a question about the scanner, please, I work for a small company; we have software; It generates a large text file; and we should get useful information from him; I want to write a simple application with java to save time; could you guide me?

for example, I want this conclusion;

Exit




RFID: 25 BLUID: 562 WifiID: 2610 RFID: 33

RFID Count: 2

and, for example, this is my text file, because each generated file with our software has 14,000 lines :)

-------------------------- AAAAAAAAAAAA;RFID=25; BBBB;BBBBBBBB;BBBBBBBBBB; CCCCC;fffdsfdsfdfsd;BLUID=562;dfsdfsf; fgfdgdf;terter;fdgfdgtryt; trtretrre;WifiID=2610;trterytuytutyu; zxzxzxzxz;popopopwwepp;RFID:33;aasasds… gfdgfgfd;gfdgfdgfd;fdgfgfgfd; 

I am testing it with this source code, but I cannot process it,

 Scanner scanner = new Scanner("i:\1.txt"); scanner.findInLine("RFID="); if (scanner.hasNext()) System.out.println(scanner.next()); else System.out.println("Error!"); 



please help me;

Thank you so much...

0
java java.util.scanner
Jan 17 '10 at 8:20
source share
5 answers

Well, your proposed source will not do what you want. The scanner breaks the input using a delimiter. The default delimiter is spaces (spaces, tabs, or newlines). Scanner.hasNext () just tells you if there is a new token with delimiters. Scanner.next () just returns this token. Note that none of them are executed using Scanner.findInLine (pattern), since all it does is search for the current line for the provided template.

Maybe something like this (I have not tested this):

 Scanner scanner = new Scanner("i:\\1.txt"); scanner.useDelimiter(";"); Pattern words = Pattern.compile("(RFID=|BLUID=|WifiID=)");//just separate patterns with | while (scanner.hasNextLine()) { key = scanner.findInLine(words); while (key != null) { String value = scanner.next(); if (key.equals("RFID=") { System.out.print("RFID:" + value); } //continue with else ifs for other keys key = scanner.findInLine(words); } scanner.nextLine(); } 

I would recommend you forget about using a scanner and just use the BufferedReader and a couple of Pattern objects, since this method is more flexible for what you want to do.

+3
Jan 17 '10 at 9:08
source share

Here is an example using StreamTokenizer :

 import java.io.IOException; import java.io.StreamTokenizer; import java.io.StringReader; import java.util.HashMap; import java.util.Scanner; public class ScannerTest { private static final String s = "" + "AAAAAAAAAAAA;RFID=25;\n" + "BBBB;BBBBBBBB;BBBBBBBBBB;\n" + "CCCCC;fffdsfdsfdfsd;BLUID=562;dfsdfsf;\n" + "fgfdgdf;terter;fdgfdgtryt;\n" + "trtretrre;WifiID=2610;trterytuytutyu;\n" + "zxzxzxzxz;popopopwwepp;RFID:33;aasasds…\n" + "gfdgfgfd;gfdgfdgfd;fdgfgfgfd;\n"; public static void main(String[] args) { long start = System.nanoTime(); tokenize(s); System.out.println(System.nanoTime() - start); start = System.nanoTime(); scan(s); System.out.println(System.nanoTime() - start); } private static void tokenize(String s) { HashMap<String, Integer> map = new HashMap<String, Integer>(); StreamTokenizer tokens = new StreamTokenizer(new StringReader(s)); tokens.whitespaceChars(';', ';'); try { int token; String id; do { id = tokens.sval; token = tokens.nextToken(); if (token == '=' || token == ':') { token = tokens.nextToken(); Integer count = map.get(id); map.put(id, count == null ? 1 : count + 1); System.out.println(id + ":" + (int) tokens.nval); } } while (token != StreamTokenizer.TT_EOF); System.out.println("Counts:" + map); } catch (IOException e) { e.printStackTrace(); } } private static void scan(String s) { HashMap<String, Integer> map = new HashMap<String, Integer>(); Scanner scanner = new Scanner(s).useDelimiter(";"); while (scanner.hasNext()) { String token = scanner.next(); String[] split = token.split(":"); if (split.length == 2) { Integer count = map.get(split[0]); map.put(split[0], count == null ? 1 : count + 1); System.out.println(split[0] + ":" + split[1]); } else { split = token.split("="); if (split.length == 2) { Integer count = map.get(split[0]); map.put(split[0], count == null ? 1 : count + 1); System.out.println(split[0] + ":" + split[1]); } } } scanner.close(); System.out.println("Counts:" + map); } } 
 RFID: 25
 BLUID: 562
 WifiID: 2610
 RFID: 33
 Counts: {RFID = 2, BLUID = 1, WifiID = 1}
 1103000
 RFID: 25
 BLUID: 562
 WifiID: 2610
 RFID: 33
 Counts: {RFID = 2, BLUID = 1, WifiID = 1}
 22772000
+7
Jan 17 '10 at 18:52
source share

ready for work:

 public class ScannerTest { private static void readFile(String fileName) { try { HashMap<String, Integer> map = new HashMap<String, Integer>(); File file = new File(fileName); Scanner scanner = new Scanner(file).useDelimiter(";"); while (scanner.hasNext()) { String token = scanner.next(); String[] split = token.split(":"); if (split.length == 2) { Integer count = map.get(split[0]); map.put(split[0], count == null ? 1 : count + 1); System.out.println(split[0] + ":" + split[1]); } else { split = token.split("="); if (split.length == 2) { Integer count = map.get(split[0]); map.put(split[0], count == null ? 1 : count + 1); System.out.println(split[0] + ":" + split[1]); } } } scanner.close(); System.out.println("Counts:" + map); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { readFile("test.txt"); } } 
+2
Jan 17 '10 at 9:12
source share

Your first line is problematic.

  • You need to avoid backslashes inside string literals ( "i:\\1.txt" not "i:\1.txt" )
  • The Scanner constructor for reading from a file takes a File argument (or an InputStream argument). The constructor that takes a String argument reads from this actual string. See javadoc .

Try

 Scanner scanner = new Scanner(new File("i:\\1.txt")); 
+1
Jan 17
source share

Some initial codes:

 String filename = "your_text_file"; Scanner sc = new Scanner(filename); // use the scanner to iterate through every line in the file: try{ while(sc.hasNextLine()){ String line = sc.nextLine(); // split the line up into space-separated tokens: String[] tokens = line.split(); // look through the tokens to find what you are looking for: for(int i = 0; i<tokens.length; i++){ if(tokens[i].equals("search_word){ // Do stuff } } } } // end try catch(Exception e){} 
0
Jan 17 '10 at 8:57
source share



All Articles