كيف يمكنني التعامل معها مع الماسح الضوئي (Java)؟
-
21-09-2019 - |
سؤال
لدي سؤال حول الماسح الضوئي من فضلك ؛ أعمل في شركة صغيرة ؛ لدينا برنامج ؛ يولد ملف نصي كبير ؛ ويجب أن نحصل على بعض المعلومات المفيدة منه ؛ أريد كتابة تطبيق بسيط مع 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!");
الرجاء مساعدتي ؛
شكرًا جزيلاً ...
المحلول
حسنًا ، لن يفعل المصدر المقترح ما تريد. تفكك الماسح الضوئي الإدخال باستخدام محدد. المحدد الافتراضي هو مساحة بيضاء (المسافات أو علامات التبويب أو الخطوط الجديدة). Scanner.hasnext () يخبرك ببساطة إذا كان هناك رمز جديد محدد مساحة بيضاء. Scanner.next () ببساطة إرجاع هذا الرمز المميز. لاحظ أنه لا يتم تنفيذ أي منها بواسطة Scanner.FindInline (نمط) كما يفعل كل ما يفعله هو البحث في السطر الحالي للنمط المقدم.
ربما شيء من هذا القبيل (لم أختبر هذا):
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();
}
أوصيك أن تنسى استخدام الماسح الضوئي واستخدام فقط Bufferreader واثنين من كائنات الأنماط لأن هذه الطريقة أكثر مرونة لما تريد القيام به.
نصائح أخرى
إليك مثال باستخدام 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
جاهز للتشغيل:
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
الوسيطة هي القراءة من تلك السلسلة الفعلية. انظر جافادوك.
محاولة
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){}