簡體   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