0

スキャナーについて質問があります。小さな会社で働いています。ソフトウェアがあります。大きなテキスト ファイルを生成します。そして、そこから有益な情報を得る必要があります。時間を節約するために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!");

私を助けてください ;

どうもありがとう ...

4

5 に答える 5

8

を使用した例を次に示し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
ブルーイド:562
Wi-FiID:2610
RFID:33
カウント:{RFID=2, BLUID=1, WifiID=1}
1103000
RFID:25
ブルーイド:562
Wi-FiID:2610
RFID:33
カウント:{RFID=2, BLUID=1, WifiID=1}
22772000
于 2010-01-17T18:52:49.313 に答える
3

提案されたソースは、あなたが望むことをしません。スキャナーは、区切り文字を使用して入力を分割します。デフォルトの区切り文字は空白 (スペース、タブ、または改行) です。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 オブジェクトを使用することをお勧めします。その方法は、やりたいことに柔軟に対応できるからです。

于 2010-01-17T09:08:11.483 に答える
2

実行する準備ができました:

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");
    }
}
于 2010-01-17T09:12:15.310 に答える
1

あなたの最初の行は問題があります。

  1. 文字列リテラル内のバックスラッシュをエスケープする必要があります("i:\\1.txt"ではありません"i:\1.txt"
  2. Scannerファイルから読み取るためのコンストラクターは、File引数(またはInputStream引数)を取ります。引数を取るコンストラクターはString、その実際の文字列から読み取っています。javadocを参照してください。

試す

Scanner scanner = new Scanner(new File("i:\\1.txt"));
于 2010-01-17T08:51:07.703 に答える
0

いくつかの開始コード:

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){}
于 2010-01-17T08:57:21.857 に答える