» »

[Java]: replace - slovar v txt

[Java]: replace - slovar v txt

prem ::

Iščem način s katerim bi lahko v File.txt datoteki replace-al besede z drugimi besedami iz slovarja (gre za cca 100000 besed). Ne vem na kakšen način naj se lotim tega?
Primer kako replace-am dve besedi, kako se naredi, da nekje od zunaj berem slovar, ne da 100000 krat napišem text.replaceAll () v kodo :)?
import java.io.*;

public class BTest
    {
     public static void main(String args[])
         {
         try
             {
             File file = new File("c:/tmp/file.txt");
             BufferedReader reader = new BufferedReader(new FileReader(file));
             String line = "", text = "";
             while((line = reader.readLine()) != null)
                 {
                 text += line + "\r\n";
             }
             reader.close();
             text = text.replaceAll("avto", "car");
             text = text.replaceAll("žoga", "ball");
             FileWriter writer = new FileWriter("c:/tmp/fileN.txt");
             writer.write(text);
             writer.close();
         }
         catch (IOException ioe)
             {
             ioe.printStackTrace();
         }
     }
}

gufy123 ::

Kaj pa če narediš tabelo, kjer bo ena vrstica vsebovala osnovno besedo in besedo, ki jo zamenja? Potem se namesto
text = text.replaceAll("avto", "car");
             text = text.replaceAll("žoga", "ball");
sprehodiš čez celo tabelo, iščeš besede iz enega stolpca in menjaš z besedami v drugem stolpcu iste vrstice

prem ::

ne vem glede performance, gre za cca 100000 besed * 2, pa da se ta tabela napolni tudi po moje traja, zanima me, kako bi se rešilo preko zunanje slovar.txt datoteke ali kaj podobnega? Sem nov v Javi.

Spura ::

Ali so besede, ki jih zamenjujes vsaka v svoji vrstici?

prem ::

gre za besedilo, stavke, kot da bi naredil copy/paste enega članka iz worda v txt format.

po moje bi moral algoritem vsako besedo iz file.txt vzet, pogledat v slovar, če v slovarju obstaja jo zamenjat, drugače pustiti original.

Zgodovina sprememb…

  • spremenil: prem ()

Spura ::

Ce imas tako velik slovar potem ja.

_Dormage_ ::

A priklenjen na javo?
Katerikoli skriptni jezik bi zmagal :)

Spura ::

Ne vem sicer zakaj bi bil skriptni jezik boljsi, tole je trivialno v javi.

win64 ::

V drugo datoteko zapiši pare:
žoga ball
avto car
...

in preberi vsako vrstico v tej datoteki, jo sparsaj, da dobiš levo in desno besedo(lahko si pomagaš z vrstica.split(' ')) in potem samo:
text = text.replaceAll(levaBeseda, desnaBeseda);

prem ::

@_Dormage_
nisem še delal s skriptnimi jeziki, sem pa malo pogooglal in se mi zdi python še bolj simpl

@win64
podobno sem naredil, le da sem v slovar ločil besede s podpičjem in sem uporabil za parsanje;
 textSLO = text.substring(0, text.indexOf(";"));
	  textENG = text.substring( text.indexOf(";")+1, text.length());

zdaj se moram še pogledat, kako se bere beseda po besedo iz file.txt, zdaj berem vrstico po vrstico in potem vsako besedo preverit, če je v slovarju.

Spura ::

win64 je izjavil:

V drugo datoteko zapiši pare:
žoga ball
avto car
...

in preberi vsako vrstico v tej datoteki, jo sparsaj, da dobiš levo in desno besedo(lahko si pomagaš z vrstica.split(' ')) in potem samo:
text = text.replaceAll(levaBeseda, desnaBeseda);

A ti to resno? Torej ce ima 100000 besednih parov v slovarju bo 100000 Pattern objectov naredil in 100000 Matcher objectov in 100000 trivialnih regex searchov. 100000 krat se bo cez cel tekst sprehodil.

