Search code examples
androidregexsearchfull-text-searchsearch-engine

Searching a string from large text file of 10 Mb


I have a large file of about 10 MB, I want to search a specific string, and this specific string may be used a lot of times in 10 Mb text file. I need results where this specific string is used. I want to do search like Google. For example when i write a string then google comes with matching Patterns . Your suggestions will be appreciated.

file formate


  1. he is going to school.
  2. we should do best deeds.
  3. we should work hard. . . . .
  4. Always speak truth.


    i have search edit field in my application. user write "should" in search edit field.and press search button. a list should be opened in which searched words come with it's complete line. for example result should be


  5. we should do best deeds.

  6. we should work hard.

Solution

  • A simple way to search a file and get a match "with context" is to use grep. For example, to match every line with "hello", and print one line before and three lines after, you would do

    grep -b1 -a3 'hello' myBigFile.txt
    

    You can use grep -E to allow for a wide range of PCRE regex syntax.

    Without more detail it would be hard to give you a better answer.

    EDIT 2

    Now that you have explained your problem more clearly, here is a possible approach:

    InputStream fileIn;
    BufferedReader bufRd;
    String line, pattern;
    pattern = "should";  // get the pattern from the user, do not hard code. Example only
    
    fileIn = new FileInputStream("myBigTextfile.txt");
    bufRd = new BufferedReader(new InputStreamReader(fis, Charset.forName("UTF-8")));
    while ((line = bufRd.readLine()) != null) {
        if(line.contains(pattern)) {
          System.out.println(line); // echo matching line to output
        }
    }
    
    // Done with the file
    br.close();
    

    If you need to match with wildcards, then you might replace the line.contains with something that is a little more "hard core regex" - for example

    matchPattern = Pattern.compile("/should.+not/");
    

    (only need to do that once - after getting input, and before opening file) and change the condition to

    if (matchPattern.matcher(line).find())
    

    Note - code adapted from / inspired by https://stackoverflow.com/a/7413900/1967396 but not tested.

    Note there are no for loops... maybe the boss will be happy now.

    By the way - if you edit your original question with all the information you provided in the comments (both to this answer and to the original question) I think the question can be re-opened.

    If you expect the user to do many searches it may be faster to read the entire file into memory once. But that's outside of the scope of your question, I think.