簡體   English   中英

使用 Java 在文本文件中查找和替換單詞

[英]Find and replace words in a text file using Java

我正在嘗試使用 Java 在文本文件中查找和替換某些單詞。 我的代碼在一定程度上有效,但是我得到的輸出是錯誤的。 我需要用用戶輸入替換文本文件中一行中的多個單詞。 但是,當我運行我的代碼時,該行為我試圖替換的每個單詞復制一次。

例如,如果我想替換以下 3 個單詞:

python ycsb phase db -s -P /home/james/YCSB/workloads/workloada -p 
db.url=db://IP:port -p db.database=name

我最終得到了該行的 3 個副本,每個副本都替換了一個不同的單詞。 而不是 1 行替換了所有 3 個必需的單詞。 下面提供了代碼,提前致謝。

public static void main(String[] args) {

    System.out.print("Phase: ");
    Scanner sp = new Scanner(System.in);
    String p = sp.nextLine();
    
    System.out.print("Database: ");
    Scanner sd = new Scanner(System.in);
    String d = sd.nextLine();
    
    System.out.print("IP address: ");
    Scanner sip = new Scanner(System.in);
    int ip = sip.nextInt();
     
    try {
        File file = new File("C://users//James//Desktop//newcommand.txt");
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line = "", oldtext = "";
        while((line = reader.readLine()) != null) {
            oldtext += line + "\r\n";
        }
        reader.close();
       
        String phase  = oldtext.replaceAll("phase", "" + p);
        String database = oldtext.replaceAll("db", "" + d);
        String ips = oldtext.replaceAll("IP", "" + ip);
        
        FileWriter writer = new FileWriter("C://users//James//Desktop//newcommand.txt");
        writer.write(phase + ips + database);
        writer.close();
    } catch (IOException e) {
        // handle e
    }
}

如果我了解情況,也許問題在於您正在替換相同的字符串,並存儲在不同的變量中,

試試看:

  public static void main(String[] args) {
        System.out.print("Phase: ");
        Scanner sp = new Scanner(System.in);
        String p;
        p = sp.nextLine();

        System.out.print("Database: ");
        Scanner sd = new Scanner(System.in);
        String d;
        d = sd.nextLine();

        System.out.print("IP address: ");
        Scanner sip = new Scanner(System.in);
        int ip = sip.nextInt();

        {
         try
             {
             File file = new File("C://users//James//Desktop//newcommand.txt");
             BufferedReader reader = new BufferedReader(new FileReader(file));
             String line = "", oldtext = "";
             while((line = reader.readLine()) != null)
                 {
                 oldtext += line + "\r\n";
             }
             reader.close();

             String replacedtext  = oldtext.replaceAll("phase", "" + p);
             replacedtext = replacedtext.replaceAll("db", "" + d);
             replacedtext = replacedtext.replaceAll("IP", "" + ip);

             FileWriter writer = new FileWriter("C://users//James//Desktop//newcommand.txt");
             writer.write(replacedtext);


             writer.close();

         }
         catch (IOException ioe)
             {
             ioe.printStackTrace();
         }
     }

現有答案的更好版本:

public static void main(String[] args)
{
    Scanner sp = new Scanner(System.in);
    System.out.print("Phase: ");
    String pstr = s.nextLine();
    System.out.print("Database: ");
    String dstr = s.nextLine();
    System.out.print("IP address: ");
    String ipstr = String.valueOf(s.nextInt());

讀取輸入后,我們可以使用兩種有效的方法從文件中讀取並寫回。 首先,我建議寫入一個臨時文件(這也是sed替換文件中文本的方式)。 這種方法的一個優點是最后一步可能是一個原子操作。

    File f = new File("C://users//James//Desktop//newcommand.txt");
    File ftmp = new File("C://users//James//Desktop//~tmp.newcommand.txt", ".txt");
    try
    {
        BufferedReader br = new BufferedReader(new FileReader(f));
        BufferedWriter bw = new BufferedWriter(new FileWriter(ftmp));
        String ln;
        while((ln = br.readLine()) != null)
        {
            bw.write(ln
                .replace("phase", pstr)
                .replace("db", dstr)
                .replace("IP", ipstr)
            );
            bw.newLine();
        }
        br.close();
        bw.close();
        Files.move(ftmp.toPath(), f.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

或者,如果您真的不想有一個臨時文件,從而將所有內容都保存在 RAM 中,請使用以下代碼:

    File f = new File("C://users//James//Desktop//newcommand.txt");
    try
    {
        String ENDL = System.getProperty("line.separator");

        StringBuilder sb = new StringBuilder();

        BufferedReader br = new BufferedReader(new FileReader(f));
        String ln;
        while((ln = br.readLine()) != null)
        {
            sb.append(ln
                .replace("phase", pstr)
                .replace("db", dstr)
                .replace("IP", ipstr)
            ).append(ENDL);
        }
        br.close();

        BufferedWriter bw = new BufferedWriter(new FileWriter(f));
        bw.write(sb.toString());
        bw.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

不要忘記右括號;)

}

請注意 - 與其他答案相反 - 我使用.replace而不是.replaceAll 唯一的區別是后者將第一個參數解釋為正則表達式而不是文字字符串。 兩者都替換所有出現的,在這種情況下不需要正則表達式,並且可能只會由於特殊字符而導致不需要的行為。

盡管我沒有寫下任何東西所以我沒有測試它,但我認為問題在這部分代碼中很明顯:

     String phase  = oldtext.replaceAll("phase", "" + p);
     String database = oldtext.replaceAll("db", "" + d);
     String ips = oldtext.replaceAll("IP", "" + ip);

     FileWriter writer = new FileWriter("C://users//James//Desktop//newcommand.txt");
     writer.write(phase + ips + database);

您正在創建 3 個新字符串。 第一個字符串替換了 phase,第二個替換了 db,第三個替換了 IP。 這顯然不是你想要的。 你應該做這樣的事情:

     String phase  = oldtext.replaceAll("phase", "" + p);
     String database = phase.replaceAll("db", "" + d);
     String ips = database.replaceAll("IP", "" + ip);

     FileWriter writer = new FileWriter("C://users//James//Desktop//newcommand.txt");
     writer.write(ips);

編輯:哎呀,太晚了^_^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM