[JAVA] Parsen

Pagina: 1
Acties:
  • 127 views sinds 30-01-2008
  • Reageer

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 20:13

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
Ik heb een textbestand dat ik inlees en daar wil ik gegevens uit parsen.
bijvoorbeeld: 1324243B meuk ---> integer: 1324243, char: B, String meuk
zoiets

Ik doe het nu met char arrays en dat werkt eigenlijk prima maar voor mijn gevoel is het erg omslachtig.

Bestaat er al een ontwikkelde parser in java?
Of kent iemand misschien een makkelijkere methode dan alles handmatig nalopen?

Ik kon zelf in ieder geval niets vinden :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
antlr.org (parser generator :))

[ Voor 4% gewijzigd door 12_0_13 op 16-02-2006 10:20 ]


Verwijderd

Hang er een beetje vanaf wat je wil. Geef eens alle mogelijke combinaties met char en integer?

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 20:13

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
Verwijderd schreef op donderdag 16 februari 2006 @ 10:42:
Hang er een beetje vanaf wat je wil. Geef eens alle mogelijke combinaties met char en integer?
char = c
int = i

ciiiiiiiiiciii string
is bijvoorbeeld een combinatie

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
Het makkelijkste is echt om een parser generator te gebruiken hoor.

Je maakt eerst een grammatica van je taal die je als input wil hebben, en deze grammatica breid je uit met statements, om dingen te doen met stukken die je geparst hebt. Dit kan heel simpel zijn (bijv rekenmachine) of erg ingewikkeld (bijv. eenvoudige postscript interpreter)

Erg leuke materie iig, maar misschien voor jouw probleem ietsje aan de zware kant, alhoewel als het wat ingewikkelder wordt het je meestal veel tijd bespaart

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 20:13

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
12_0_13 schreef op donderdag 16 februari 2006 @ 10:56:
Het makkelijkste is echt om een parser generator te gebruiken hoor.

Je maakt eerst een grammatica van je taal die je als input wil hebben, en deze grammatica breid je uit met statements, om dingen te doen met stukken die je geparst hebt. Dit kan heel simpel zijn (bijv rekenmachine) of erg ingewikkeld (bijv. eenvoudige postscript interpreter)

Erg leuke materie iig, maar misschien voor jouw probleem ietsje aan de zware kant, alhoewel als het wat ingewikkelder wordt het je meestal veel tijd bespaart
Ik ben ook die generator aan het proberen. Ik ben alleen benieuwd of de parser die hij genereert ook een beetje snel is

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 16-02 16:12
Als je het tekst bestand alleen wil tokenizen, dan kan je misschien beter kijken naar StreamTokenizer.

Deze kan herkennen of een token een "word" (string) of een "number" (double) is.

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10-04 16:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je wilt niet parsen, je wilt lexical analysen. Aan een parser generator heb je dan ook niets, wel aan een lexer generator (kan ook met de eerdergenoemde antlr overigens)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 20:13

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
VyperX schreef op donderdag 16 februari 2006 @ 12:10:
Als je het tekst bestand alleen wil tokenizen, dan kan je misschien beter kijken naar StreamTokenizer.

Deze kan herkennen of een token een "word" (string) of een "number" (double) is.
Kan je daarmee dan ook beperkingen aan de ascii-codes, string lengtes, integer waarden maken?
.oisyn schreef op donderdag 16 februari 2006 @ 12:13:
Je wilt niet parsen, je wilt lexical analysen. Aan een parser generator heb je dan ook niets, wel aan een lexer generator (kan ook met de eerdergenoemde antlr overigens)
Volgens mij is het parsen, er staat namelijk een heleboel ascii meuk tussen de relevante data. En de structuur van de data moet geparsed worden.

Of ik moet de definitie compleet mis hebben ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
Een Lexer (Lexicale analyse) zet een stroom input om naar een stroom tokens, eigenlijk zoals TS aangaf in zijn voorbeeld.

Een Parser (Syntax analyse) kan deze tokens analyseren, volgens een bepaalde grammatica.

Meestal moet je wat afdwingen over het formaat van je input, het moet bijvoorbeeld voldoen aan bepaalde regels (bijv. altijd eerst een regelnummer, dan de tekst). Dan zit je al snel aan parsers :)

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 20:13

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
12_0_13 schreef op donderdag 16 februari 2006 @ 13:30:
Een Lexer (Lexicale analyse) zet een stroom input om naar een stroom tokens, eigenlijk zoals TS aangaf in zijn voorbeeld.

Een Parser (Syntax analyse) kan deze tokens analyseren, volgens een bepaalde grammatica.

Meestal moet je wat afdwingen over het formaat van je input, het moet bijvoorbeeld voldoen aan bepaalde regels (bijv. altijd eerst een regelnummer, dan de tekst). Dan zit je al snel aan parsers :)
Zoiets vermoedde ik al. Ik moet inderdaad ID's uitlezen, uit een integer het categorienummer halen en een de string die erbij hoort tussen de ascii tekentjes uithalen. Parsen :D

Nu vraag ik mij af of dat wel mogelijk is met de StreamTokenizer, hij ziet er erg beperkt uit.
Misschien is het dan handiger om wat tijd te investeren in antlr.

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kan je dat niet gewoon heel simpel met regular expressions doen?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10-04 16:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gonadan schreef op donderdag 16 februari 2006 @ 13:42:
[...]

Zoiets vermoedde ik al. Ik moet inderdaad ID's uitlezen, uit een integer het categorienummer halen en een de string die erbij hoort tussen de ascii tekentjes uithalen. Parsen :D
Nee, het is toch echt scannen, je hebt alleen een token stream nodig. Je hebt geen geneste structuren en als ik het zo hoor doet de volgorde van de tokens er weinig toe (een string gevolgd door een int hoef je niet anders te interpreteren dan een int gevolgd door een string)

En een StreamTokenizer doet precies dat :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 20:13

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
.oisyn schreef op donderdag 16 februari 2006 @ 14:32:
[...]

Nee, het is toch echt scannen, je hebt alleen een token stream nodig. Je hebt geen geneste structuren en als ik het zo hoor doet de volgorde van de tokens er weinig toe (een string gevolgd door een int hoef je niet anders te interpreteren dan een int gevolgd door een string)

En een StreamTokenizer doet precies dat :)
Een id kan bestaan uit bijvoorbeeld charintintintintintcharintint maar ook intintintintintint.intintchar.intint
het verschilt :)

Regular expressions, tsja met PHP had ik het al afgehad. Kan je in java net zo werken met regular expressions? zoals preg_replace enzo? dat hij ook echt zoekt in de string

Gevonden: java.util.regex, nu maar weer even spitten ;)

[ Voor 4% gewijzigd door Gonadan op 16-02-2006 14:47 ]

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Gonadan schreef op donderdag 16 februari 2006 @ 14:40:
[...]

Een id kan bestaan uit bijvoorbeeld charintintintintintcharintint maar ook intintintintintint.intintchar.intint
het verschilt :)
Wat moet er mee gebeuren? Gewoon alle cijfers achter elkaar?

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 20:13

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
Ik heb het voor elkaar dat hij regex zoekt.
Maar de tering, wat is dat traag :S

Kan dat niet sneller? Het is namelijk een bestand van 100MB. :+

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Ik ben zelf geen voorstander van regex.

Wat moet er nu precies gebeuren? Als je alleen alle cijfertjes achter elkaar wilt hebben, dan kan je dat bijvoorbeeld zo doen:

Java:
1
2
3
4
5
6
7
8
9
10
11
    String text = "01234WatTekst56789";
    StringBuffer tmp = new StringBuffer(text.length());

    for (int i = 0; i < text.length(); i++) {
      char c = text.charAt(i);
      if (Character.isDigit(c))
          tmp.append(c);
    }
    String id = tmp.toString();

    System.out.println(id);

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 20:13

Gonadan

Admin Beeld & Geluid, Harde Waren
Topicstarter
Daos schreef op donderdag 16 februari 2006 @ 15:41:
Ik ben zelf geen voorstander van regex.

Wat moet er nu precies gebeuren? Als je alleen alle cijfertjes achter elkaar wilt hebben, dan kan je dat bijvoorbeeld zo doen:

Java:
1
...
Zo makkelijk is het helaas niet. Ik moet de ID's inlezen, en aan de hand van welk type ID het is moet ik nog andere integers or strings die er achter staan inlezen. Daar moet ik de non-word karakters halen. Regex zou ideaal zijn ware het niet dat hij boktraag is. Ik schrijf dus nu zelf maar een soort regex die een stuk sneller is.

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Daos schreef op donderdag 16 februari 2006 @ 15:41:
Ik ben zelf geen voorstander van regex.
Maar van uitgebreide code? ;) Waarom?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Daos
  • Registratie: Oktober 2004
  • Niet online
kenneth schreef op donderdag 16 februari 2006 @ 16:37:
[...]
Maar van uitgebreide code? ;) Waarom?
Een discussie hierover liep ook al in een ander topic:
Daos schreef op woensdag 15 februari 2006 @ 12:25:
Het maken van een regular expression gaat misschien sneller dan een paar regels code, maar een regular expression is moeilijk te debuggen of uit te breiden. Dit is vooral een groot probleem als hij niet van jou is of als je hem een tijdje terug hebt gemaakt.

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Misschien niet geheel onbelangrijk, maar was zoiets als "2F" bijvoorbeeld niet een 2 als float; ditto voor "3D" => 3 als double etc... Nahjah, in de taal iig wel dacht ik, maar de interpretatie van een 'tekstbestand' is natuurlijk aan jezelf.

[ Voor 34% gewijzigd door prototype op 16-02-2006 23:00 ]


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 09-04 19:27

Eelke Spaak

- Vlad -

Misschien is het zinvol als je even een fragmentje uit het in te lezen bestand post.

TheStreme - Share anything with anyone


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Eelke Spaak schreef op vrijdag 17 februari 2006 @ 08:51:
Misschien is het zinvol als je even een fragmentje uit het in te lezen bestand post.
IDD als je een stukje post en wat je daar precies uit wilt halen dan kunnen we er wat nuttigers over zeggen, want zo is het voor ons ook maar speculeren wat je precies wilt doen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1