Wyszukiwanie tekstu w pliku txt, a póżniej zapisywanie do tablicy Stringów

0

Witam.

Posiadam duże pliki .txt, z których muszę wyszukać Stringa {"regon="}. To jest akurat proste i z tym sobie poradziłem.
Jednak po wyszukaniu chciałbym odczytać 9-znakowy regon, który mieści się między znakami cudzysłowy.
Moja przykładowa linia z pliku .txt wygląda tak <produkt regon="012312312300000" kod="123">

Czyli chciałbym wyszukać z linii słowo regon=", gdy znajdę taki ciąg znaków to zapisuje 12 kolejnych znaków z tej linii do tablicy, następnie tworze Stringa z poprawnym regon wyświetlając z tablicy tylko znaki nr [1], [2], [3], [4], [5], [6], [7], [8], [9] i w to samo miejsce wklejam tego mojego powstałego Stringa, zapisuje plik .txt, zamykam go i koniec.

Czy ma ktoś może pomysł jak to zrobić, bo ja mam na to chyba za małą wiedzę :/

0

Hej, jeśli twój plik jest xml, to polecam Xpath, biblioteka, która operuje na XMLach, możesz pobrać wszystkie elementy <produkt regon, i potem pobrać jego atrybutu i wartość.
Jeśli robisz to linia po linii ,to mając linię z regonem uzywasz String.indexOf()

String temp =  "<produkt regon="012312312300000" kod="123">";
String result = temp.substring(temp.indeoxOf("regon=\""), temp.indexOf("regon=\"")+9); 
0

No tak właściwie jest to plik .xml :)

Czyli mam to zrobić tak?
0. Pętla przechodząca przez wszystkie linie

  1. Sprawdzić czy w linii występuję regon
  2. Jeśli tak to zaczytać jego wartość
  3. Przerobić wstawić ją do tablicy
  4. Zapisać w zmiennej pom ucięty napis (poprawny regon)
  5. Wkleić poprawny regon w miejsce błędnego
  6. Zapisać zmiany
  7. Zamknąć plik

Napisałem taki kod. Fajnie wyszukuje mi regon w każdej linii. Tylko ma teraz taki problem, bo nie wiem jak mam wyszukać sobie ten błędny regon.
Większość regonów jest 9 - znakowa, a ja chce poprawiać te, które mają 15 znaków (jeśli mają 15 to usuwać pierwszy znak i 5 ostatnich).

public static void main(String[] args) throws IOException {
		
		File file = new File("C:\\Users\\Kamil\\Desktop\\Workspace\\KC52_0610034_201701_23.xml");
		FileReader fileReader = new FileReader(file);
		BufferedReader bufferedReader = new BufferedReader(fileReader);
		
		String line = "";
		String searched = "";
		String[] splited = new String[14];
		
		while((line = bufferedReader.readLine()) != null) {
			if(line.contains("regon=")) {
				
				searched = line.substring(line.indexOf("\"") + 1, line.indexOf("\"") + 16);
				splited = searched.split("");
			}
		}
	}
0

Jeśli jest to prawidłowy plik xml, to użyj biblioteki Xpath.
wtedy operujesz nie na liniach w pliku, tylko na obiektach DOM.
Bierzesz wtedy node np product i wartość parametru regon, operujesz wtedy na obiektach a nie na stringach, to jest wygodniejsze.
Przykład:

FileInputStream fileIS = new FileInputStream(new file("moj_plik"));
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document xmlDocument = builder.parse(fileIS);
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/Product/";
nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);

expression to jest ściezka do twojego elementu
xmlDocument, to jest źródło

Poszukaj na sieci tutoriala, ja niestety straciłem wszystkie swoje przykłady z xpathem

0

Czytałem już o tej bibliotece z Twojego polecenia i napisałem takie coś:

public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException {
		
		File file = new File("C:\\Users\\Kamil\\Desktop\\Workspace\\KC52_0610034_201701_23.xml");
		FileReader fileReader = new FileReader(file);
		BufferedReader reading = new BufferedReader(fileReader);
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		org.w3c.dom.Document doc = db.parse(file);
		
		doc.getDocumentElement().normalize();
		NodeList nodeList = doc.getElementsByTagName("mz:sprawozdanie");
		Node firstNode = nodeList.item(0);
		
		String regon = "";
		
		while(reading.readLine() != null) {
			if (firstNode.getNodeType() == Node.ELEMENT_NODE) {
				
				Element firstElement = (Element) firstNode;
				NodeList wezel = (NodeList) firstElement.getElementsByTagName("mz:komorka-org");
				regon = ((Element)wezel.item(0)).getAttribute("regon");
			}
		}
		System.out.println(regon);
		fileReader.close();
	}

