Suche simplen Parser

RolandR88

Lieutenant
Registriert
Jan. 2007
Beiträge
620
Hey Leute,
ich suche eine simple Lösung um ein txt-File zu parsen.
Soll einfach nach Expression A/B/C/D suchen und dann jeweils den String (A) char 12-40 after, oder String (B) 5 before - 12 after ausgeben.
Wie löse ich das am einfachsten? Einzige Bedingung: es muss offline funktionieren.
Vielen Dank!
 
Verstehst du deine Beschreibung selber? Stell dir vor, du hättest keine Ahnung des Problems...
 
  • Gefällt mir
Reaktionen: mental.dIseASe, BAGZZlash, Myron und eine weitere Person
KillerCow schrieb:
Hmm.
Also: ein TXT-File ist chaotisch angeordnet. Ich suche darin nun nach einer Expression, zB (A) "Hundehaus" - der Parser soll dann die 5 Zeichen vor bis 12 Zeichen nach "Hundehaus" für jedes Vorkommen ausgeben. Bei Expression (B) "Karrotte" soll etwas ähnliches passieren, aber mit anderen Parametern
 
nicht dass ich deine Beschreibung jetzt verstanden haette - ist ja auch schon spaet (fuer mich) - aber was fuer eine Art "Parser" soll denn das sein?
Warum schreibst du nicht einfach ein Python oder Perl Skript dafuer? Kann ja nur ein paar Zeilen Code sein. Ob du einen Tokenizer brauchst, kannst nur du wissen - scheinbar willst du aber den Kontext danach groesser haben als das Wort selbst.
Nach dem Grund frage ich gar nicht erst, hast du ja nicht erwaehnt. Sonst koennte man hier mit XY Problem anfangen.
 
  • Gefällt mir
Reaktionen: BAGZZlash, KillerCow und BeBur
Das klingt irgendwie weniger nach einem Parser (der zerlegt für gewöhnlich etwas in Tokens und baut einen Syntaxbaum auf) und eher nach einer eher einfachen Suche... Reguläre Ausdrücke? Slices mit Python? Einfach Stringoperationen? Klingt schwer nach Übungs-/Hausaufgabe?
Ganz pragmatisch:
Wiederhole für alle Suchtrings:
  • Finde Position von Suchstring in Zeichenkette.
  • Wenn Position gefunden: Extrahiere Substring von (gefundene Position -X) bis (gefundene Position +Länge Suchstring +Y).

Die Längen X und Y pro Suchstring musst du nur noch passend der verwendeten Sprache abbilden, etwa als Attribute der Suchtrings oder so.
 
  • Gefällt mir
Reaktionen: BFF und BeBur
Ist ganz einfach mit Regexp. Schau dir einfach Regexp Grundlagen an, die reichen dafür + Das Thema "Groups".

RolandR88 schrieb:
Bedingung: es muss offline funktionieren.
Uff. Ist das die IT-Welt in der ich lebe? Ich wollte woanders hin, das hier war nur meine Drittwahl!!!
 
  • Gefällt mir
Reaktionen: BFF
RolandR88 schrieb:
Hmm.
Also: ein TXT-File ist chaotisch angeordnet. Ich suche darin nun nach einer Expression, zB (A) "Hundehaus" - der Parser soll dann die 5 Zeichen vor bis 12 Zeichen nach "Hundehaus" für jedes Vorkommen ausgeben. Bei Expression (B) "Karrotte" soll etwas ähnliches passieren, aber mit anderen Parametern
Also aus deiner ersten Beschreibung lese ich, dass die Ausdrücke durch ein / getrennt sind.
Aus dieser neuen verstehe ich noch weniger.

Hol dir einen Texteditor (ist nat. offline :) )der Regexp kann, bspw. PsPad und formuliere einen Regexp.
Beispiel:
Suchen: ([^/])/([^/])/[^/]/[^/]
Ersetzen: A:$1 B:$2

Das macht
Hundehaus/Karotte/Villa/Test -> A: Hundehaus B: Karotte

Geht das in die Richtung die du brauchst?
 
