miXer Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) Hei Jeg prøver å lage et program i java til mobil som sjekker telefonnummer på gule sider, men får det ikke til å funke i java, men i C# med samme koden så fungerer det utmerket.. Det fungerer også utmerket i vanlig java consoll program. Det som skjer er: Jeg henter inn html koden fra gule sider query på et telefonnummer og parser det for å finne navn, adresse og telefonnummer. Men entryFound delen av koden blir fyrt av lenge før den skal. I C# blir den fyrt av riktig, og det er samme kode jeg bruker der. Det eneste som er forskjellig er hvordan substring fungerer. Håper noen kan hjelpe. Her er java koden: for (int i = 0; i < lines.length; i++) { if (entryFound) { if (entry == 1) { entryFound = false; contactName = "i: " + i + " - " + lines[i].trim(); } entry++; } else if (addressFound) { addressFound = false; contactAddress = "i: " + i + " - " + lines[i].substring(lines[i].indexOf("<p>") + 3, lines[i].indexOf("</p>")); } if (lines[i].indexOf("/telefonkatalogen/") > -1) { entryFound = true; contactPhone = "i: " + i + " - " + lines[i].substring(lines[i].indexOf("?q=") + 3, lines[i].lastIndexOf('"')); } else if (lines[i].indexOf("address") > -1) addressFound = true; } return "Navn: " + contactName + "\nAdresse: " + contactAddress + "\nTlf: " + contactPhone; Her er C# koden for (int i = 0; i < lines.Length; i++) { if (entryFound) { if (entry == 1) { entryFound = false; contactName = "i: " + i + " - " + lines[i].Trim(); } entry++; } else if (addressFound) { addressFound = false; contactAddress = "i: " + i + " - " + lines[i].Substring(lines[i].IndexOf("<p>") + 3, (lines[i].IndexOf("</p>") - lines[i].IndexOf("<p>") - 3)); } if (lines[i].IndexOf("/telefonkatalogen/") > -1) { entryFound = true; contactPhone = "i: " + i + " - " + lines[i].Substring(lines[i].IndexOf("?q=") + 3, (lines[i].LastIndexOf('"') - lines[i].IndexOf("?q=") - 3)); } else if (lines[i].IndexOf("address") > -1) addressFound = true; } Console.WriteLine("Name: " + contactName + "\nAddress: " + contactAddress + "\nPhone: " + contactPhone); Her er hva java gir ut som resultat Navn: i: 2 - Adresse: Tlf: i: 0 - Mitt telefonnummer"title="Mitt navn - Personlig infoside"> Mitt navn <span>MER INFO</span> Og masse mer, faktisk resten av html koden..... Her er hva C# gir ut som resultat Name: i: 554 - Mitt navn Address: i: 639 - Min addresse Phone: i: 552 - Mitt telefonnummer Endret 13. mars 2010 av miXer Lenke til kommentar
GeirGrusom Skrevet 12. mars 2010 Del Skrevet 12. mars 2010 Hvorfor bruker du IndexOf og lignende til å parse? Det er unødvendig komplisert, ettersom det finnes regexs og XML verktøyer både i Java og .NET. Lenke til kommentar
miXer Skrevet 12. mars 2010 Forfatter Del Skrevet 12. mars 2010 Skal prøve å bruke XML istenden, men fortsatt så er det noe feil ved J2ME og for looping når dette fungerer flott i vanlig java og C#. Noen som har merket dette før? Vil jo gjerne kunne bruke for looping på andre ting selvom det i dette tilfellet er bedre med xml. Lenke til kommentar
GeirGrusom Skrevet 12. mars 2010 Del Skrevet 12. mars 2010 Jeg vil nok helle mot å si at det neppe er løkken som er problemet, men andre deler av koden. Du kan også bruke foreach Java: for(String line : lines) { ... } C#: foreach(var line in lines) { ... } Utover det, vil jeg si: sjekk om regex kan brukes. IndexOf og SubString tar hundre ganger lenger tid å feilsjekke enn et regex uttrykk. Lenke til kommentar
duckers Skrevet 12. mars 2010 Del Skrevet 12. mars 2010 IndexOf og SubString tar hundre ganger lenger tid å feilsjekke enn et regex uttrykk. Obligatorisk link! Lenke til kommentar
miXer Skrevet 12. mars 2010 Forfatter Del Skrevet 12. mars 2010 Jeg vil nok helle mot å si at det neppe er løkken som er problemet, men andre deler av koden. Du kan også bruke foreach Java: for(String line : lines) { ... } C#: foreach(var line in lines) { ... } Utover det, vil jeg si: sjekk om regex kan brukes. IndexOf og SubString tar hundre ganger lenger tid å feilsjekke enn et regex uttrykk. foreach er ikke støttet i -source1.3, da må jeg bruke -source 5 eller høyere. Som sagt i første post har jeg prøvd ut denne koden i vanlig java console program og der fungerer for loop og koden helt utmerket uten at noe er byttet. Lenke til kommentar
miXer Skrevet 13. mars 2010 Forfatter Del Skrevet 13. mars 2010 Jeg har funnet ut hva problemet var, og du hadde helt rett GeirGrusom, det var split metoden min som ikke oppførte seg riktig. Jeg hadde satt at den skulle splitte på "\r\n", men den måtte splitte på "\n" isteden. Lenke til kommentar
GeirGrusom Skrevet 13. mars 2010 Del Skrevet 13. mars 2010 (endret) Ah, typisk problem. Jeg bruker ofte regex for å dele opp linjer, med "\r\n|\n" Idiotisk at Windows fortsatt bruker det utrolig arkaiske \r\n opplegget. edit: IndexOf og SubString tar hundre ganger lenger tid å feilsjekke enn et regex uttrykk. Obligatorisk link! Hehe, jeg vet ^^ Men regex er ufattelig mye bedre egnet enn IndexOf. Men ettersom miXer skal søke etter tekst fra et konsist dokument som er generert fra en database, og ikke er ute etter å parse HTML, så vil nok regex fungere helt fint. edit: jeg fant en referanse som er litt mindre psykopat Note that parsing HTML or XML with regular expressions is painful. Quick-and-dirty patterns will handle common cases, but HTML and XML have special cases that will break the obvious regular expression; by the time you've written a regular expression that handles all of the possible cases, the patterns will be very complicated. Use an HTML or XML parser module for such tasks. http://www.amk.ca/python/howto/regex/ Endret 13. mars 2010 av GeirGrusom Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå