Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 逐行读取文件并搜索文本_Java - Fatal编程技术网

Java 逐行读取文件并搜索文本

Java 逐行读取文件并搜索文本,java,Java,我是Java编程新手,目前正在尝试读取文本文件“data.txt” 文本文件包含的数据如下所示: 你好,世界,苹果,气球,积极的 鲨鱼,老虎,水果,阴性 我想逐行读取文件并搜索一个单词,直到第一个分隔符“,”。 如果找到结果,我将通过将该行写入另一个名为output.txt的.txt文件来返回整行 例如,如果我在程序运行后搜索单词“Hello”,output.txt将包含helloworld、apple、balloon和POSITIVE 我曾尝试使用缓冲读取器,但我不确定如何使其工作 以下是我的

我是Java编程新手,目前正在尝试读取文本文件“data.txt”

文本文件包含的数据如下所示:

你好,世界,苹果,气球,积极的

鲨鱼,老虎,水果,阴性

我想逐行读取文件并搜索一个单词,直到第一个分隔符“,”。 如果找到结果,我将通过将该行写入另一个名为output.txt的.txt文件来返回整行

例如,如果我在程序运行后搜索单词“Hello”,output.txt将包含helloworld、apple、balloon和POSITIVE

我曾尝试使用缓冲读取器,但我不确定如何使其工作

以下是我的缓冲读取器初始化代码:

    BufferedReader in = new BufferedReader(new 
    FileReader("D:\\Downloads\\dataAnalysis1.txt"));  
  String line;
  while((line = in.readLine()) != null)
  {
      System.out.println(line);
      // extract by lines and write to file 

  }
  in.close();

您可以使用下面的程序来实现这一点。程序的第一部分(使用
BufferedReader
读取行)是正确的

我在这里使用了Java的try with resources特性(在Java7中介绍)。它负责在读/写后关闭文件

我已经使用
String.contains()
API来检查搜索的单词是否存在于一行中。然后我使用了
BufferedWriter
将匹配行写入输出文件

import java.io.*;

public class FindWord
{
  public static void main(String[] args)
  {
    String searchWord = "Hello";

    try (BufferedReader in = new BufferedReader(
            new FileReader("D:\\Downloads\\dataAnalysis1.txt"));
         BufferedWriter out = new BufferedWriter(
             new FileWriter("D:\\Downloads\\output.txt")))
    {
      String line;
      while ((line = in.readLine()) != null)
      {
        System.out.println(line);

        // extract by lines and write to file
        String firstColumn =  line.split(",")[0];
        if (firstColumn.contains(searchWord))
        {
          out.write(line);
          out.newLine();
        }
      }
    }
    catch (IOException ex)
    {
      ex.printStackTrace();
    }
  }
}

如果您使用的是Java 8或更高版本,则可以使用NIO来完成此操作。NIO是一个现代IO框架,它取代了旧的
文件
BufferedReader
。。。在许多情况下。它围绕类
文件
路径
路径

我们将使用
文件#行
()流式读取文件的所有行,按
拆分一行,并用搜索针筛选第一列,然后将它们收集到列表中。最后,我们将使用
Files#write
()将列表中的所有剩余行写入您的文件

Path source=Path.get(“D:\\Downloads\\dataAnalysis1.txt”);
Path destination=Path.get(“D:\\Downloads\\output.txt”);
String needle=“你好”;
试一试{
列表行=文件。行(源)
.filter(行->行.split(“,”[0]。包含(指针))
.collect(Collectors.toList());
文件。写入(目标、行);
}捕获(IOE异常){
//如何处理这个问题
e、 printStackTrace();
}

您的问题到底是什么,您发布的代码看起来不错,但我看不到有人试图实现您在问题中描述的逻辑。请注意,Java的现代IO框架NIO可能会在这里派上用场<代码>文件.lines(…).filter(…).collect(Collectors.toList())然后只需
文件。写入(…)
。请注意,OP只想在第一列中搜索(直到第一个逗号)。所以你需要检查
line.split(“,”[0]
中的
contains(searchWord)
@Zabuza,我理解为OP想要搜索整行。我会在问题中问这个问题。@Zabuza,我认为你是对的。现在,当我再次阅读这个问题时,我意识到OP只想搜索第一列。我将相应地编辑我的答案。谢谢
Path source = Paths.get("D:\\Downloads\\dataAnalysis1.txt");
Path destination = Paths.get("D:\\Downloads\\output.txt");

String needle = "Hello";

try {
    List<String> lines = Files.lines(source)
        .filter(line -> line.split(",")[0].contains(needle))
        .collect(Collectors.toList());
    Files.write(destination, lines);
} catch (IOException e) {
    // TODO Handle the problem
    e.printStackTrace();
}