从文本文件中读取并查找字符串

qlzsbp2j  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(372)

我正在使用以下代码将文本文件内容加载到gui:

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) {
}

然后text.txt文件的内容:

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

jTextField2 我得到这句话:“声音,流动性和景观的展览:无线电引导”。问题是我不知道怎么去 jTextField2 下一行是“科学博物馆之旅”。
我想问一下我怎样才能把这两条线都接通 jTextField2 i、 e.“展览的声音、流动性和景观:科学博物馆的无线电导游”?
事先谢谢你的帮助。

9rnv2umw

9rnv2umw1#

如果您使用的是java 8,并且假设列具有固定数量的字符,则可以如下所示:

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"));
}

第一列是键。如果密钥不存在,则使用最后一个密钥。一 Map 用于存储键和值。当键已经存在时,通过串联将该值与现有值合并。
此代码输出预期的字符串: Sound, mobility and landscapes of exhibition: radio-guidedtours at the Science Museum .
编辑:对于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"));
}
3xiyfsfu

3xiyfsfu2#

为什么不创建一个 MyFile 类,将键值对存储在 Map<String, String> ,然后可以访问。这将使您的代码更易于阅读和维护。
如下所示:

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();
    }
}

这将首先解析整个文件。文件的预期格式为:

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

这允许使用可变长度的键。
允许您单独处理异常,然后方便地引用文件的内容,如下所示:

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

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

yhuiod9q3#

第一列为空(所有空格)表示一行是前一行的延续。因此,您可以缓冲这些行并重复连接它们,直到得到一个非空的第一列,然后写入/打印整行。

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) ;
    }
nlejzf6q

nlejzf6q4#

首先可以将整个文件读入字符串对象。然后得到标题和作者的索引 int start=str.indexOf("TITLE"); and int end=str.indexOf("AUTHOR"); 然后将标题的长度添加到起始索引中 start+="TITLE".length(); 从结束索引中减去作者的长度 end-="AUTHOR".length(); 最后你有了你想要的文本的开始和结束索引。所以把文字写得像。

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

相关问题