【问题标题】:Compare a text file line by line with a dynamic variable逐行比较文本文件与动态变量
【发布时间】:2013-06-16 03:04:40
【问题描述】:

我有一个文本文件sample.txt,其中包含以下几行

sample1.txt
test.ppt
example.doc
content.pdf

我有一个名为field 的动态变量(例如phpcookbook.pdf,sample1.txt)它应该与sample.txt 文件中的每一行进行比较,如果文本文件不包含field 它应该附加到@ 987654328@。我尝试了以下代码,但它不起作用:

File insert=new File(sample.txt);
BufferedReader br = new BufferedReader(new FileReader(insert));
String strLine;

while ((strLine = br.readLine()) != null) {
    if(!strLine.equals(field)) {
        FileWriter fw = new FileWriter(insert, true);
        BufferedWriter bw = new BufferedWriter(fw);
        bw.append(field);
        bw.close();
    }
}

我应该得到以下输出

sample1.txt
test.ppt
example.doc
content.pdf
phpcookbook.pdf

如何逐行比较文本文件和动态变量?

【问题讨论】:

  • “但它不起作用”是什么意思?
  • 如果我的字段值为 sample1.txt 它附加到我的文本文件中,它不比较行,它应该消除重复的行。
  • 如果你想消除重复的行,那么为什么不把每一行都放到一个HashSet<String>中呢?
  • 你看过我的例子了吗?

标签: java string file search text


【解决方案1】:

如果我正确理解了这个问题,这就是你需要的:

File insert = new File("sample.txt");
BufferedReader br = new BufferedReader(new FileReader(insert));
String strLine;
Boolean hasLine = false;

while ((strLine = br.readLine()) != null) {
    if(strLine.equals(field)) {
        hasLine = true;
        break;
    }
}

br.close();

if (!hasLine) {
    FileWriter fw = new FileWriter(insert, true);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.append(field + "\n"); // assumes field does not already have a newline
    bw.flush();
    bw.close();
}

注意break;。这将停止 while 循环,因为您已经找到了您要查找的内容的答案。

Your original code was doing:
for every line:
  Do I equal field?
    Yes: goto next line
    No: append field to file and goto next line

但你想知道field 是否出现在文件中,而不是在每一行中。

【讨论】:

  • 感谢您的回复,它不允许重复值,但除了文件行之外,它不会附加不同的值。
  • @user2353439 定义“它”。 我的代码 不允许重复,但也不附加field?还是你在说别的?
  • @user2353439:我更新了我的代码以包含换行符和刷新语句。这也可能会给您带来问题。
  • @RussellUhl 您的代码运行良好,我认为他指的不是正确的 sample.txt 文件,该文件正在更新。
  • @zerocool:啊啊啊啊。这样就可以了。谢谢,崩溃覆盖
【解决方案2】:

因为您要求 Java,所以没有答案,只是为了说明 Unix shell 工具的强大功能:

v=phpcookbook.pdf
grep $v in.txt
[[ $? -eq 1 ]] && echo $v >> in.txt

【讨论】:

    【解决方案3】:

    你应该使用 Commons IO。

    查看这个工作示例

    package training;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    import org.apache.commons.io.FileUtils;
    
    public class TestFile {
    
        /**
         * @param args
         * @throws IOException
         */
        private static String field = "phpcookbook.pdf";
        private static String fileContent;
    
        public static void main(String[] args) throws IOException {
            boolean found = false;
            File file = new File("test.txt");
            List<String> lines = FileUtils.readLines(file);
            for (String line : lines) {
                if (line.equals(field)) {
                    found = true;
                    break;
    
                }
            }
            if (!found) {
                fileContent = FileUtils.readFileToString(file);
                fileContent += "\n" + field;
            }
            FileUtils.write(file, fileContent);
        }
    }
    

    【讨论】:

      【解决方案4】:

      你应该这样做:

          File insert = new File("sample.txt");
          boolean isStringPresent = false;
          BufferedReader br = new BufferedReader(new FileReader(insert));
          String strLine;
          while ((strLine = br.readLine()) != null) {
              if (strLine.equals(field)) {
                  isStringPresent = true;
              } 
      
          }
          if(!isStringPresent) {
              FileWriter fw = new FileWriter(insert, true);
              BufferedWriter bw = new BufferedWriter(fw);
              bw.append(field);
              bw.close();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多