كيف يمكنني التعامل معها مع الماسح الضوئي (Java)؟

StackOverflow https://stackoverflow.com/questions/2080403

  •  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");
    }
}

خطك الأول هو مشكلة.

  1. تحتاج إلى الهروب من الزلاجات الخلفية داخل الأسلاك الحرفية ("i:\\1.txt" ليس "i:\1.txt")
  2. ال 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){}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top