gpt4 book ai didi

java - 使用默认方法解析字符串

转载 作者:行者123 更新时间:2023-12-01 14:28:55 25 4
gpt4 key购买 nike

我使用以下代码从 .odt 文件中提取文本:

public class OpenOfficeParser {

StringBuffer TextBuffer;

public OpenOfficeParser() {}

//Process text elements recursively
public void processElement(Object o) {

if (o instanceof Element) {

Element e = (Element) o;
String elementName = e.getQualifiedName();

if (elementName.startsWith("text")) {

if (elementName.equals("text:tab")) // add tab for text:tab
TextBuffer.append("\\t");
else if (elementName.equals("text:s")) // add space for text:s
TextBuffer.append(" ");
else {
List children = e.getContent();
Iterator iterator = children.iterator();

while (iterator.hasNext()) {

Object child = iterator.next();
//If Child is a Text Node, then append the text
if (child instanceof Text) {
Text t = (Text) child;
TextBuffer.append(t.getValue());
}
else
processElement(child); // Recursively process the child element
}
}
if (elementName.equals("text:p"))
TextBuffer.append("\\n");
}
else {
List non_text_list = e.getContent();
Iterator it = non_text_list.iterator();
while (it.hasNext()) {
Object non_text_child = it.next();
processElement(non_text_child);
}
}
}
}

public String getText(String fileName) throws Exception {
TextBuffer = new StringBuffer();

//Unzip the openOffice Document
ZipFile zipFile = new ZipFile(fileName);
Enumeration entries = zipFile.entries();
ZipEntry entry;

while(entries.hasMoreElements()) {
entry = (ZipEntry) entries.nextElement();

if (entry.getName().equals("content.xml")) {

TextBuffer = new StringBuffer();
SAXBuilder sax = new SAXBuilder();
Document doc = sax.build(zipFile.getInputStream(entry));
Element rootElement = doc.getRootElement();
processElement(rootElement);
break;
}
}


System.out.println("The text extracted from the OpenOffice document = " + TextBuffer.toString());
return TextBuffer.toString();
}
}

现在,当使用 getText() 方法返回的字符串时,出现问题。我运行该程序并从 .odt 中提取了一些文本,这是一段提取的文本:

(no hi virtual x oy)\n\n house cat \n open it \n\n trying to....

所以我尝试了这个

System.out.println( TextBuffer.toString().split("\\n")); 

我收到的输出是:

substring: [Ljava.lang.String;@505bb829

我也尝试过这个:

System.out.println( TextBuffer.toString().trim() );

但打印的字符串没有变化。

为什么会出现这种行为?我该怎么做才能正确解析该字符串?而且,如果我想将每个以“\n\n”结尾的子字符串添加到 array[i] 中,我该怎么办?

编辑:抱歉,我在示例中犯了一个错误,因为我忘记了 split() 返回一个数组。问题是它返回一个只有一行的数组,所以我要问的是为什么要这样做:

System.out.println(Arrays.toString(TextBuffer.toString().split("\\n")));

对我在示例中编写的字符串没有影响。

还有这个:

    System.out.println( TextBuffer.toString().trim() );

对原始字符串没有影响,它只是打印原始字符串。

我想举例说明为什么我要使用split(),这是因为我想解析该字符串并将每个以“\n”结尾的子字符串放入数组行中,这是一个例子:

我的原始字符串:

    (no hi virtual x oy)\n\n house cat \n open it \n\n trying to....

解析后,我将打印数组的每一行,输出应该是:

line 1: (no hi virtual x oy)\
line 2: house cat
line 3: open it
line 4: trying to
and so on.....

最佳答案

如果我正确理解你的问题,我会做这样的事情

String str = "(no hi virtual x oy)\n\n house cat \n open it \n\n trying to....";

List<String> al = new ArrayList<String>(Arrays.asList(str.toString()
.split("\\n")));

al.removeAll(Arrays.asList("", null)); // remove empty or null string

for (int i = 0; i< al.size(); i++) {
System.out.println("Line " + i + " : " + al.get(i).trim());
}

输出

Line 0 : (no hi virtual x oy)
Line 1 : house cat
Line 2 : open it
Line 3 : trying to....

关于java - 使用默认方法解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com