O l e 3 1 2. 2 \n I b 1 1 1 1 7 \n. Ole 312.2 Ib 11117 TT_EOF. Ole 312.2. Ib 11117. Overview Tekstfiler, tegn og brikker



Relaterede dokumenter
Hanne Niels Edith Harald Carsten Jørgen Henrik.

Kursus navn: Indledende programmering Kursus nr

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Eksempel: Skat i år 2000

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Skriftlig eksamen i Datalogi

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Løsning af møntproblemet

FÅ OVERBLIK OVER LØNNEN EXCEL FOR TILLIDSREPRÆSENTANTER DEL 4: FORMATERING AF REGNEARKET INFORMATIONSBOKS

Aritmetiske Forelæsning Pr ogrammering operatorer tir 1999 sda præcedens september 1999 Logiske Sammenligningsoperatorer operatorer præcedens

Modul 13, Word 2 Idégrundlag / Afsnit

14.1 Internationale programmer

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Tree klassen fra sidste forelæsning

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Excel formler og funktioner. Underviser: Nina Kirkegaard Schou Mobil:

SPØRGESKEMAUNDERSØGELSE

Eksempel på en database: studenter, kurser, eksamener

Find største element, sæt det på sidste plads. Grundidé i hobsortering. er er

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Databaseadgang fra Java

CD-DIRECT Eksport til MS-Office

Arduino kursus lektion 4:

Generisk programmering - opgave 2 - Doxygen

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

Ordbogsværktøjet mikrov.dk

Start med at vælge hvilken afdeling der skal laves ændringer i f.eks. fodbold.

BRP Kursusintroduktion og Java-oversigt

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Tekniske forudsætninger For at anvende programmet kræver det at programmet kører på et WINDOWs styresystem.

Alf og Alfabetet. - lær bogstaver, ord og begreber. Vejledning

Abstrakte datatyper C#-version

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Virkefeltsregler i Java

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Programmering i C. Lektion december 2008

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

Offset til terminalskærm i Java

Løsning af skyline-problemet

Projekt 4.8. Kerners henfald (Excel)

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

Vejledning til Photofiltre nr.129 Side 1

Python 3 Matematik Programmerings kursus:

Kom godt i gang med Fronter

Programmering. Udvidet Programmering. Kurserne. Kurset: programmering i sproget Java. Lærerne: Morten Larsen og Peter Sestoft

Der er fejl i programmer. Ikke-trivielle programmer er næsten altid fejlbehæftede.

Jacob Christiansen, Institut for MAtematik og DAtalogi, Syddansk Universitet, Odense

Grafteori, Kirsten Rosenkilde, september Grafteori

DANMARKS TEKNISKE UNIVERSITET

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 13/ Side 1 af 7

Indsend dit dagpenge- eller efterlønskort via web a- kassen på

Regneark II Calc Open Office

Integer.parseInt(args[0]) konverterer tegnstreng (f.eks. "10") til heltal (10). if (udtryk) else

Potens & Kvadratrod. Navn: Klasse: Matematik Opgave Kompendium. Opgaver: 22 Ekstra: 4 Point: Matematik / Potens & Kvadratrod

Datalogi OB, Efterår 2002 OH er, forelæsning 3/ forstå datastrukturer og algoritmer (teoretisk forståelse og intuition)

Vejledning: Anvendelse af kuber på SLS-data fra LDV i Excel Målgruppe: Slutbruger

Java Programmering. En bog for begyndere. Skrevet af Henrik Kressner

Om binære søgetræer i Java

Workshop W2 Tasks og Templates

Tal, funktioner og grænseværdi

W8 Project Explorer. Introduktion til Project Explorer Oprettelse af link sets Forskellige typer af links Kobling til andre dele af MicroStation

18 Multivejstræer og B-træer.

Vejledning til dagpengekortet på Selvbetjeningen

Vejledning for anvendelse af PensionsIndberetningssystem PI

Programmering C. Casper Hermansen Klasse 2.7 Programmering C. Navn: Casper Hermansen. Klasse: 2.7. Fag: Programmering C

Perspektiverende Datalogi Internetalgoritmer. MapReduce. Gerth Stølting Brodal

Variabel- sammenhænge

Videregående programmering i Java

Talrækker. Aktivitet Emne Klassetrin Side

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Kundeværdi og værdistrømme

DATALOGI 0GB. Skriftlig eksamen tirsdag den 6. januar 2004

Webserverprogrammering

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

Ligninger med reelle løsninger

Miniprojekt 3: Fejlkorligerende køder Fejlkorrigerende koder

Parallelle algoritmer

Ældresagen datastue Aktivitetsteltscentret Bavnehøj Nørre Snede Tema: Internettet på ipad. Tema. Internettet. på ipad Opdateret 29.

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

