Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can you jump a scanner to a location in file or scan backwards?

I have a very large text file and I need to gather data from somewhere near the end. Maybe Scanner isn't the best way to do this but it would be very wasteful to start at the top and grab 6000 lines before getting to the part of the file I am interested in. Is there a way to either tell Scanner to jump to say 7/8ths down the document or start from the bottom and scan upwards grabbing line by line?

Thanks

like image 322
Mike Avatar asked Jun 17 '10 18:06

Mike


People also ask

How do I skip the first line of a scanner?

Just use file. nextLine() before your while loop. This will skip the first line, as explained in the JavaDoc.

What does scanner reset do?

Scanner class resets this scanner. On resetting a scanner, it discards all of its explicit state information which may have been changed by invocations of useDelimiter(java.

How do I clear the scanner in Java?

Java Clear Scanner Using nextLine() To clear the Scanner and to use it again without destroying it, we can use the nextLine() method of the Scanner class, which scans the current line and then sets the Scanner to the next line to perform any other operations on the new line.


1 Answers

The underlying input source for a java.util.Scanner is a java.lang.Readable. Beyond the Scanner(File) constructor, a Scanner neither knows nor cares of the fact that it's scanning a file.

Also, since it's regex based on java.util.regex.*, there's no way it can scan backward.

To accomplish what you want to do, it's best to do it at the input source level, e.g. by using InputStream.skip of the source before passing it to the constructor of Scanner.


On Scanner.skip

Scanner itself does have a skip, and a pattern like "(?s).{10}" would skip 10 characters (in (?s) single-line/Pattern.DOTALL mode), but this is perhaps a rather roundabout way of doing it.

Here's an example of using skip to skip a given number of lines.

    String text =
        "Line1 blah blah\n" +
        "Line2 more blah blah\n" +
        "Line3 let's try something new \r\n" +
        "Line4 meh\n" + 
        "Line5 bleh\n" + 
        "Line6 bloop\n";
    Scanner sc = new Scanner(text).skip("(?:.*\\r?\\n|\\r){4}");
    while (sc.hasNextLine()) {
        System.out.println(sc.nextLine());
    }

This prints (as seen on ideone.com):

Line5 bleh
Line6 bloop
like image 151
polygenelubricants Avatar answered Sep 30 '22 23:09

polygenelubricants