2

我在一个小办公室工作,我有一个应用程序,它会生成一个 14000 行的大文本文件;

每次生成后我都必须过滤它,这真的很无聊;

我想用java写一个应用程序,直到我能尽快处理它。

请帮我; 我用扫描仪写了一个应用程序(当然有帮助:))但它不是很好,因为它很慢;

例如,这是我的文件:

SET CELL:NAME=CELL:0,CELLID=3;
SET LSCID:NAME=LSC:0,NETITYPE=MDCS,T32=5,EACT=FILTER-NOFILTER-MINR-FILTER-NOFILTER,ENSUP=GV2&NCR,MINCELL=6,MSV=PFR,OVLHR=9500,OTHR=80,BVLH=TRUE,CELLID=3,BTLH=TRUE,MSLH=TRUE,EIHO=DISABLED,ENCHO=ENABLED,NARD=NAP_STLP,AMH=ENABLED(3)-ENABLED(6)-ENABLED(9)

我想要这个输出(过滤器:)

CELLID :  3
ENSUP  :  GV2&NCR
ENCHO  :  ENABLED
MSLH   :  TRUE
------------------------
Count of CELLID : 2

哪种解决方案比其他解决方案最好且最快?

这是我的源代码:

public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("i:\\1\\2.txt"));
        scanner.useDelimiter(";|,");
        Pattern words = Pattern.compile("(CELLID=|ENSUP=|ENCHO=)");

        while (scanner.hasNextLine()) {
          String key = scanner.findInLine(words);

          while (key != null) {
            String value = scanner.next();
            if (key.equals("CELLID=")) 
              System.out.print("CELLID:" + value+"\n");
             //continue with else ifs for other keys
              else if (key.equals("ENSUP="))
            System.out.print("ENSUP:" + value+"\n");

            else if (key.equals("ENCHO="))
            System.out.print("ENCHO:" + value+"\n");
            key = scanner.findInLine(words);
          }
          scanner.nextLine();
        }

}

真的非常感谢...

4

2 回答 2

4

由于您的代码存在性能问题,因此您首先需要找到瓶颈。您可以使用您使用的 IDE 提供的分析器对其进行分析。

但是,由于您的代码在使用 System.out.print 读取文件和输出时计算量不高但 IO 密集,因此我建议您改进以改进文件 IO。

.

替换这行代码

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

.

有了这行代码

File file = new File("i:\\1\\2.txt");
BufferedReader br = new BufferedReader( new FileReader(file)  );
Scanner scanner = new Scanner(br);

让我们知道这是否有帮助。

.

由于以前的解决方案没有太大帮助,我做了一些更改来改进您的代码。您可能必须更正解析中的错误(如果有)。我能够在大约 5 秒内显示解析 392832 行的输出。原始解决方案需要 50 多秒。

费用如下:

  1. 使用 StringTokenizer 代替 Scanner
  2. 使用 BufferedReader 读取文件
  3. 使用 StringBuilder 缓冲输出

.

public class FileParse {

    private static final int FLUSH_LIMIT = 1024 * 1024;
    private static StringBuilder outputBuffer = new StringBuilder(
            FLUSH_LIMIT + 1024);
    private static final long countCellId;

    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        String fileName = "i:\\1\\2.txt";
        File file = new File(fileName);
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        while ((line = br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(line, ";|, ");
            while (st.hasMoreTokens()) {
                String token = st.nextToken();
                processToken(token);
            }
        }
        flushOutputBuffer();
        System.out.println("----------------------------");
        System.out.println("CELLID Count: " + countCellId);
        long end = System.currentTimeMillis();
        System.out.println("Time: " + (end - start));
    }

    private static void processToken(String token) {
        if (token.startsWith("CELLID=")) {
            String value = getTokenValue(token);
            outputBuffer.append("CELLID:").append(value).append("\n");
            countCellId++;
        } else if (token.startsWith("ENSUP=")) {
            String value = getTokenValue(token);
            outputBuffer.append("ENSUP:").append(value).append("\n");
        } else if (token.startsWith("ENCHO=")) {
            String value = getTokenValue(token);
            outputBuffer.append("ENCHO:").append(value).append("\n");
        }
        if (outputBuffer.length() > FLUSH_LIMIT) {
            flushOutputBuffer();
        }
    }

    private static String getTokenValue(String token) {
        int start = token.indexOf('=') + 1;
        int end = token.length();
        String value = token.substring(start, end);
        return value;
    }

    private static void flushOutputBuffer() {
        System.out.print(outputBuffer);
        outputBuffer = new StringBuilder(FLUSH_LIMIT + 1024);
    }

}

.

ENSUP 和 MSLH 的更新:

对我来说,您似乎在 if 语句中切换了 ENSUP 和 MSLH,如下所示。因此,您会看到“ENSUP”的“MSLH”值,反之亦然。

} else if (token.startsWith("MSLH=")) {
    String value = getTokenValue(token);
    outputBuffer.append("ENSUP:").append(value).append("\n");
} else if (token.startsWith("ENSUP=")) {
    String value = getTokenValue(token);
    outputBuffer.append("MSLH:").append(value).append("\n");
}
于 2010-01-18T04:49:05.407 回答
3

简单的文本过滤可能更容易用 Perl(我的选择,因为我已经使用了多年)或 Python(我向新人推荐,因为它是一种更现代的语言)编写。

于 2010-01-18T03:33:44.703 回答