Dag 10 Flertrådet programmering

Anvendelse af metoder - Programmering

19 Hashtabeller. Noter. PS1 -- Hashtabeller. Hashing problemet. Hashfunktioner. Kollision. Søgning og indsættelse.

DM502. Peter Schneider-Kamp

Videregående programmering i Java

UNI Login brugeradministration. - fra Lectio til UNI Login

Manual til de lokale webredaktører

Indsend dine ydelseskort via web a-kassen på

DM02 opgaver ugeseddel 2

En hæklet havfruehale

Singleton pattern i Java

Hvis du har den i mappen i forvejen skal du ikke hente den en gang til. Nu skal baggrundsbilledet laves, så tryk på NY på ikonen foroven.

Arealer under grafer

SWC Elementer i klassedefinition

Transkript:

Programmering 1999 Forelæsning 8, fredag 24. september 1999 Overview Tekstfiler, tegn og brikker StreamTokenizer: indlæsning fra tekstfiler Formateret udskrift Programmering 1999 KVL Side 8-1 Tekstfiler En tekstfil er en tegnfølge, lagret på disk eller diskette. Tekstfiler hedder typisk A:\addrlist.txt, C:\java\numbers.txt og lignende. Tekstfiler kan bruges til at lagre tekster (ord) såvel som tal. Regneark (Excel), statistikpakker (SAS), og tekstbehandlingsprogrammer kan læse og skrive tekstfiler. Det er nyttig at kunne læse og skrive tekstfiler fra Java programmer også. (Java appletter kan normalt ikke læse og skrive tekstfiler på den lokale disk eller diskette). Programmering 1999 KVL Side 8-2 En tekstfil er en sekvens af tegn Tekstfilen Ole 312.2 Ib 11117 består af 19 tegn: O l e 3 1 2. 2 \n I b 1 1 1 1 7 \n Programmering 1999 KVL Side 8-3 Brikker (tokens) Når vi skal læse tekstfiler er vi normalt interesserede i tal og ord, ikke i de enkelte tegn. Normalt er vi ligeglade med mængden af blanktekst: blanktegn, linieskift og tabulatortegn. Tal og ord kaldes brikker, på engelsk tokens. Brikker adskilles normalt af blanktekst. De 19 tegn i filen udgør 4 brikker: Ole 312.2 Ib 11117 TT_EOF En særlig brik TT_EOF betyder filslut (end of file). Programmering 1999 KVL Side 8-4

Eksempel: Læsning og addition af nogle tal En tekstfil "numbers.txt": 14.5 20 18 19.1 Filen indeholder 4 brikker (samt den særlige filslutbrik TT_EOF): 14.5 20 18 19.1 TT_EOF Vi vil læse alle tallene fra filen "numbers.txt" og lægge dem sammen. Programmering 1999 KVL Side 8-5 Hvordan samle tegn til brikker: StreamTokenizer Den indbyggede klasse StreamTokenizer gør det nemt at læse tal fra en tekstfil. Sådan åbnes filen numbers.txt og omdannes til en strøm tstream af brikker: Reader inp = new FileReader("numbers.txt"); StreamTokenizer tstream = new StreamTokenizer(inp); Brikstrømmen tstream er et objekt af klasse StreamTokenizer. Vi ønsker at læse tal som tal, ikke som ord: tstream.parsenumbers(); Metoder og felter i StreamTokenizer tstream.nexttoken() læser den næste brik (til at begynde med er næste brik blot første brik). tstream.ttype er typen af den aktuelle brik. tstream.nval er talværdien af den aktuelle brik (som double). tstream.sval er strengværdien af den aktuelle brik (som String). Brug StreamTokenizer snarere end StringTokenizer (der bruges i lærebogen). Programmering 1999 KVL Side 8-6 Hvordan læse og addere tallene Læs filen, en brik ad gangen, indtil aktuelle brik er TT_EOF. For hver talbrik der læses, forøg sum med dette tal: Reader inp = new FileReader("numbers.txt"); StreamTokenizer tstream = new StreamTokenizer(inp); tstream.parsenumbers(); double sum = 0; tstream.nexttoken(); while (tstream.ttype!= StreamTokenizer.TT_EOF) sum += tstream.nval; tstream.nexttoken(); System.out.println(sum); Programmering 1999 KVL Side 8-7 Hele historien import java.io.*; public class Filesum public static void main(string[] args) throws IOException Reader inp = new FileReader("numbers.txt"); // 1 double sum = 0; // 4 tstream.nexttoken(); // 5 while (tstream.ttype!= StreamTokenizer.TT_EOF) // 6 sum += tstream.nval; // 7 tstream.nexttoken(); // 8 System.out.println(sum); Erklæringen import java.io.*; skal angives foran klasser der læser fra filer. Erklæringen throws IOException skal angives i metoder der læser fra filer. Det fortæller at metoden kan forårsage en undtagelse (eng. exception ), f.eks. hvis filen ikke findes. Programmering 1999 KVL Side 8-8

Indlæsning linie for linie Antag vi ønsker at finde summen for hver linie. Så skal linieskift ikke behandles som blanktekst, men som en særlig brik. I såfald svarer tekstfilen 14.5 20 18 19.1 til disse brikker 14.5 20 18 TT_EOL 19.1 TT_EOL TT_EOF Programmering 1999 KVL Side 8-9 Indlæsning linie for linie i Java Reader inp = new FileReader("numbers.txt"); // 1 tstream.eolissignificant(true); // A tstream.nexttoken(); // B while (tstream.ttype!= StreamTokenizer.TT_EOF) // C double sum = 0; // D while (tstream.ttype!= StreamTokenizer.TT_EOL) // E sum += tstream.nval; // F tstream.nexttoken(); // G System.out.println(sum); // H tstream.nexttoken(); // I Den ydre while-løkke gennemløbes én gang for hver linie. Den indre while-løkke gennemløbes én gang for hver tal på linien. tstream.eolissignificant(true) siger at linieskift skal blive til brikken TT_EOL Programmering 1999 KVL Side 8-10 Hele historien import java.io.*; public class Linesum public static void main(string[] args) throws IOException Reader inp = new FileReader("numbers.txt"); // 1 tstream.eolissignificant(true); // A tstream.nexttoken(); // B while (tstream.ttype!= StreamTokenizer.TT_EOF) // C double sum = 0; // D while (tstream.ttype!= StreamTokenizer.TT_EOL) // E sum += tstream.nval; // F tstream.nexttoken(); // G System.out.println(sum); // H tstream.nexttoken(); // I Programmering 1999 KVL Side 8-11 T yper af brikker En StreamTokenizer finder automatisk typen for hver brik. Der er fire slags brikker: TT_NUMBER tal TT_WORD ord TT_EOL linieskift (end of line) TT_EOF filslut (end of file) Man kan undersøge om den aktuelle brik er et tal med if (tstream.ttype == TT_NUMBER)... I såfald er tstream.nval brikkens talværdi (som double). Man kan undersøge om den aktuelle brik er et ord med if (tstream.ttype == TT_WORD)... I såfald er tstream.sval brikkens værdi (som String). Programmering 1999 KVL Side 8-12

Formateret udskrift Rå udskrift fra et program kan se ret rodet ud. For eksempel, en liste af byer og deres beregnede gennemsnitstemperaturer: Odense 17.5 Assens 19.1 Slagelse 19.775000000000002 Longyearbyen 8.7 Der er to problemer: Tallene udskrives med varierende (og urealistisk) nøjagtighed. Brug klassen DecimalFormat til at styre antallet af cifre efter decimalsymbolet. Dataene er ikke opstillet i søjler. Det nedsætter læseligheden. Brug metoder til at udvide strenge med blanke til venstre eller højre. Programmering 1999 KVL Side 8-13 Formatering af tal med DecimalFormat For at udskrive d med to cifre efter decimalsymbolet: DecimalFormat fmt = new DecimalFormat("0.00"); System.out.println(fmt.format(3.1415926)); Dette udskriver strengen 3.14. Konstruktoren DecimalFormat opretter et formateringsobjekt ud fra et formatmønster. Formateringsobjektet kan derefter bruges til at formatere tal. Betydningen af formatmønstre: Tegn Betydning # vilkårlig mange cifre; nuller blanke 0 mindst ét ciffer; nuller vises. decimalsymbol (punktum eller komma), tusind-adskiller (ciffergruppering) Programmering 1999 KVL Side 8-14 Nogle typiske formatmønstre (US English) Format patterns Number # #.# #.## 0.0 0.0# 0.00 000.0 #,##0.00 0.0 0 0.0 0.0 0.00 000.0 0.00 0.1 0.1.1 0.1 0.1 0.10 000.1 0.10 1.0 1 1 1 1.0 1.0 1.00 001.0 1.00 1.1 1 1.1 1.1 1.1 1.1 1.10 001.1 1.10-1.1-1 -1.1-1.1-1.1-1.1-1.10-001.1-1.10 330.8 331 330.8 330.8 330.8 330.8 330.80 330.8 330.80 1234.516 1235 1234.5 1234.52 1234.5 1234.52 1234.52 1234.5 1,234.52 Programmering 1999 KVL Side 8-15 Eksempel på formatering af valuta Et formateringsobjekt kan bruges mange gange. import java.text.*; public class Format2 public static void main(string[] args) DecimalFormat fmt = new DecimalFormat("#,##0.00"); double[] arr = 0, 0.1, 1.0, 1.1, -1.1, 330.8, 1234.516 ; for (int i=0; i < arr.length; i++) System.out.println(fmt.format(arr[i])); Dette program udskriver den sidste søjle i tabellen ovenfor. Erklæringen import java.text.*; skal med når man bruger DecimalFormat. Programmering 1999 KVL Side 8-16

