4

I've got a text file called log.txt It's got the following data

1,,Mon May 05 00:05:45 WST 2014,textFiles/a.txt,images/download.jpg
2,,Mon May 05 00:05:45 WST 2014,textFiles/a.txt,images/download.jpg

the numbers before the first comma are indexes that specify each item.

what I want to do is read the file then replace one part of the string(e.g. textFiles/a.txt) in a given line with another value(e.g. something/bob.txt).

this is what i have so far

    File log= new File("log.txt");
                    String search = "1,,Mon May 05 00:05:45 WST 2014,textFiles/a.txt,images/download.jpg;
                    //file reading
                    FileReader fr = new FileReader(log);
                    String s;
                    try (BufferedReader br = new BufferedReader(fr)) {

                        while ((s = br.readLine()) != null) {
                            if (s.equals(search)) {
                                //not sure what to do here
                            }
                        }
                    }
Pindo
  • 1,510
  • 4
  • 16
  • 30
  • if you are open to use perl: http://perlpie.com/ – Jayan May 05 '14 at 06:33
  • If your format for storing strings is the same for all intances, what you can do is :- Search for that particular string, create a string array by using delimiter which is ',' in your case, replace your string at that particular index in that array, and replace back in your text file. This is one way. Not so efficient but may solve your purpose – AppleBud May 05 '14 at 06:37
  • try `s = s.replaceAll("(?<=\\d{4}\\,)(.*)(?=\\,images)", "something/bob.txt");` – Baby May 05 '14 at 06:45

4 Answers4

12

You could create a string of total file content and replace all the occurrence in the string and write to that file again.

You could something like this:

File log= new File("log.txt");
String search = "textFiles/a.txt";
String replace = "replaceText/b.txt";

try{
    FileReader fr = new FileReader(log);
    String s;
    String totalStr = "";
    try (BufferedReader br = new BufferedReader(fr)) {

        while ((s = br.readLine()) != null) {
            totalStr += s;
        }
        totalStr = totalStr.replaceAll(search, replace);
        FileWriter fw = new FileWriter(log);
    fw.write(totalStr);
    fw.close();
    }
}catch(Exception e){
    e.printStackTrace();
}
Sujan Shrestha
  • 419
  • 3
  • 9
3

One approach would be to use String.replaceAll():

File log= new File("log.txt");
String search = "textFiles/a\\.txt";  // <- changed to work with String.replaceAll()
String replacement = "something/bob.txt";
//file reading
FileReader fr = new FileReader(log);
String s;
try {
    BufferedReader br = new BufferedReader(fr);

    while ((s = br.readLine()) != null) {
        s.replaceAll(search, replacement);
        // do something with the resulting line
    }
}

You could also use regular expressions, or String.indexOf() to find where in a line your search string appears.

Jason
  • 11,258
  • 3
  • 39
  • 46
  • once it is replaced how to i write it back to the same file? – Pindo May 05 '14 at 06:40
  • You shouldn't write back into the same file while you are reading it. You could write a new file, and then at the end of the process delete the file you read and rename the new one. – Jason May 05 '14 at 06:41
0

Solution with Java Files and Stream

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

private static void replaceAll(String filePath, String text, String replacement) {
        
        Path path = Paths.get(filePath);
        // Get all the lines
        try (Stream<String> stream = Files.lines(file, StandardCharsets.UTF_8)) {
            // Do the replace operation
            List<String> list = stream.map(line -> line.replace(text, replacement)).collect(Collectors.toList());
            // Write the content back
            Files.write(file, list, StandardCharsets.UTF_8);
        } catch (IOException e) {
            LOG.error("IOException for : " + file, e);
            e.printStackTrace();
        }
    }

Usage

replaceAll("test.txt", "original text", "new text");
jafarmlp
  • 1,049
  • 12
  • 11
-3

A very simple solution would be to use:

s = s.replace( "textFiles/a.txt", "something/bob.txt" );

To replace all occurrences, use replaceAll shown in another proposal, where a regular expression is used - take care to escape all magic characters, as indicated there.

laune
  • 30,276
  • 3
  • 26
  • 40