Как я могу справиться со сканером (Java)?
У меня есть вопрос о сканере, пожалуйста, я работаю в небольшой компании; у нас есть программное обеспечение; он генерирует большой текстовый файл; и мы должны получить от него некоторую полезную информацию; я хочу написать простое приложение с Java для экономии времени; не могли бы вы направить меня?
например, я хочу этот вывод;
Выход
RFID: 25 BLUID: 562 Wi-Fi: 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!");
Помогите мне, пожалуйста;
Большое спасибо...
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, так как этот метод более гибкий для того, что вы хотите сделать.
Вот пример использования 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 Считает:{RFID=2, BLUID=1, WifiID=1} 1103000 RFID:25 BLUID:562 WifiID:2610 RFID-:33 Считает:{RFID=2, BLUID=1, WifiID=1} 22772000
Готов к запуску:
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");
}
}
Ваша первая строка проблематична.
- Вы должны избежать обратной косой черты внутри строковых литералов (
"i:\\1.txt"
не"i:\1.txt"
) Scanner
Конструктор для чтения из файла занимаетFile
аргумент (илиInputStream
аргумент). Конструктор, который принимаетString
аргумент читает из этой фактической строки. Смотрите Javadoc.
Пытаться
Scanner scanner = new Scanner(new File("i:\\1.txt"));
Некоторый стартовый код:
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){}