Как я могу справиться с этим со сканером (java)?

У меня есть вопрос о сканере, пожалуйста, я работаю в небольшой компании; у нас есть программное обеспечение; генерирует большой текстовый файл; и мы должны получить от него некоторую полезную информацию; я хочу написать простое приложение с java для экономии времени; не могли бы вы направить меня?

например, я хочу этот вывод;

Вывод


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

Количество RFID: 2

и, например, это мой текстовый файл, потому что каждый сгенерированный файл с нашим программным обеспечением имеет 14000 строк :)

--------------------------
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;

Я тестирую его с этим исходным кодом, но не могу с этим справиться;

Scanner scanner = new Scanner("i:\1.txt");

scanner.findInLine("RFID=");

if (scanner.hasNext())
System.out.println(scanner.next());
else
System.out.println("Error!");

пожалуйста, помогите мне ;

Большое спасибо ...


person Freeman    schedule 17.01.2010    source источник


Ответы (5)


Ну, предложенный вами источник не будет делать то, что вы хотите. Сканер разбивает ввод с помощью разделителя. Разделителем по умолчанию является пробел (пробелы, табуляции или новые строки). Scanner.hasNext() просто сообщает вам, есть ли новый токен, разделенный пробелами. Scanner.next() просто возвращает этот токен. Обратите внимание, что ни на что из этого не влияет Scanner.findInLine(pattern), поскольку все, что он делает, это ищет в текущей строке предоставленный шаблон.

Может быть, что-то вроде этого (я не проверял это):

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();
}

Я бы порекомендовал вам забыть об использовании сканера и просто использовать BufferedReader и пару объектов Pattern, поскольку этот метод более гибкий для того, что вы хотите сделать.

person James    schedule 17.01.2010
comment
О, и я должен отметить, что было бы полезно, если бы вы прочитали документацию по java для сканера. Текущую документацию по Java можно найти по адресу java.sun.com/javase/6/docs. /api просто найдите Scanner с помощью Ctrl+f - person James; 17.01.2010
comment
Спасибо Дорогой Джеймс, но вы знаете! этот исходный код очень медленный; ты знаешь почему? - person Freeman; 18.01.2010

Вот пример использования 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
person trashgod    schedule 17.01.2010
comment
Scanner более гибкий, но StreamTokenizer работает быстрее. - person trashgod; 18.01.2010

готов к запуску:

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");
    }
}
person stacker    schedule 17.01.2010

Ваша первая строка проблематична.

  1. Вам нужно экранировать обратную косую черту внутри строковых литералов ("i:\\1.txt" не "i:\1.txt")
  2. Конструктор Scanner для чтения из файла принимает аргумент File (или аргумент InputStream). Конструктор, который принимает аргумент String, читает из этой фактической строки. См. javadoc.

Пытаться

Scanner scanner = new Scanner(new File("i:\\1.txt"));
person Simon Nickerson    schedule 17.01.2010

Некоторый стартовый код:

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){}
person D.C.    schedule 17.01.2010