我无法确定解析给定文本文件的方法。
以下是文件中的条目:
type = "book"
callnumber = "1"
authors = "a"
title = "t"
publisher = "p"
year = "2023"
每个条目由一行空格(换行符)分隔。
所以我有这些变量(类型,调用号,作者,标题....),并且需要阅读此文本并确定将它们设置为的值。例如,当我读取“callnumber = 1”这一行时,我需要将该变量设置为1.
这是我到目前为止所拥有的。我一次读一行,所以type = "book"
例如,然后我将该行拆分为一个字符串数组,分隔符为“,因此数组将包含type =
和{{1 }。
现在我的问题是从那里走得更远。我想我可以循环遍历数组中的每个字符串,逐个字符,直到我点击空白。所以我会book
,但我还没有任何数据存储在类型中,抓取会给我type
(忽略=和空格),但我如何将book归于类型?
总之,我正在寻找一种逐行解析文本文件的方法,并根据我找到的单词分配变量值。
感谢。
答案 0 :(得分:7)
忽略当前路线,为什么不使用Properties.load(InputStream inputStream)
Properties properties = new Properties();
properties.load(new FileInputStream("filename"));
string type = properties.getProperty("type");
System.out.println(type);
book
答案 1 :(得分:1)
我同意如果您的要求允许,您应该采取属性路线。下一个最佳选择是通过正则表达式单独处理每一行。
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
替换为您刚刚从文件中读取的行。
答案 2 :(得分:0)
添加到Aaron的解决方案:
Properties.load(new FileInputStream("<fileName>"));
将加载属性并获取任何特定属性,
使用 例如,
Properties.getProperty("type")
会给你一个字符串“book”。
答案 3 :(得分:0)
为变量赋值可能已经在其他地方更干净地完成了。但是,如果要对字符串进行“标记化”,请使用字符串标记生成器。
新学校将使用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
}
答案 4 :(得分:0)
文本文件中变量的顺序是否始终相同?
我猜你不会问这是不是这样。
为什么不做一个方法:
void assignVariableByName(String name, <type> value) {
if(name.contains("type"))
type = value;
else if(name.contains("callnumber"))
callnumber = value;
}
然后使用 - &gt;
你有分裂的字符串数组......你打电话给
assignVariableByName(parsedLine[0],parsedLine[1]);