如何扫描文件并替换某些短语?

时间:2011-01-05 08:15:37

标签: java file-io text-processing

请帮助我解决以下问题:

这是一个仅为澄清我的问题而定制的示例代码:

    File accounts_File = new File("Sample_Folder\\example.txt");
    FileInputStream fis = null;
    BufferedInputStream bis = null;
    DataInputStream dis = null;

    String str_String = ""; //For storing the input from the file.

    fis = new FileInputStream(accounts_File);
    bis = new BufferedInputStream(fis);
    dis = new DataInputStream(bis);

    while (dis.available() != 0)
    {
        str_String = dis.readLine(); //Reading the line from the file.

        StringTokenizer st = new StringTokenizer(str_String); 

        while (st.hasMoreTokens())
        {
               //I need some help here
        }

    }

    fis.close();
    bis.close();
    dis.close();

输入文件(example.txt)如下所示:James> Hector> AUS> 25

目标只是扫描并用“安德森”取代“赫克托耳”。问题是名称“Hector”未知;唯一知道的是它的位置(在第一个“> ”之后)。

注意:如果更容易,我可以更改输入文件的格式。作为一个例子,我可以将格式更改为:

名字:詹姆斯
姓氏:赫克托耳 国家/地区:AUS
年龄: 25

*程序现在将扫描关键字“LastName:”并用“Anderson”替换其后的所有内容。

提前感谢您的帮助!

非常感谢任何建议。

3 个答案:

答案 0 :(得分:3)

保持格式,它看起来像标准的csv文件(逗号分隔值,“逗号”是“>”字符),csv文件易于读​​写!

由于您无法替换“磁盘上”的文件内容,因此您必须将文件读入内存,并在内存中重写所需的更改并将其重写到磁盘。

该文件的简单模型是一个二维字符串数组,该文件的每一行都是一行,每个值都是一列,它产生4列。现在,姓氏(您要替换的字符串)始终位于matrix[lineNumber][1]。更改每行和第二列的值。

对于生产代码,我会编写一个代表记录的类。然后,您的代码可能如下所示:

public void replace(File inputFile, String newName) {
  List<Person> persons = new ArrayList<Person>();

  // read the file
  List<String> lines = readFile(inputFile);

  // create a person instance for each line
  for (String line:lines) {
    String[] values = line.split(">");
    persons.add(new Person(values));
  }

  // change the last name
  for (Person person:persons) {
    person.setLastName(newName);
  }

  // store all persons to file
  writeFile(inputFile, persons);
}

请注意,实际工作(文件IO,更改名称)是在不同的方法和类中完成的。这使得替换方法中的主算法可以读取。

答案 1 :(得分:2)

我建议使用正则表达式替换第一个和第二个">"之间的匹配。我承认我既不是Java专家,也不是正则表达专家,所以我不能马上提供“代码”。

您的问题表明您可以根据需要构建源文件 - 那么为什么不将其作为Xml文档呢?我当然不会做文本解析。

答案 2 :(得分:1)

尝试以下方法......

File accounts_File = new File("Sample_Folder\\example.txt");
FileInputStream fis = null;
BufferedInputStream bis = null;
DataInputStream dis = null;

String str_String = ""; //For storing the input from the file.

fis = new FileInputStream(accounts_File);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);

while (dis.available() != 0)
{
    str_String = dis.readLine(); //Reading the line from the file.

    final int firstIndex = str_String.indexOf('>');

        if(firstIndex != -1 && firstIndex != str_String.length() - 1) {
            final int secondIndex = str_String.indexOf('>', firstIndex + 1);

            if(secondIndex != -1) {
               final StringBuilder builder = new StringBuilder();
               builder.append(str_String.substring(0, firstIndex + 1));
               builder.append("Anderson");
               builder.append(str_String.substring(secondIndex));
               System.out.println(builder.toString()); 
            }
        }

}

dis.close();