Modyfikacja pliku tekstowego

0

Mam plik tekstowy ze słówkami Polsko-Niemieckimi. Chcę z robić z nich relacyjną bazę danych i do tego potrzebuję napisać program modyfikujący plik tekstowy. Chcę aby program dodał do każdej linijki na początku numer, a poza tym zamienił przecinek na enter oraz dodał ten sam numer który był na początku linijki. np

plik startowy wygląda tak:

dom
korek, młotek
delfin

plik wynikowy chcę aby wyglądał tak:

1; dom
2; korek
2; młotek
3; delfin

Jakiś pomysł jak to zrobić aby w odczytanym pliku zwiększać wartość zmiennej po każdej linijce i dodać tekst na początku każdej linijki i przy napotkaniu na przecinek zamieniać go na enter i dodawać treść zapamiętaną w zmiennej?

0

Wczytuj po linii z pliku i wywołaj na tej linii string.split(",") potem numeruj

0

Jeszcze nic nie napisałem. Szukam dopiero drogi i komend które mogę wykorzystać do napisania takiego programu. Do tej pory do modyfikacji struktury plików wystarczały mi wyrażenia regularne, ale teraz potrzebuję raczej programiku do obrobienia tematu. Poproszę tylko o kilka komend które można wykorzystać, albo do nakreślenia kierunku jak to można napisać.

Wymyśliłem że wczytam linijkę tekstu, do nowego pliku wpiszę numer, potem wpiszę resztę do napotkania na przecinek, jak napotkam przecinek to dodam nową linię razem z numerem i tak do końca linijki. może w klasie StringUtils coś znajdę przydatnego. No i jeszcze muszę wygooglować jak wstawić enter do pliku. Kiedyś było coś jak \n\r czy coś takiego.

0

cały kod twojego "programiku" sprowadza się do:

 File file = new File("dupa.txt");

		    try {

		        Scanner sc = new Scanner(file);
		        int i=1;
		        while (sc.hasNextLine()) {
		        	String wyrazy[] = sc.nextLine().split(",");
		        	for(String s: wyrazy) {
		        		s=i+"; "+s.trim();
		        		System.out.println(s);
		        		i++;
		        	}
		        }
		    } 
		    catch (FileNotFoundException e) {
		        e.printStackTrace();
		    }
		 }
0

Może zapisz to jako plik csv? https://examples.javacodegeeks.com/core-java/writeread-csv-files-in-java-example/ Tu masz prawie gotowy kod.

0

Mój sposób:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) throws IOException {
        final String fileName = "D:\\test.txt";
        final String splitter = ", ";

        final List<String> newLines = new ArrayList<>();
        for (final String line : Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8)) {
            Collections.addAll(newLines, line.contains(splitter) ? line.split(splitter) : new String[]{line});
        }

        final AtomicInteger atomicInteger = new AtomicInteger(1);
        Files.write(Paths.get(fileName), newLines.stream()
                .map(line -> String.format("%d; %s", atomicInteger.getAndIncrement(), line)).collect(Collectors.toList()));
    }

}
0

Napisałem coś takiego. Zadaniem programu jest przygotowanie relacyjnej bazy danych. Z jednego pliku robi trzy pliki. Plik pierwszy ze słówkami niemieckimi i rodzajnikiem, plik drugi ze słówkiem polski, a trzeci plik z relacją. Plik wygląda tak:
Aberglauben;der;przesąd,zabobon,

Aberglauben;der;przesąd,zabobon,
cis11;a;cos11,
cis12;a;cos12,cos11,
cis13;a;cos13,cos15,cos16,
cis14;a;cos13,
cis15;a;cos12,
cis16;a;cos14,

funkcja wygląda następująco:

public static void TworzenieListyTrzyPlikowej(String name) throws FileNotFoundException {
      FileInputStream file = new FileInputStream(name);
      PrintWriter writePL = new PrintWriter("src/main/resources/wtirePL.txt");
      PrintWriter writeDE = new PrintWriter("src/main/resources/wtireDE.txt");
      PrintWriter writePLDE = new PrintWriter("src/main/resources/wtirePLDE.txt");
      ArrayList listaPL = new ArrayList();
      Scanner sc = new Scanner(file, "UTF-8");

      int i = 0;//index DE
      int j = 0;//index PL
      int k = 0;//l.p.
      int duplikat = 0; //znacznik jak występują duplikaty
      int duplikatPLid = 0;

      writePLDE.println("Id;IdDE;IdPL");
      while (sc.hasNextLine()) {
          String[] wyrazy = sc.nextLine().split(";");
          String[] slowa = wyrazy[2].split(",");
          writeDE.println(i + ";" + wyrazy[0].trim() + ";" + wyrazy[1].trim());
          for (String s : slowa) {
//sprawdzenie czy w liście PL wystąpią duplikaty po dodaniu nowego rekordu.
              for (int x = 0; x < listaPL.size(); x++) {
                  if (listaPL.get(x).equals(s.trim())) {
                      duplikat = 1;
                      duplikatPLid = x;
                  }
              }
              if (duplikat == 0) {
                  writePL.println(j + ";" + s.trim());
                  listaPL.add(s.trim());
                  writePLDE.println(k + ";" + i + ";" + j);
                  j++;
              } else {
                  writePLDE.println(k + ";" + i + ";" + duplikatPLid);
              }
              k++;
              System.out.println(j);//program wykonuje się dosyć długo, dlatego zostawiłem odliczanie aby widzieć że coś się dzieje.
              duplikat = 0;
          }
          i++;
      }
      writePL.close();
      writeDE.close();
      writePLDE.close();
  }

Dziękuję wszystkim za sugestie i proszę o opinie jak ten kod powinien wyglądać.

Kod napisałem już dwa dni temu, ale cały czas miałem błędy wynikające jak się okazało z faktu, że plik ze słówkami nie we wszystkich linijkach miał po dwa średniki (bywało nawet po 6 średników). Plik ma 60tyś linijek i troszkę mi zajęło zanim to wyłapałem. A jak już wyłapałem co jest grane to napisałem mały programik który mi to wyprostował.

1 użytkowników online, w tym zalogowanych: 0, gości: 1