如何从输入的文本中删除文本文件中的整行

时间:2018-12-06 03:41:27

标签: java file

我试图在输入关联名称后删除整行,但是不起作用。它一直显示错误,无法删除原始输入文件,您能帮我吗?

String inputFileName = "Association Record.txt";
String outputFileName = "Association Report.txt";
String lineToRemove = JOptionPane.showInputDialog("Enter Association Name to Delete the Record");

try{
          File inputFile = new File(inputFileName);
          File outputFile = new File(outputFileName);

          try{
                  BufferedReader r1= new BufferedReader(new FileReader(inputFile));
                  BufferedWriter w1 = new BufferedWriter(new FileWriter(outputFile));   
                  String line = null;
                                while ((line = r1.readLine()) != null) {
                                        if (!line.equals(lineToRemove)) {
                                            w1.write(line);
                                            w1.newLine();
                                        }
                                }//end while
           }
                    catch (IOException ex) {ex.printStackTrace();}  
                    if (inputFile.delete()) {
                            if (!outputFile.renameTo(inputFile))
                                            throw new IOException("Could not rename " + outputFileName + " to " + inputFileName);
                            }
                    else {throw new IOException("Could not delete original input file " + inputFileName);}      
                }
                catch (Exception e){System.out.println(e.getMessage());}
}

文件中一行的示例: 计算机,pc,2018年8月7日,布兰登

* COMPUTER是关联名称

1 个答案:

答案 0 :(得分:0)

如果单词 COMPUTER 是关联词,而您要删除的行以 COMPUTER 开头,则字符串#equals()方法不是您的 IF 语句中使用的方法。您可能要使用String#startsWith()方法,例如:

boolean ignoreLetterCase = true;  // ignore Letter Case by default
String lineToRemove = "computer";
String criteria = ignoreLetterCase ? lineToRemove.toLowerCase() : lineToRemove;

while ((line = r1.readLine()) != null) {
    String procString = ignoreLetterCase ? line.toLowerCase : line;
    if (!procString.startsWith(criteria)) {
        w1.write(line);
        w1.newLine();
    }
}

文件数据行COMPUTER,pc,08/07/2018,brandon将不会写入目标文件。

但是,如果您想忽略包含关联词计算机 任何地方 的文件行数据行,那么您将需要利用String#contains()方法,例如:

boolean ignoreLetterCase = true;  // ignore Letter Case by default
String lineToRemove = "computer";
String criteria = ignoreLetterCase ? lineToRemove.toLowerCase() : lineToRemove;

while ((line = r1.readLine()) != null) {
    String procString = ignoreLetterCase ? line.toLowerCase : line;
    if (!procString.contains(criteria)) {
        w1.write(line);
        w1.newLine();
    }
}

文件数据行COMPUTER,pc,08/07/2018,brandon写入目标文件。但是,包含PRINTER,pc-computer,09/27/2018,joseph的文件数据行也将写入目标文件,因为原始文件行中包含单词 computer

我非常怀疑您的数据文件是否会出现这种情况,但是如果检索到的文件数据行仅 包含关联词(COMPUTER),那么您绝对想使用{{ 3}}或String#equals()方法。

如果您想忽略原始文件行,其中仅在任何检索到的文件数据行的特定数据列中关联单词,那么您希望将每一行解析(分割)为一个列数据数组,然后进行比较所需的列(数组元素索引)。例如:

// Delete all file lines where the NAME column equals 
// the name 'brandon' or 'Brandon' or 'BRANDON'.

boolean ignoreLetterCase = true;  // ignore Letter Case by default  
int deleteIfInColumn = 3;
String nameToDelete = "Brandon"; 
String criteria = ignoreLetterCase ? nameToDelete .toLowerCase() : nameToDelete;

while ((line = r1.readLine()) != null) {
    String procString = ignoreLetterCase ? line.toLowerCase : line;
    String[] columnData = procString.split(",");
    if (columnData[deleteIfInColumn].equals(criteria)) {
        continue;  // Skip to next file line
    }
    w1.write(line);
    w1.newLine();
}