繁体   English   中英

如何解析文本文件,顺序很重要

[英]how to parse text files, where order matters

我无法确定解析给定文本文件的方法。

这是文件中的一个条目:

type = "book"
callnumber = "1"
authors = "a"
title = "t"
publisher = "p"
year = "2023"

每个条目由一行空格(换行符)分隔。

所以我有这些变量(类型,调用号,作者,标题....),并需要阅读此文本并确定将它们设置为什么值。 例如,当我读取“callnumber = 1”行时,我需要将该变量设置为1。

这就是我到目前为止所拥有的。 我一次读一行,所以type = "book" ,然后我将该行拆分为一个字符串数组,分隔符为“,所以数组将包含type =book 。现在我的问题来了从那里走得更远。我想我可以循环遍历数组中的每个字符串,逐个字符,直到我点击空白。所以我会有type ,但我还没有任何数据存储类型,并抓住会给我book (忽略=和空格),但我怎样才能将书归入类型?

总之,我正在寻找一种逐行解析文本文件的方法,并根据我找到的单词分配变量值。

谢谢。

忽略当前路由,为什么不使用Properties.load(InputStream inputStream)

Properties properties = new Properties();
properties.load(new FileInputStream("filename"));

string type = properties.getProperty("type");
System.out.println(type);

我同意如果您的要求允许,您应该采取属性路线。 下一个最佳选择是通过正则表达式单独处理每一行。

 String type = "default";
 int callnumber = 0;


 String line = "type = \"book\"";
    // String line = "callnumber = \"1\"";
 Pattern linePattern = Pattern.compile("(\\w*) = \"(.*)\"");

 Matcher matcher = linePattern.matcher(line);
 if ( !matcher.matches() ) {
     System.err.println("Bad line");
 }

 String name = matcher.group(1);
 String value = matcher.group(2);

 if ( "type".equals(name) ) {
     type = value;
 } else if ( "callnumber".equals(name) ) {
     callnumber = Integer.parseInt(value);
 } //...

在您的情况下,您可能希望将其集成到从文件中读取的while循环中,并将line替换为刚从文件中读取的行。

要添加到Aaron的解决方案:

Properties.load(new FileInputStream("<fileName>"));

将加载属性并获取任何特定属性,

用例如,

Properties.getProperty("type") 

会给你一个字符串“书”。

为变量赋值可能已经在其他地方更干净地完成了。 但是,如果要对字符串进行“标记化”,请使用字符串标记生成器。

新学校将使用String类的split方法。

token[] = line.split("\s++")

http://download.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String

以下是旧学校的方式:

http://download.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html

While(String line = someInput.readLine())

StringTokenizer st = new StringTokenizer(line)
while(st.hasMoreTokens)
{
  String token = st.nextToken()
  //branch on token command, skip token '=', and assign on values
}

文本文件中变量的顺序是否始终相同?

我猜你不会问这是不是这样。

为什么不做一个方法:

void assignVariableByName(String name, <type> value) {
    if(name.contains("type"))
        type = value;
    else if(name.contains("callnumber"))
        callnumber = value; 
}

然后使用 - >

你有分裂的字符串数组......然后你打电话

assignVariableByName(parsedLine[0],parsedLine[1]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM