Avatar billede flodhesten Nybegynder
12. november 2008 - 22:32 Der er 6 kommentarer og
1 løsning

Scanner af teksfil

Hej Eksperter.

Jeg sidder og leger lidt med noget læsning fra tekstfil. Jeg har fundet ud af, at jeg kan bruge scanner til at arbejde med filen.

Jeg har nedenstående kode til at gennemløbe tekstfilen.


FileReader fil = new FileReader("fil.txt");
Scanner sc = new Scanner(fil);
while(sc.hasNextLine()) {
String line = sc.nextLine();
System.out.println(line);
}

Min tekstfil er bygget op sådan her:

fil.txt
_______________________

Game # 2349349876

tekst1 1.54
tekst2 5.22
tekst3 2.89

tekst1 1.54
tekst2 4.54
tekst3 8.54

tekst2 --
tekst3 2.30
tekst1 4.32

tekst1 vinder 43.4
_______________________


Mit spørgsmål er, hvordan det er muligt at få fat i 2349349876 og ned i en variabel som er id'et i toppen.

Jeg ønsker på en måde at få beløbet "43.4" ud af teksten, så jeg kan arbejde med det som en variabel.

Som tillægsspørgsmål, er det muligt at finde summen af alle tallene ud fra tekst1, tekst2 og tekst3?

På forhånd tak.

Jeg uddeler gerne flere point, hvis dette skulle have betydning.
Avatar billede arne_v Ekspert
12. november 2008 - 22:51 #1
Til inspiration:

import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Scanner;

public class Parse {
    public static void main(String[] args) throws IOException {
        FileReader fil = new FileReader("C:\\fil.txt");
        Scanner sc = new Scanner(fil);
        BigDecimal sum = new BigDecimal("0.00");
        while(sc.hasNextLine()) {
            String line = sc.nextLine();
            String[] parts = line.split(" ");
            if(parts.length == 3 && parts[0].equals("Game")) {
                long id = Long.parseLong(parts[2]);
                System.out.println("id=" + id);
            } else if(parts.length == 3 && parts[1].equals("vinder")) {
                BigDecimal amt = new BigDecimal(parts[2]);
                System.out.println("amt=" + amt);
            } else if(parts.length == 2 && !parts[1].equals("--")) {
                BigDecimal v = new BigDecimal(parts[1]);
                sum = sum.add(v);
            }
        }
        fil.close();
        System.out.println("sum=" + sum);
    }
}
Avatar billede flodhesten Nybegynder
12. november 2008 - 23:05 #2
Hmm, spændende.

Hvis man forestiller sig, at teksfilen forsætter:

_____________


Game # 2349349876

tekst1 1.54
tekst2 5.22
tekst3 2.89

tekst1 1.54
tekst2 4.54
tekst3 8.54

tekst2 --
tekst3 2.30
tekst1 4.32

tekst1 vinder 43.4
Slut

Game # 2349349876

tekst1 1.54
tekst2 5.22
tekst3 2.89

tekst1 1.54
tekst2 4.54
tekst3 8.54

tekst2 --
tekst3 2.30
tekst1 4.32

tekst1 vinder 43.4
Slut

Game # 2349349876

tekst1 1.54
tekst2 5.22
tekst3 2.89

tekst1 1.54
tekst2 4.54
tekst3 8.54

tekst2 --
tekst3 2.30
tekst1 4.32

tekst1 vinder 43.4
Slut


_______________

Kan man forestille sig, at man koden læser fra toppen ned til den nærmeste "Slut". Noget ala

while (sc.next() != "Slut") {
Udfør kode
}

Jeg vil nemlig gerne dele koden op så den bliver udført i bidder hvis du forstår.
Avatar billede arne_v Ekspert
12. november 2008 - 23:08 #3
Ja.

Du skal bare have en:

} else id(parts.length == 1 && parts[0].equals("slut")) {
Avatar billede flodhesten Nybegynder
12. november 2008 - 23:23 #4
Det kunne også være interessant hvis man har mulighed for at søge efter om ét bestemt ord optræder, og så finde værdien til højre for dette. Har du en ide om hvordan det kan gøres?

Men jeg kan ligeså godt fortælle hvad hovedformålet er. Jeg spiller nemlig en smule hyggepoker online, og jeg gemmer de forskellige historier. Jeg får derfor en log i txt-format, og det kunne jo være sjovt at udregne lidt på det.

Det eksempel på en log kunne være:


_______________________


Game # 964338615 - Texas Hold'em No Limit EUR 0.02/0.04 - Table "Veenendaal"

Players(max 6):
mare10                      (EUR 2.71 in seat 1)
rabitt                      (EUR 1.39 in seat 2)
Pholst89                    (EUR 4.00 in seat 3)
pokrtg                      (EUR 4.34 in seat 4)
HenkkaO                    (EUR 6.84 in seat 5)
N0R3M0RS                    (EUR 6.59 in seat 6)

Dealer:                    mare10
Small Blind:                rabitt      (0.02)
Big Blind:                  Pholst89    (0.04)

Pholst89 was dealt:        8c - 9c

pokrtg                      Fold
HenkkaO                    Fold
N0R3M0RS                    Call        (0.04)
mare10                      Call        (0.04)
rabitt                      Call        (0.02)
Pholst89                    Check

Flop                        Tc - 6c - 7c

rabitt                      Check
Pholst89                    Check
N0R3M0RS                    Check
mare10                      Check

Turn                        Tc - 6c - 7c - 6s

rabitt                      Bet        (0.04)
Pholst89                    Raise      (0.08)
N0R3M0RS                    Fold
mare10                      Fold
rabitt                      Call        (0.04)

River                      Tc - 6c - 7c - 6s - 4h

rabitt                      Check
Pholst89                    Bet        (0.08)
rabitt                      Fold
Pholst89                    Payback    (0.08)

Pholst89 didn't show hand

Pholst89 wins:              EUR 0.31
Rake:                      EUR 0.01

Game ended 2008-11-12 14:55:34 GMT+01:00

_________________


Hertil har du jo så fint hjulpet mig med at finde id-nummeret og jeg burde vel også kunne finde det beløb "Pholst89 wins:              EUR 0.31" som står til sidst i dokumentet.

Det største problem jeg umiddelbart har, er at jeg skal have lagt de tal sammen der står ud fra hver spiller. For eksempel Pholst89 0.04+0.08+0.08+0.08+0.08. Dette beløb skal nemlig trækkes fra gevinsten i sidste ende, i det en del af egne penge jo er i puljen.



Jeg ved ikke om du har mod på at hjælpe mig lidt på vej. Jeg værdsætter i hvert fald den hjælp du har givet mig ind til videre.
Avatar billede arne_v Ekspert
14. november 2008 - 04:27 #5
Du kan sagtens teste om parts[0].equals("Pholst89 ") men du skal også håndtere de
steder hvor det ikke er et beløb som skal tælles med.

Men hvis du kan beskrive de logiske regler for det, så kan du også kode det.
Avatar billede flodhesten Nybegynder
18. november 2008 - 00:03 #6
Jeg har brugt en masse tid på at udvikle et system, der nu skulle kunne det jeg efterspurgte.

Jeg vil dog sige, at noget af programmet bygget på den hjælp du har givet. Derfor vil jeg bede dig om at poste et svar og så vil jeg uddele point.
Avatar billede arne_v Ekspert
18. november 2008 - 01:25 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester