read and find string from text file

2019-09-03 12:23发布

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.

标签: java java-io
4条回答
对你真心纯属浪费
2楼-- · 2019-09-03 12:59

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"));
}
查看更多
虎瘦雄心在
3楼-- · 2019-09-03 13:07

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楼-- · 2019-09-03 13:07

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);
查看更多
Deceive 欺骗
5楼-- · 2019-09-03 13:09

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"));
查看更多
登录 后发表回答