Tvungne talformater I Danmark bruges komma, som decimalsymbol og punktum. som tusind-adskiller. Britiske og amerikanske konventioner gør det modsatte. Brug dansk til at publicere på dansk, og til at skrive tekstfiler som skal kunne læses af f.eks. Excel (i Danmark). Man kan styre DecimalFormat i detaljer på denne måde: import java.text.*; public class Format3 public static void main(string[] args) DecimalFormatSymbols decsyms = new DecimalFormatSymbols(); decsyms.setdecimalseparator(, ); decsyms.setgroupingseparator(. ); DecimalFormat fmt = new DecimalFormat("#,##0.00", decsyms); double[] arr = 0, 0.1, 1.0, 1.1, -1.1, 330.8, 1234.516 ; for (int i=0; i < arr.length; i++) System.out.println(fmt.format(arr[i])); Programmering 1999 KVL Side 8-17 Det giver 0,00 0,10 1,00 1,10-1,10 330,80 1.234,52 Programmering 1999 KVL Side 8-18 Opstilling i søjler: udvidelse af strenge med blanke For at (højre)stille tal i søjler skal man udvide dem med blanke til venstre. (Den slags formatering sker automatisk i Excel og SAS.) Denne metode bruger en StringBuffer til gøre strengen s lang nok ved at tilføje blanke: public static String padleft(string s, int width) int filler = width - s.length(); if (filler > 0) // and therefore width > 0 StringBuffer res = new StringBuffer(width); for (int i=0; i<filler; i++) res.append( ); return res.append(s).tostring(); else return s; StringBufferen oprettes med plads til width tegn af hensyn til effektiviteten. Programmering 1999 KVL Side 8-19 Udfyldning af strenge til højre Søjlerne længere til højre kan kun opstilles pænt hvis teksten til venstre fylder lige meget på hver linie. For at udskrive tekst (venstrestillet) så den fylder et bestemt antal pladser, udvides den til højre: public static String padright(string s, int width) int filler = width - s.length(); if (filler > 0) // and therefore width > 0 StringBuffer res = new StringBuffer(width).insert(0, s); for (int i=0; i<filler; i++) res.append( ); return res.tostring(); else return s; Programmering 1999 KVL Side 8-20

Et fuldstændigt eksempel på læsning og formatering Læs en fil places.txt med byer og temperaturobservationer i dette format: Odense 14.5 20 18 Assens 19.1 Slagelse 23.1 25.1 12.1 18.8 Longyearbyen 8.1 10.2 7.8... Beregn og udskriv gennemsnittet af tallene for hver by. Programmering 1999 KVL Side 8-21 import java.io.*; import java.text.decimalformat; public class ReadAndWrite public static void main(string[] args) throws FileNotFoundException, IOException // 0 Reader inp = new FileReader("places.txt"); // 1 tstream.eolissignificant(true); // 4 tstream.nexttoken(); // 5 while (tstream.ttype!= StreamTokenizer.TT_EOF) // 6 double sum = 0; // 7 int count = 0; // 8 String name = tstream.sval; // 9 tstream.nexttoken(); // 10 while (tstream.ttype!= StreamTokenizer.TT_EOL) // 11 sum += tstream.nval; // 12 count++; // 13 tstream.nexttoken(); // 14 double avg = sum / count; // 15 DecimalFormat fmt = new DecimalFormat("0.00"); // 16 System.out.println(padRight(name, 30) // 17 + padleft(fmt.format(avg), 10)); // 18 tstream.nexttoken(); // 19... Programmering 1999 KVL Side 8-22 Uddata er Odense 17.50 Assens 19.10 Slagelse 19.78 Longyearbyen 8.70... Programmering 1999 KVL Side 8-23 Læs noterne Text files in Java Husk Brug StreamTokenizer til at læse data fra tekstfiler StreamTokenizer laver en strøm af tegn til en strøm af brikker (tokens) Brug DecimalFormat til at formatere tal med en given præcision (når den en gang kommer til at virke ordentligt) Brug metoderne padleft og padright til simpel opstilling i søjler Programmering 1999 KVL Side 8-24