在java中从大型文件中提取特定文本

在java中从大型文件中提取特定文本,java,Java,我有这样的模式包含文本的文件 Type:status Origin:some text Text:some text URL:some url Time:time 你可以用 String[] pieces = str.split(":"); 这将为您提供一个字符串数组,这些字符串按您在括号中的位置进行分割。然后,如果您知道模式,您可以通过循环遍历它来获得每个片段。例如:如果您知道该类型位于[0],并且每个序列中有六个元素,则可以说下一个类型将位于[6],依此类推。您应该检查索引。属于i和j。如

我有这样的模式包含文本的文件

Type:status Origin:some text Text:some text URL:some url Time:time 你可以用

String[] pieces = str.split(":");

这将为您提供一个字符串数组,这些字符串按您在括号中的位置进行分割。然后,如果您知道模式,您可以通过循环遍历它来获得每个片段。例如:如果您知道该类型位于[0],并且每个序列中有六个元素,则可以说下一个类型将位于[6],依此类推。

您应该检查索引。属于
i
j
。如果一行错误,它将跳过该行并将错误的行打印到控制台。您可能应该以不同的方式处理它,但请记住,子字符串不应该喜欢-1的索引

 FileReader fr = new FileReader("test.txt");
 BufferedReader br = new BufferedReader(fr);

 String tokenText = "Text:";
 String tokenURL = "URL:";

 FileWriter wr = new FileWriter("new.txt");
 //  char buffer[] = null;
 String s;
 String str="";
 BufferedWriter bw = new BufferedWriter(wr);
 while ((s = br.readLine()) != null) {
     String a;
     str = str + s;

     i = str.indexOf(tokenText);
     j = str.indexOf(tokenURL);

     if (i < 0 && j >= 0){
        // pad with the token string
        a = s.substring(j + tokenURL.length);
     } else if(i >= 0) {
        // pad with the token string
        a = s.substring(i + tokenText.length);
     } else {
        System.out.printl("Unparsed line:");
        System.out.printl(s);
     }

     bw.write(a);
 }
 br.close();
 bw.close();
FileReader fr=newfilereader(“test.txt”);
BufferedReader br=新的BufferedReader(fr);
字符串tokenText=“Text:”;
字符串tokenURL=“URL:”;
FileWriter wr=新的FileWriter(“new.txt”);
//字符缓冲区[]=null;
字符串s;
字符串str=“”;
BufferedWriter bw=新的BufferedWriter(wr);
而((s=br.readLine())!=null){
字符串a;
str=str+s;
i=str.indexOf(标记文本);
j=str.indexOf(tokenURL);
如果(i<0&&j>=0){
//用令牌字符串填充
a=s.substring(j+tokenURL.length);
}如果(i>=0),则为else{
//用令牌字符串填充
a=s.substring(i+tokenText.length);
}否则{
System.out.printl(“未解析行:”);
系统输出打印文件;
}
bw.写(a);
}
br.close();
bw.close();
也就是说,正如jonhchen902在评论中所说,您还可以在while循环之后检查字符串。这实际上取决于您的输入文件,以及您是否希望多次或一次找到“字符串”。

文本:“在第3行中找到,URL:”在第4行中找到,但是如果您的程序没有找到这两个字符串,则会引发异常。 即使有效,你也会一遍又一遍地找到相同的文本。 试着这样做:

FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);

FileWriter wr = new FileWriter("new.txt");
String s;
BufferedWriter bw = new BufferedWriter(wr);
while ((s = br.readLine()) != null) {
    if (s.startsWith("Text:"))
        bw.write(s);
}
br.close();
bw.close();

根据您的示例,
Text:
Url:
位于连续的行上

您的问题是您正在逐行读取文件(
br.readLine()
),因此调用
indexOf()
在大多数情况下都会在
i
j
中返回
-1
(而且您永远找不到这两个字符串,因为它们不在同一行)

正如
substring()
的javadoc所述,使用负开始索引调用该方法将抛出
IndexOutOfBoundsException
。所以你的方法不对

相反,您应该在执行此操作时逐行解析文件,只需测试对
indexOf(“Text:”)
的调用的正索引,然后从返回的索引+5开始对当前行进行子串

未测试:

while ((line = br.readLine()) != null) {
    i = line.indexOf("Text:");
    if (i > 0) {
        String text = line.substring(i);
        bw.write(text + "\n");
    }
}

有什么例外?可能是move
i=str.indexOf(“Text:”);j=str.indexOf(“URL:”);字符串a=str.substring(i,j);bw.写(a)部分退出
while
。我猜您正在搜索的内容并不是每行都存在。您应该检查indexof返回的索引。如果找不到,它将返回
-1
。您还可以显示输入文件的示例并发布实际异常。您到底想从该文件中获取什么????你说的文字是什么意思???它是写在文件中的文本还是冒号后面的数据。在这个版本中,可能不需要累积
str
,因为这里我只分析每一行。
while ((line = br.readLine()) != null) {
    i = line.indexOf("Text:");
    if (i > 0) {
        String text = line.substring(i);
        bw.write(text + "\n");
    }
}