textSLO = text.substring(0, text.indexOf(";"));
     textENG = text.substring( text.indexOf(";")+1, text.length());


A text.split(";") pa ni uredu? text.substring( text.indexOf(";")+1, text.length()) je isto kot text.substring(text.indexOf(";")+1)
String line = null;
String[] gesli = null;
HashMap<String, String> slovar = new HashMap<String,String>();
while((line = slovarFileReader.readLine()) != null) {
    gesli = line.split(";");
    slovar.put(gesli[0], gesli[1]);
}
line = null;
String prevod = null;
Pattern wordPattern = Pattern.compile("\\b\\p{L}+\\b");
StringBuffer buf = new StringBuffer();
while((line = textFileReader.readLine()) != null) {
    Matcher m = wordPattern.matcher(line);
    while(m.find()) {
        prevod = slovar.get(m.group());
        if (prevod != null) {
            m.appendReplacement(buf, prevod);
        } else {
            m.appendReplacement(buf, m.group());
        }
    }
    outputFilePrintWriter.println(m.appendTail(buf));
    buf.setLength(0);
}

Tkole priblizno idejno (nism probu skompajlat).
slovarFileReader, textFileReader, outputFilePrintWriter so BufferedReaderji in PrintWriter na uporabljene datoteket (sem izpustil kodo za odpiranje, zapiranje). PrintWriter je treba flush() klicat preden zapres. Spremenjivka prevod je naceloma odvec, lahko kr line uporabis.

prem ::

@Spura
hvala, profi spisano in deluje.

import java.io.*;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Slovar
    {
		
    public static void main(String args[])
         {
         try
             {
             File file = new File("c:/tmp/file.txt");
             File fileS = new File("c:/tmp/slovar.txt");
             File fileO = new File("c:/tmp/fileN.txt");
             BufferedReader reader = new BufferedReader(new FileReader(file));
             BufferedReader readerS = new BufferedReader(new FileReader(fileS));
             PrintWriter output = new PrintWriter(fileO);
             String line = null;
             String[] gesli = null;
             String prevod = null;
             HashMap<String, String> slovar = new HashMap<String,String>();
             
             while((line = readerS.readLine()) != null) {
                 gesli = line.split(";");
                 slovar.put(gesli[0], gesli[1]);
             }
             
             
             Pattern wordPattern = Pattern.compile("\\b\\p{L}+\\b");
             StringBuffer buf = new StringBuffer();
             while((line = reader.readLine()) != null) {
                 Matcher m = wordPattern.matcher(line);
                 while(m.find()) {
                     prevod = slovar.get(m.group());
                     if (prevod != null) {
                         m.appendReplacement(buf, prevod);
                     } else {
                         m.appendReplacement(buf, m.group());
                     }
                 }
                 output.println(m.appendTail(buf));
                 buf.setLength(0);
             }
             
             reader.close();
             readerS.close();
             output.flush();
             output.close();
         }
         catch (IOException ioe)
             {
             ioe.printStackTrace();
         }
    }
}

Spura ::

V prihodnosti, ce hoces en string zamenjat z drugim, se uporablja funkcija replace.
"ababab".replace("a", "c") => "cbcbcb"

replaceAll dela isto v tem primeru, samo uporablja regex, kar pomeni Pattern.compile, pattern.matcher, matcher.find, etc... za vsak klic. Klicat replaceAll zato da zamenjas dobesedne stringe je metanje cpu ciklov stran.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[java] problem pri pretvarjanju datoteke v string

Oddelek: Programiranje
51074 (964) pujs
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242322 (1957) Bela01
»

[JAVA] kako dobiti določene chare

Oddelek: Programiranje
131549 (1396) molotov
»

[NALOGA][JAVA]Vodoravni met

Oddelek: Programiranje
112637 (2326) BCSman
»

branje iz fajla v javi

Oddelek: Programiranje
51088 (1028) Lizard

Več podobnih tem