Как отсканировать файл и заменить определенные фразы? - PullRequest
0 голосов
/ 05 января 2011

Пожалуйста, мне нужна ваша помощь по следующей проблеме:

Это пример кода, настроенный исключительно для разъяснения моего вопроса:

    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();

Входной файл (пример.txt) выглядит следующим образом: Джеймс> Гектор> AUS> 25

Цель - это просто сканирование и замена «Гектора» на «Андерсон».Проблема в том, что имя «Гектор» неизвестно;известно только его местоположение (после первого "> ").

Примечание. Я могу изменить формат входного файла, если это облегчит задачу.Например, я могу изменить формат на что-то вроде:

Имя: Джеймс
Фамилия: Гектор
Страна: AUS
Возраст: 25

* Там, где программа сейчас отсканирует ключевое слово «LastName:» и заменит все, что за ним, на «Anderson».

Заранее благодарим за помощь!

Любые предложения приветствуются.

Ответы [ 3 ]

3 голосов
/ 05 января 2011

Сохраняйте формат, он выглядит как стандартный файл 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);
}

Обратите внимание, что фактическая работа (ввод-вывод файла, изменение имен) выполняется в разных методах и классах. Это сохраняет основной алгоритм внутри метода замены доступным для чтения.

2 голосов
/ 05 января 2011

Я бы предложил использовать регулярное выражение для замены совпадения между первым и вторым ">".Признаюсь, я не эксперт по Java и не эксперт по регулярным выражениям, поэтому я не могу сразу предоставить «коды».

Ваш вопрос предполагает, что вы можете структурировать исходный файл по своему желанию - такпочему бы не сделать это документ XML?В этом случае, конечно, вы бы не занимались разбором текста.

1 голос
/ 05 января 2011

Попробуйте следующее ...

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();
...