![](/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.