Danke für die Antworten - die Strings sind nicht einfach durch / getrennt.
Ich brauche tatsächlich einfach
KillerCow schrieb:
  • Finde Position von Suchstring in Zeichenkette.
  • Wenn Position gefunden: Extrahiere Substring von (gefundene Position -X) bis (gefundene Position +Länge Suchstring +Y).

Die Längen X und Y pro Suchstring musst du nur noch passend der verwendeten Sprache abbilden, etwa als Attribute der Suchtrings oder so.
Ist keine Hausaufgabe, aber ich weiß einfach nicht wie ich es anstelle. Programmieren kann ich nicht recht und ein Tool dafür finde ich nicht...
 
Wenn ich dich richtig verstehe, hast du eine Menge von Mustern, die alle gesucht werden sollen und ein bestimmer Substring vor oder danach je nach Muster ausgegeben werden. Die Ergebnisse werden in einer neuen Datei erwartet.

Versuche nach dieser Art die Aufgabenstellung so genau wie möglich zu beschreiben.
Eines muss jedoch klar gesagt werden: Ohne Programmierung ist diese Ausfgabe eher nicht zu lösen.
 
RolandR88 schrieb:
Programmieren kann ich nicht recht und ein Tool dafür finde ich nicht...
Dann mach es manuell oder beauftrage jemanden auf fiverr.com
Ich denke das kostet einen zweistelligen Betrag.

Aber frag dich mal: Wie viel Zeit wirst du hier wohl investieren bis das läuft?
Und wie lange dauert es, wenn du es einfach händisch machst?
 
Wie. Wäre. Es. Mit. Einem. Beispiel?

Etwa so?

Daten:
Code:
123456789HundehausABCDEFGKarottezyxwvutsrqponml
kfkfkfkfVillawqwqwqwqTestasasasasasasas

Eingabe: Parse("Hundehaus", "Karotte", "Villa", "Test")

Ausgabe:
Code:
56789HundehausABCDEFGKarot
CDEFGKarottezyxwvutsrqpo

fkfkfVillawqwqwqwqTest
qwqwqTestasasasasasas
 
  • Gefällt mir
Reaktionen: netzgestaltung
schau mal hier... einfach als .html Datei speichern und im Browser öffnen

HTML:
<html>

<head>
    <title>"Parser"</title>
</head>

<body>
    <form onsubmit="return parse()">
        <div>
            <label for="eingabe">EingabeText</label>
            <textarea id="eingabe" rows="10" cols="100"></textarea>
        </div>
        <div>
            <label for="suchbegriffe">Suchbegriffe</label>
            <textarea id="suchbegriffe" placeholder="Hund, Katze, Maus" rows="3" cols="100"></textarea>
        </div>
        <div style="margin-top: 15px;">
            <button type="submit">Suchen</button>
        </div>
        <div id="ergebnis"></div>
    </form>
    <script>
        function parse(e) {
            const eingabeInput = document.getElementById("eingabe").value;
            const suchbegriffeInput = document.getElementById("suchbegriffe").value;

            const suchbegriffe = suchbegriffeInput.split(",").map(s => s.trim());

            ergebnis.innerHTML = "";
            suchbegriffe.forEach(suchbegriff => {
                const regEx = new RegExp(`(.{0,5}${suchbegriff}.{0,12})`, "gm");
                const match = regEx.exec(eingabeInput);
                if(match) {
                    ergebnis.innerHTML += `<p>${match[0]}</p>`;
                }
            });
            return false;
        }
    </script>
</body>

</html>
 
  • Gefällt mir
Reaktionen: DubZ, RolandR88 und BAGZZlash
Nafi das ist super! Nur zwei Fragen dazu:
-) Wie stelle ich die Länge des Strings ein den ich zurückbekomme? Genauer gesagt bräuchte ich die gesamte Zeile plus die Zeile oberhalb des Match.
-) Ist es möglich, dass nicht nur ein Ergebnis, sondern alle Ergebnisse der Suche ausgeworfen werden?

Die Datensätze sehen in dem Bereich zB so aus

Code:
YX-XY-684684      XXXXXXX      49846543541 Z 1          65.654.6451         65.654.6451         65.654.6451        65.654.6451
     XXXXXXX      BV51651 X0Y09ZERESD  0 1 KATZE nicht gefunden
