diff --git a/Asiakas.java b/Asiakas.java
index c6a659e64cec6a5224bd78130ddd7cab4075d3d3..9178818a942b30fad8ecdd3d2931f10a2d844d9a 100644
--- a/Asiakas.java
+++ b/Asiakas.java
@@ -67,4 +67,9 @@ public class Asiakas {
 
         return data;
     }
+
+    @Override
+    public String toString() {
+        return nimi + " (" + asiakasNumero + "), ostoja tehty: " + ostojaTehty;
+    }
 }
diff --git a/VerkkokauppaIO.java b/VerkkokauppaIO.java
index 6cfeaae2dc0c3b3ae2f61ec39622753f8dbffe7c..7ece477638f92dfbe4305629740365af1bf4c584 100644
--- a/VerkkokauppaIO.java
+++ b/VerkkokauppaIO.java
@@ -1,6 +1,8 @@
+import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Scanner;
 
 /**
  * Luokkaa käytetään verkkokaupan tietojen tallentamiseen
@@ -11,24 +13,42 @@ import java.util.ArrayList;
 public class VerkkokauppaIO {
 
     public static void main(String[] args) {
-        ArrayList<Asiakas> al = new ArrayList<>();
-        al.add(new Asiakas("12345", "Antti Asiakas", 10));
-        al.add(new Asiakas("54321", "Anna Asiakas", 55.50));
-        al.add(new Asiakas("99999", "Keijo Keksitty", 1000));
-        kirjoitaAsiakkaat(al, "asiakkaat.csv");
+        ArrayList<Asiakas> al = lueAsiakkaat("asiakkaat.csv");
+        for (Asiakas as : al) {
+            System.out.println(as);
+        }
     }
 
     private static final String EROTIN = ";";
 
-    public static void kirjoitaTiedosto(String tiedostonimi,
+    public static void kirjoitaTiedosto(String tiedostonNimi,
                                         String sisalto) {
-        try (PrintWriter tiedosto = new PrintWriter(tiedostonimi)){
+        try (PrintWriter tiedosto = new PrintWriter(tiedostonNimi)) {
             tiedosto.write(sisalto);
         } catch (FileNotFoundException e) {
             System.out.println("Tapahtui virhe: " + e);
         }
     }
 
+    /**
+     * Lukee annetun nimisen tiedoston sisällön ja palauttaa sen listassa.
+     * Jokainen listan alkio vastaa yhtä tiedoston riviä
+     *
+     * @param tiedostonNimi luettavan tiedoston nimi
+     * @return tiedoston sisällön listana
+     */
+    public static ArrayList<String> lueTiedosto(String tiedostonNimi) {
+        ArrayList<String> data = new ArrayList<>();
+        try (Scanner lukija = new Scanner(new File(tiedostonNimi))) {
+            while (lukija.hasNextLine()) {
+                data.add(lukija.nextLine());
+            }
+        } catch (FileNotFoundException e) {
+            System.out.println("Tapahtui virhe: " + e);
+        }
+        return data;
+    }
+
     public static void kirjoitaAsiakkaat(ArrayList<Asiakas> asiakasLista,
                                          String tiedostonNimi) {
         String data = "";
@@ -42,4 +62,40 @@ public class VerkkokauppaIO {
         }
         kirjoitaTiedosto(tiedostonNimi, data);
     }
+
+    /**
+     * Palauttaa uuden asiakasolion annetun datarivin perusteella.
+     * Rivillä tulee olla asiakasnumero, nimi ja tehdyt ostot tässä
+     * järjestyksessä erotettuna merkillä
+     * <code>VerkkokauppaIO.EROTIN</code>
+     *
+     * @param data datarivi, josta tiedot parsitaan
+     * @return uuden Asiakas-olion dataan perustuen
+     */
+    public static Asiakas parsiAsiakas(String data) {
+        String[] tiedot = data.split(VerkkokauppaIO.EROTIN);
+        // Tässä vaiheessa tulee tietää tietojen järjestys
+        String asNro = tiedot[0];
+        String nimi = tiedot[1];
+        double ostot = Double.parseDouble(tiedot[2]);
+
+        return new Asiakas(asNro, nimi, ostot);
+    }
+
+    /**
+     * Metodi lukee asiakkaat annetun nimisestä tiedostosta ja
+     * palauttaa sisällön mukaisen listan Asiakas-olioita.
+     *
+     * @param tiedostonNimi luettavan tiedoston nimi
+     * @return tiedostosta luetut asiakasoliot listana
+     */
+    public static ArrayList<Asiakas> lueAsiakkaat(String tiedostonNimi) {
+        ArrayList<Asiakas> asiakkaat = new ArrayList<>();
+        ArrayList<String> data = lueTiedosto(tiedostonNimi);
+        for (String adata : data) {
+            Asiakas as = parsiAsiakas(adata);
+            asiakkaat.add(as);
+        }
+        return asiakkaat;
+    }
 }
diff --git a/out/production/oop-demo4-esimerkit/Asiakas.class b/out/production/oop-demo4-esimerkit/Asiakas.class
index 8d66874338bf10573804c188c2075e9e02d7a5a5..85d16ee117f6acd78e9dd398a8cb9a14530169c8 100644
Binary files a/out/production/oop-demo4-esimerkit/Asiakas.class and b/out/production/oop-demo4-esimerkit/Asiakas.class differ
diff --git a/out/production/oop-demo4-esimerkit/VerkkokauppaIO.class b/out/production/oop-demo4-esimerkit/VerkkokauppaIO.class
index 900e0521212ee65fa1f8a84dfb34ad262b402a2f..e98deee2fbc1fe5ead5f5bd6b4dcc83bc26bb4f3 100644
Binary files a/out/production/oop-demo4-esimerkit/VerkkokauppaIO.class and b/out/production/oop-demo4-esimerkit/VerkkokauppaIO.class differ
diff --git a/out/production/oop-demo4-esimerkit/asiakkaat.csv b/out/production/oop-demo4-esimerkit/asiakkaat.csv
new file mode 100644
index 0000000000000000000000000000000000000000..84638ea1e5440e9c67f7d85b95a0631fe8b34b0e
--- /dev/null
+++ b/out/production/oop-demo4-esimerkit/asiakkaat.csv
@@ -0,0 +1,3 @@
+12345;Antti Asiakas;10.0
+54321;Anna Asiakas;55.5
+99999;Keijo Keksitty;1000.0
\ No newline at end of file