Niestety nie widzi mi wszystkich atrybutów regon, tak jakby były może gdzieś głębiej zaszyte?

P.S. Każdy atrybut "regon" znajduje się w węźle "mz:komorka-org"

.edit

Zauważyłem. że regon nie zawsze znajduje się w węźle nadrzędnym "mz:sprawozdanie", więc to chyba będzie przyczyna mojego błędu.

0

Podrzuć fragment pliku. Moze trzeba zmienić xpatha.
Jeśli regon nie jest zawsze tam gdzie ma być, to można druga pętle zrobić, albo w tej jednej algorytm.
Po co wczytujesz linie reading, jak już masz załadowany model do pamięci?
Leć petlą po nodach, które masz w nodeList
wywal ten reading.

0
doc.getDocumentElement().normalize();
        NodeList nodeList = doc.getElementsByTagName("mz:sprawozdanie");
        for(Node node : nodeList){
                  Element firstElement = (Element) node;
                NodeList wezel = (NodeList) firstElement.getElementsByTagName("mz:komorka-org");
                regon = ((Element)wezel.item(0)).getAttribute("regon");
}
0

Kod xml (dane zmienione):

<mz:pozycja id="P000000" tryb="D">
     <mz:swiadczenie platnik="00">
      <mz:pacjent>
       <mz:ubezpieczenie kod-kasy="00">          </mz:ubezpieczenie>
       <mz:pacjent-stat urodz="0000-00-00" plec="K" teryt="000000">          </mz:pacjent-stat>
      </mz:pacjent>
      <mz:ksiega rok="0000" nr="00" poz="00000">        </mz:ksiega>
      <mz:przyjecie data="0000-00-00" tryb="0">        </mz:przyjecie>
      <mz:wypis data="0000-00-00" tryb="0">
      </mz:wypis>
      <mz:usluga data="0000-00-00" data-do="0000-00-00" kod="1.1">
       <mz:komorka-org regon="012312312300009" nr="000" typ="0000">          </mz:komorka-org>
       <mz:przyczyna katalog="00" kod="000">
       </mz:przyczyna>
       <mz:procedura katalog="05" kod="89.71" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.99" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.99" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.99" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.99" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.99" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.99" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="89.00" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="89.04" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="38.93" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="89.602" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="89.61" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.97" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.97904" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="89.522" ilosc="1">          </mz:procedura>
       <mz:procedura katalog="05" kod="99.99" ilosc="1">          </mz:procedura>
      </mz:usluga>
     </mz:swiadczenie>
    </mz:pozycja>

A tu inny fragment:

<mz:sprawozdanie data="0000-00-00">
      <mz:okres typ="M" rok="0000" nr="0" data-od="0000-00-00" data-do="0000-00-00">      </mz:okres>
      <mz:komorka-org regon="012312312300009" teryt="0000000">      </mz:komorka-org>
    </mz:sprawozdanie>
0
Black007 napisał(a):
doc.getDocumentElement().normalize();
        NodeList nodeList = doc.getElementsByTagName("mz:sprawozdanie");
        for(Node node : nodeList){
                  Element firstElement = (Element) node;
                NodeList wezel = (NodeList) firstElement.getElementsByTagName("mz:komorka-org");
                regon = ((Element)wezel.item(0)).getAttribute("regon");
}

Wyświetla mi błąd, że nie mogę iterować po nodeList:
"Can only iterate over an arrary or an instance of java.lang.Iterable"

0

NodeList pomimo takiej nazwy nie jest listą na której można zrobić foreach.

0

Szybko przykład z netu:

 NodeList shows = (NodeList) xPath.evaluate("/schedule/show", new InputSource(new FileReader(
        "tds.xml")), XPathConstants.NODESET);
    for (int i = 0; i < shows.getLength(); i++) {
      Element show = (Element) shows.item(i);
      String guestName = xPath.evaluate("guest/name", show);
      String guestCredit = xPath.evaluate("guest/credit", show);

      System.out.println(show.getAttribute("weekday") + ", " + show.getAttribute("date") + " - "
          + guestName + " (" + guestCredit + ")");
    }

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