![](/img/trans.png)
[英]ReloadableResourceBundleMessageSource: order of message files matters?
[英]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.