【问题标题】:Replace a String token if found in the set of Strings如果在字符串集合中找到,则替换字符串标记
【发布时间】:2014-09-17 19:31:23
【问题描述】:

下面的代码应该从文件 MainFile.txt 中读取每一行,检查每一行是否包含来自 Set 的标记。如果确实包含,请将其替换为“xxx”字符串。然后使用 BufferedWriter 写入一个新文件。 输出的 ConvFile.txt 与输入完全相同。

MainFile.txt:

car, 18, train, 19, bus,
laptop, 20, tablet, 21, computer,
swim, 22, bike, 23, run,



public class ReplaceWords {

Set<String> wordToReplace;

public ReplaceWords(){
    this.wordToReplace = new HashSet<>();
    this.wordToReplace.add("18");
    this.wordToReplace.add("19");
    this.wordToReplace.add("20");
    this.wordToReplace.add("21");
    this.wordToReplace.add("22");
    this.wordToReplace.add("23");
}

public void redactFile(){
    String inPathname = "E:\\SkyDrive\\Java\\Coding\\FileChgOne\\MainFile.txt";
    String outPathname = "E:\\SkyDrive\\Java\\Coding\\FileChgOne\\ConvFile.txt";
    File inFile = new File(inPathname);
    File outFile = new File(outPathname);

    Scanner bufferedScanner = null;
    BufferedWriter bufferedFileWriter = null;



    try {
        Scanner lineScanner;
        String currentLine;

        bufferedScanner = new Scanner(new BufferedReader(new FileReader(inFile)));
        bufferedFileWriter = new BufferedWriter(new FileWriter(outFile));

        while(bufferedScanner.hasNextLine()){
            currentLine = bufferedScanner.nextLine();
            lineScanner = new Scanner(currentLine);
            lineScanner.useDelimiter(",");

            while(lineScanner.hasNext()){
                String currentToken = lineScanner.next();
                if (this.wordToReplace.contains(currentToken)){
                    bufferedFileWriter.write("xxx, ");
                }
                else {
                    bufferedFileWriter.write(currentToken + ", ");
                }

            } 
            bufferedFileWriter.newLine();
        }

    }
    catch (Exception en){
        System.out.println("error: " + en);
    }

    finally {
        try {
            bufferedScanner.close();
            bufferedFileWriter.close();
        }
        catch (Exception en) {
            System.out.println(en);
        }
    } 
} 
}

输出ConvFile.txt:

car,  18,  train,  19,  bus, 
laptop,  20,  tablet,  21,  computer, 
swim,  22,  bike,  23,  run, 

【问题讨论】:

  • 为什么代码不替换:car, 18, train, 19, bus, with car, xxx, train, xxx, bus, etc...

标签: java set java.util.scanner


【解决方案1】:

令牌需要被修剪,即当扫描仪读取令牌时,逗号后的空格应该被删除:

while(lineScanner.hasNext()){
    String currentToken = lineScanner.next();
    currentToken = currentToken.trim();  // line to add
    if (this.wordToReplace.contains(currentToken)){
        bufferedFileWriter.write("xxx, ");
    }
    else {
        bufferedFileWriter.write(currentToken + ", ");
    }

}

您也可以按照 Marko Topolnik 在 cmets 中的建议更新 Scanner 的分隔符模式。

lineScanner = new Scanner(currentLine);
lineScanner.useDelimiter("\\s*,\\s*");

\\s* 表示零个或多个空白字符。

【讨论】:

  • 我更喜欢一个吞噬空格的正则表达式来修补无效的令牌。
  • 这也是一个不错的方法。我将其添加到答案中。谢谢。
  • 其实我的意思是new Scanner(Pattern.compile("\\s*,\\s*") :) 这才是正道,而且不加一行代码。
  • 你的意思是在分隔符模式中?
  • 是的,当然。这是最明显的方法。为了使他的简单示例正常工作,只需在他的代码中添加一个空格就足够了,但是正则表达式更加健壮。
猜你喜欢
  • 2013-02-18
  • 2019-12-09
  • 2022-11-12
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多