YX-XY-684684      XXXXXXX      49846543541 Z 1          65.654.6451         65.654.6451         65.654.6451        65.654.6451
     XXXXXXX      BV51651 X0Y09ZERESD  0

Vielen Dank!
 
Zuletzt bearbeitet:
Es werden doch alle Ergebnisse angezeigt, siehe Ergebnis zum Beispieltext von oben:
1582626665020.png


Zeile mit Match und nächste Zeile:
HTML:
<html>

<head>
    <title>"Parser"</title>
</head>

<body>
    <form onsubmit="return parse()">
        <div>
            <label for="eingabe">EingabeText</label>
            <textarea id="eingabe" rows="10" cols="100"></textarea>
        </div>
        <div>
            <label for="suchbegriffe">Suchbegriffe</label>
            <textarea id="suchbegriffe" placeholder="Hund, Katze, Maus" rows="3" cols="100"></textarea>
        </div>
        <div style="margin-top: 15px;">
            <button type="submit">Suchen</button>
        </div>
        <ol id="ergebnis"></ol>
    </form>
    <script>
        function parse(e) {
            const eingabeInput = document.getElementById("eingabe").value;
            const suchbegriffeInput = document.getElementById("suchbegriffe").value;

            const suchbegriffe = suchbegriffeInput.split(",").map(s => s.trim());

            ergebnis.innerHTML = "";
            suchbegriffe.forEach((suchbegriff, i) => {
                const regEx = new RegExp(`(^.*${suchbegriff}.*\n?(.*))\n?`, "gm");
                const match = regEx.exec(eingabeInput);
                if(match) {
                    ergebnis.innerHTML += `
                        <li>
                            <p>${match[1].replace(suchbegriff, '<strong>'+ suchbegriff +'</strong>')}</p>
                            <p>${match[2]}</p>
                        </li>
                    `;
                }
            });
            return false;
        }
    </script>
</body>

</html>
 
Danke - ich habe es nicht genau genug formuliert. Ich bräuchte alle Katzen, wenn mehrere Katzen vorhanden sind.
Es funktioniert, aber so müsste ich nach "Katze, Katze, Katze, Katze, [...]" eingeben.
e/ bzw. wird immer nur das erste Suchergebnis ausgeworfen - bräuchte aber alle.
 
achso, hier:
HTML:
<html>

<head>
    <title>"Parser"</title>
</head>

<body>
    <form onsubmit="return parse()">
        <div>
            <label for="eingabe">EingabeText</label>
            <textarea id="eingabe" rows="10" cols="100"></textarea>
        </div>
        <div>
            <label for="suchbegriffe">Suchbegriffe</label>
            <textarea id="suchbegriffe" placeholder="Hund, Katze, Maus" rows="3" cols="100"></textarea>
        </div>
        <div style="margin-top: 15px;">
            <button type="submit">Suchen</button>
        </div>
        <ol id="ergebnis"></ol>
    </form>
    <script>
        function parse(e) {
            const eingabeInput = document.getElementById("eingabe").value;
            const suchbegriffeInput = document.getElementById("suchbegriffe").value;

            const suchbegriffe = suchbegriffeInput.split(",").map(s => s.trim());

            ergebnis.innerHTML = "";
            suchbegriffe.forEach((suchbegriff, i) => {
                const regEx = new RegExp(`(^.*${suchbegriff}.*\n?(.*))\n?`, "gm");
                let match = regEx.exec(eingabeInput);
                while(match != null) {
                    console.log("match", match);
                    ergebnis.innerHTML += `
                        <li>
                            <p>${match[1].replace(suchbegriff, '<strong>'+ suchbegriff +'</strong>')}</p>
                            <p>${match[2]}</p>
                        </li>
                    `;
                    match = regEx.exec(eingabeInput);
                }
            });
            return false;
        }
    </script>
</body>

</html>
 
  • Gefällt mir
Reaktionen: DubZ
Du bist der Wahnsinn! Muss unbedingt den Code analysieren um zu verstehen wie du das gemacht hast! TAUSEND Dank!
 
Zurück
Oben