read and find string from text file

て烟熏妆下的殇ゞ 提交于 2020-01-06 21:48:06

问题


I am loading text file contents to GUI using this code:

try {
    BufferedReader br = new BufferedReader(new FileReader ("text.txt"));
    String line;                
    while ((line = br.readLine()) != null) {
        if (line.contains("TITLE")) {
            jTextField2.setText(line.substring(11, 59));
        }            
    }
    in.close();        
} catch (Exception e) {
}

Then contents of text.txt file:

JOURNAL   journal name                                               A12340001
TITLE     Sound, mobility and landscapes of exhibition: radio-guided A12340002
          tours at the Science Museum                                A12340003
AUTHOR    authors name                                               A12340004

On jTextField2 I am getting this line: "Sound, mobility and landscapes of exhibition: radio-guided". The problem is I don't know how to get to jTextField2 the string of next line "tours at the Science Museum".

I would like to ask how can I get both line on jTextField2 i.e. "Sound, mobility and landscapes of exhibition: radio-guided tours at the Science Museum"?

Thank you in advance for any help.


回答1:


If you are using Java 8 and assuming that the columns have a fixed number of characters, you could something like this:

public static void main(String args[]) throws IOException {
    Map<String, String> sections = new HashMap<>();
    List<String> content = (List<String>)Files.lines(Paths.get("files/input.txt")).collect(Collectors.toList());
    String lastKey = "";
    for(String s : content){
        String k = s.substring(0, 10).trim(); 
        String v = s.substring(10, s.length()-9).trim();
        if(k.equals(""))
            k=lastKey;
        sections.merge(k, v, String::concat);
        lastKey=k;
    }
    System.out.println(sections.get("TITLE"));
}

The first column is the key. When the keys does not exist, the last key is used. A Map is used to store the keys and the values. When the key already exist, the value is merged with the existing one by concatenation.

This code outputs the expected String: Sound, mobility and landscapes of exhibition: radio-guidedtours at the Science Museum.

EDIT: For Java 7

public static void main(String args[]) {
    Map<String, String> sections = new HashMap<>();
    String s = "", lastKey="";
    try (BufferedReader br = new BufferedReader(new FileReader("files/input.txt"))) {
        while ((s = br.readLine()) != null) {
            String k = s.substring(0, 10).trim();
            String v = s.substring(10, s.length() - 9).trim();
            if (k.equals(""))
                k = lastKey;
            if(sections.containsKey(k))
                v = sections.get(k) + v; 
            sections.put(k,v);
            lastKey = k;
        }
    } catch (IOException e) {
        System.err.println("The file could not be found or read");
    }

    System.out.println(sections.get("TITLE"));
}



回答2:


Why not create a MyFile class that does the parsing for you, storing key-value-pairs in a Map<String, String>, which you can then access. This will make your code more readable and will be easier to maintain.

Something like the following:

public class MyFile {
    private Map<String, String> map;
    private String fileName;

    public MyFile(String fileName)  {
        this.map = new HashMap<>();
        this.fileName = fileName;
    }

    public void parse() throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        String line = br.readLine();
        String key = "";
        while (line != null) {
            //Only update key if the line starts with non-whitespace
            key = line.startsWith(" ") ? title : line.substring(0, line.indexOf(" ")).trim();
            //If the key is contained in the map, append to the value, otherwise insert a new value
            map.put(key, map.get(key) == null ? line.substring(line.indexOf(" "), 59).trim() : map.get(key) + line.substring(line.indexOf(" "), 59).trim());
            line = br.readLine();
        }
    }

    public String getEntry(String key) {
        return map.get(key);
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Entry entry:map.entrySet()) {
            sb.append(entry.getKey()).append(" : ").append(entry.getValue()).append("\n");
        }
        return sb.toString();
    }
}

This will parse the entire file first. The expected format of the file is:

0 ... 59
[KEY][WHITE SPACE][VALUE]
0 ... 59
[WHITE SPACE][VALUE TO APPEND TO PREVIOUS KEY]

This allows for variable length keys.

Allowing you to handle exceptions separately, and then easily reference the contents of the file like so:

MyFile journalFile = new MyFile("text.txt");
try {
    journalFile.parse();
} catch (IOException e) {
    System.err.println("Malformed file");
    e.printStackTrace();
}

jTextField2.setText(journalFile.getEntry("TITLE"));



回答3:


An empty (all spaces) first column indicates that a line is the continuation of the previous one. So you can buffer the lines and repeatedly concatenate them, until you get a non-empty first column, and then write/print the whole line.

    try {
        BufferedReader br = new BufferedReader(new FileReader("text.txt")) ;
        String line ;
        String fullTitle = "" ;
        while ((line = br.readLine()) != null) {
            //extract the fields from the line
            String heading = line.substring(0, 9) ;
            String titleLine = line.substring(10, 69) ;

            //does not select on "TITLE", prints all alines
            if(heading.equals("         ")) {
                fullTitle = fullTitle + titleLine ;
            } else {
                System.out.println(fullTitle) ;
                fullTitle = titleLine ;
            }
        }
        System.out.println(fullTitle) ; //flush the last buffered line

    } catch (Exception e) {
        System.out.println(e) ;
    }



回答4:


you can do this First of all read the entire file into a string object. then get the indexes of the TITLE and AUTHOR like int start=str.indexOf("TITLE"); and int end=str.indexOf("AUTHOR"); then add the length of TITLE into start index start+="TITLE".length(); and subtract the length of AUTHOR from end index end-="AUTHOR".length(); at last you have the start and end index of text that you want. so get the text like.

String title=str.subString(start,end);


来源:https://stackoverflow.com/questions/37129625/read-and-find-string-from-text-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!