Gå til innhold

[Løst] Splitte text fil! easyIO


Anbefalte innlegg

Hei, jeg trenger hjelp med å å splitte text.

 

 

Oppgaven:

 

"1. Registrer Fugleobservasjon

2. Skriv ut alle observasjoner av en fugletype
3. Skriv ut alle observasjonene på ett bestemt sted
Hvis Ole for eksempel da skriver tallet 1 skal systemet så spørre ham ut om fuglens navn, kjønn,
stedet for observasjonen og dato for observasjonen, som så Ole taster inn. Deretter skal systemet
lagre en ny linje med disse opplysningene på slutten av fila: «fugler.txt». Ber han om alle
observasjoner av en fugletype (eks: Kråke), valg 2 i menyen, så får du ut alle observasjoner av Kråker
med kjønn, sted og tid, og med en linje utskrift per observasjon. Navnet på fugletypen skal da bare
stå i en overskrift over den lista. Alle observasjonene på ett bestemt sted , valg 3, vil
da gi en liste med stedsnavnet som overskrift og så en linje per observasjon som er gjort det stedet
med fuglenavn, kjønn og dato.
eks: Sildemåke,M,Stavern,mai2013"
Sliter med oppgaver 2 og 3 der jeg skal splitte opp text etter komma, og hvordan jeg skal få sånn at jeg kan skrive inn hva jeg skal leter etter.

 

Lenke til kommentar
Videoannonse
Annonse

Skriv i det minste hva du har (vet dette er INF1000 oppgave så skjønner hvis du ikke vil legge ut all koden) på de to og kanskje litt om hva du tenker å gjøre, men ikke får til. Er du helt blank? :)

 

Google kan også gi deg svar på "how to read comma separated values java"

Endret av Stetus
Lenke til kommentar

Skriv i det minste hva du har (vet dette er INF1000 oppgave så skjønner hvis du ikke vil legge ut all koden) på de to og kanskje litt om hva du tenker å gjøre, men ikke får til. Er du helt blank? :)

 

Google kan også gi deg svar på "how to read comma separated values java"

 

Vel, jeg har klart å lage menyen og oppgaven 1 og 4. Har klart å lagre informasjonen til filen ("fugler.txt") men det jeg ikke klarer er oppgave 2/3 der jeg skal taste inn informasjon og så få det ut fra "fugler.txt".

 

Finner ikke hjelp fra Google siden de bruker Buffreader osv. Jeg bruker EasyIO

Endret av Spreeky
Lenke til kommentar

Hvis du leser dokumentasjonentil easyIO så vil du se at det finnes en setDelimiter(String) metode som kan brukes. Her er en kode som leve av hver linje, bryte det opp i en array og så søke gjennom arrayen for match. Er det en match vil linjen printes ut.

import easyIO.In;

public class ReadFromFile {

	/*
	 * Leser inn en og en linje fra filen fugler.txt for så å bryte det opp og
	 * legge det i en string. Ser så om det er match mellom det som er lagret på
	 * index filterType og Stringen matchMed
	 * 
	 * 0 = Navn 1 = Kjønn 2 = Sted 3 = Tid
	 */
	public void readFile(int filterType, String matchMed) {
		easyIO.In in = new In("fugler.txt");
//lager en leser som laster filen fugler.txt forutsatt at den finnes
		String str;
		while ((str = in.readLine()) != null) { 
//loop så lenge du ikke har nådd enden på filen
			String[] observasjon = str.split(","); 
//gjør om linjen til en array 
			if (observasjon[filterType].equalsIgnoreCase(matchMed)) { 
//sjekker om det e en match med filteret
				System.out.println("Navn: " + observasjon[0] + "\nKjønn: "
						+ observasjon[1] + "\nSted: " + observasjon[2]
						+ "\nTid: " + observasjon[3]);
				System.out.println("---------------------"); 
//kun for leselighet
			}

		}
	}

	public static void main(String[] args) {
		ReadFromFile rff = new ReadFromFile();
		rff.readFile(0, "spurv"); 
// 0 for navn, spurv for å se etter spurv

	}
}

Dette er kun for at du skal få et inntrykk av hvordan det kan gjøres. søk opp dokumentasjonen på easyIO og prøv deg litt frem. :)

 

edit: Koden blir litt rar å lese her. Tror det er bedre på pastebin -> http://pastebin.com/sD0F04bc

Endret av Stetus
Lenke til kommentar

Jeg ville laget en enkel klasse "BirdObservation" e.l. som håndterer oversetting til/fra en linje med tekst. Kan f.eks. se slik ut (har ikke implementert den, men det er få linjer med kode som trengs):

class BirdObservation {

  public BirdObservation(
    String typeOfBird, String sex, String place, String timeOfObservation)
  {
  }

  public static BirdObservation valueOf(String birdObservation) {
  }

  public String getTypeOfBird()        {}
  public String getSex()               {}
  public String getPlace()             {}
  public String getTimeOfObservation() {}

  @Override
  public String toString() {
  }

}

Da kan du bruke denne klassen både ved skriving til fil (toString()-metoden) og lesing fra fil (valueOf()-metoden). Da blir det også enkelt å sjekke enkeltverdier for en fugleobservasjon med getXxx()-metodene.

Lenke til kommentar

Jeg ville laget en enkel klasse "BirdObservation" e.l. som håndterer oversetting til/fra en linje med tekst. Kan f.eks. se slik ut (har ikke implementert den, men det er få linjer med kode som trengs):

class BirdObservation {

  public BirdObservation(
    String typeOfBird, String sex, String place, String timeOfObservation)
  {
  }

  public static BirdObservation valueOf(String birdObservation) {
  }

  public String getTypeOfBird()        {}
  public String getSex()               {}
  public String getPlace()             {}
  public String getTimeOfObservation() {}

  @Override
  public String toString() {
  }

}

Da kan du bruke denne klassen både ved skriving til fil (toString()-metoden) og lesing fra fil (valueOf()-metoden). Da blir det også enkelt å sjekke enkeltverdier for en fugleobservasjon med getXxx()-metodene.

det må lagres i tekst format som vist i førstepost, så selv om det kanskje hadde vært enklere hvis du kunne lagre objektet, så kompliserer det koden litt mer enn nødvendig for akkurat denne oppgaven så vidt jeg kan skjønne.

Lenke til kommentar

Jepp, tanken var at toString()-metoden leverer teksten slik den blir oppgitt i første post, og valueOf()-metoden oppretter et BirdObservation()-objekt ut fra en slik tekst.

 

Ved lesing fra fil kan (pseudo-)koden se slik ut:

String placeOfBirdObservations = getInputFromUser();
for (String line : file) {
  BirdObservation bo = BirdObservation.valueOf(line);
  if (bo.getPlace().equals(placeOfBirdObservation)) {
    System.out.println(bo.getTypeOfBird() + "\t" + bo.getSex()
            + "\t" + bo.getTimeOfObservation());
  }
}

Tror ikke koden kan bli så mye enklere enn det...?

Endret av jonny
Lenke til kommentar

Jepp, tanken var at toString()-metoden leverer teksten slik den blir oppgitt i første post, og valueOf()-metoden oppretter et BirdObservation()-objekt ut fra en slik tekst.

 

Ved lesing fra fil kan (pseudo-)koden se slik ut:

String placeOfBirdObservations = getInputFromUser();
for (String line : file) {
  BirdObservation bo = BirdObservation.valueOf(line);
  if (bo.getPlace().equals(placeOfBirdObservation)) {
    System.out.println(bo.getTypeOfBird() + "\t" + bo.getSex()
            + "\t" + bo.getTimeOfObservation());
  }
}

Tror ikke koden kan bli så mye enklere enn det...?

 

ser det nå, mer leselig blir det også. :)

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...