我正在制作一个Java应用程序,它逐行读取.ttl
文件并创建一个graphml
文件来表示本体。
我在弄清楚如何枚举某个部分时遇到了一些麻烦。
我正在使用BufferedReader
读取每一行。
例如,我有以下内容:
else if (line.contains("owl:oneOf")){
// insert code to enumerate list contained in ( )
}
这就是oneOf的.ttl外观:
owl:oneOf (GUIFlow:ExactlyOne
GUIFlow:OneOrMore
GUIFlow:ZeroOrMore
GUIFlow:ZeroOrOne )
我需要将这4个对象作为一个列表返回,以用作本体的图形表示的一部分。
最佳答案
显然,您有某种遍历文件的循环。这里有一些想法:
1)在循环中引入一个“状态”,以便在读取下一行时会知道它实际上在oneOf列表中。存储列表的动态数组可以用作状态。您在遇到(
时创建列表,然后在遇到)
时将列表发送到需要的地方,然后在此之后将其删除。麻烦的是,根据源格式,您必须先创建列表,然后再向其中添加值,然后在添加值后处理并删除列表,因为(
和)
与实际值在同一行。
Vector<String> oneOfList = null;
while(reader.ready()){
String line=reader.readLine();
if(line.contains("foo")){
...
}
else if (line.contains("owl:oneOf")){
oneOfList = new Vector<String>();
}
if(oneOfList!=null){
String str = line.trim();
int a = str.indexOf("("); // -1 if not found, OK
int b = str.indexOf(")");
if(b<0) b=str.length();
oneOfList.add(str.substring(a+1,b).trim());
}
if (line.contains(")")){
storeOneOf(oneOfList);
oneOfList=null;
}
}
2)遇到oneOf标头时,创建另一个小循环以读取其值。可能的缺点是,您最终会在文件上循环两个循环并两次调用
reader.readLine
,这可能会使事情复杂化,也可能不会使事情复杂化。while(reader.ready()){
String line=reader.readLine();
if(line.contains("foo")){
...
}
else if (line.contains("owl:oneOf")){
Vector<String> oneOfList = new Vector<String>();
while(true){
String str = line.trim();
int a = str.indexOf("("); // -1 if not found, OK
int b = str.indexOf(")");
int c = (b>=0) ? b : str.length();
oneOfList.add(str.substring(a+1,c).trim());
if(b>=0) break;
line=reader.readLine();
}
storeOneOf(oneOfList);
}
}
3)上述算法依赖于标头,
(
和第一个值在同一行等事实。如果源文件的格式略有不同,则解析将失败。更为灵活的方法是使用StreamTokenizer
,它会自动忽略空格并将文本分为单词和独立符号:StreamTokenizer tokzr=new StreamTokenizer(reader);
tokzr.wordChars(':',':');
while( tokzr.nextToken() != tokzr.TT_EOF ){
if( tokzr.ttype==tokzr.TT_WORD && tokzr.sval.equals("foo") ){
...
}
else if ( tokzr.ttype==tokzr.TT_WORD && tokzr.sval.equals("owl:oneOf") ){
if(tokzr.nextToken()!='(') throw new Exception("\"(\" expected");
Vector<String> oneOfList = new Vector<String>();
while(tokzr.nextToken() == tokzr.TT_WORD){
oneOfList.add(tokzr.sval);
}
storeOneOf(oneOfList);
if(tokzr.ttype!=')') throw new Exception("\")\" expected");
}
}