【问题标题】:How can i handle it with scanner (java)?我如何用扫描仪(java)处理它?
【发布时间】:2011-01-06 00:41:03
【问题描述】:

我有一个关于扫描仪的问题;我在一家小公司工作;我们有一个软件;它生成一个大文本文件;我们必须从中得到一些有用的信息;我想用java写一个简单的应用程序来节省时间;你能指导我吗?

例如我想要这个输出;

输出


RFID : 25 蓝色 : 562 WifiID : 2610 射频识别: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!");

请帮帮我;

非常感谢...

【问题讨论】:

    标签: java java.util.scanner


    【解决方案1】:

    这是一个使用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);
        }
    }
    
    射频识别:25 蓝色:562 WifiID:2610 射频识别:33 计数:{RFID=2, BLUID=1, WifiID=1} 1103000 射频识别:25 蓝色:562 WifiID:2610 射频识别:33 计数:{RFID=2, BLUID=1, WifiID=1} 22772000

    【讨论】:

    • Scanner 更灵活,但 StreamTokenizer 出现速度更快。
    【解决方案2】:

    好吧,您建议的来源不会做您想要的。扫描器使用分隔符分解输入。默认分隔符是空格(空格、制表符或换行符)。 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 对象,因为该方法对于您想要做的事情更灵活。

    【讨论】:

    • 哦,我应该指出,如果您阅读扫描仪的 java 文档会有所帮助。当前的 java 文档可以在 java.sun.com/javase/6/docs/api 找到,只需使用 Ctrl+f 搜索“Scanner”
    • 谢谢亲爱的詹姆斯,但你知道!这个源代码很慢;你知道为什么吗?
    【解决方案3】:

    准备运行:

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

    【讨论】:

      【解决方案4】:

      你的第一行有问题。

      1. 您需要在字符串文字中转义反斜杠("i:\\1.txt" 而不是 "i:\1.txt"
      2. 用于从文件读取的Scanner 构造函数采用File 参数(或InputStream 参数)。采用String 参数的构造函数正在读取该实际字符串。请参阅javadoc

      试试

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

      【讨论】:

        【解决方案5】:

        一些起始代码:

        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){}
        

        【讨论】:

          猜你喜欢
          • 2012-08-13
          • 2012-05-21
          • 2013-11-15
          • 2015-11-20
          • 1970-01-01
          • 1970-01-01
          • 2012-06-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多