2015-06-18 153 views
0

我是初學者,談到Java時,我試圖垂直拉取這些值並將它們存儲在數據類型中並與它們的引用相關聯。所以「A」會映射到1,8,7,6,並排除前面的日期。下面是csv文件。使用java解析csv文件

10/1/14, A,B,C,D,E,F,G,H 

10/2/14, 1,2,3,4,5,6,7,8 

10/3/14, 8,1,2,3,4,5,6,7 

10/4/14, 7,8,1,2,3,4,5,6 

10/5/14, 6,7,8,1,2,3,4,5 

這是我的代碼。到目前爲止,我已經能夠單獨獲取行,但是我不知道如何將它們添加到數據結構中。這將返回>> C3218

class Main { 
     public static void main(String[] args) { 
      Read r = new Read(); 
      r.openFile(); 
      r.readFile(); 
      r.closeFile(); 

     } 
    } 

     import java.io.*; 
     import java.util.*; 
     public class Read { 

     private Scanner x; 
     public void openFile() { 
      try { 
       x = new Scanner(new File("test.csv")); 
      } 
      catch(Exception e){ 
       System.out.println("could not find file"); 
      } 

      } 
     public void readFile() { 
      while(x.hasNext()){ 
       String a = x.next(); 
       String[] values = a.split(","); 
       System.out.printf(values[3]); // gets line 
      } 
     } 
     public void closeFile() { 
      x.close(); 
     } 
} 
+0

您可以使用HashMap以那裏添加值。所以你聲明一個HashMap ,在你的readFile方法中遍歷x並使用HashMaps put()方法來添加值。 – ryekayo

+0

Ey Alec,看看這個:http://opencsv.sourceforge.net/;) – Victor

回答

2

Java是Object Oriented編程語言。我將假設你稱之爲「數據結構」是Java中的對象。例如(這些只是一個例子,並不是你特別可以使用您的具體情況),如果我要代表一個人,我可能有這樣的事情

public interface Person{ 
    String getName(); 
    Date getBirthDate(); 
} 

public class GenericPerson implements Person{ 
    private final String name; 
    private final Date bdate; 

    public GenericPerson(String fullName, Date birthdate){ 
     name = fullName; 
     bdate = birthdate; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public Date getBirthDate() { 
     return bdate; 
    } 
} 

相當稀疏,但我只是想展示一些基本概念。

你問

我不知道如何將它們添加到數據結構。

在我的例子,你會實例化一個GenericPerson

Person p = new GenericPerson(name,date); 

當然,你需要的namedate變量。這就是在解析文件的用武之地。所以,如果我有以下形式的文件

George Costanza,5/4/1956 
Cosmo Kramer,12/12/1960 
Jerry Seinfeld,1/2/1959 

然後在我的代碼來解析該文件可能我

String line = scanner.next(); 
String[] values = line.split(","); 
Person p = new GenericPerson(values[0],getDateFormatter().parse(values[1])); 

所以您創建Object類型,定義您想要的字段。然後通過構造函數或setter方法填充它們。的setter方法的一個例子是,如果我修改了GenericPerson這樣

public class GenericPerson implements Person{ 
    private String name; 
    private Date bdate; 

    public void setName(String n){ 
     name = n; 
    } 

    public void setBirthDate(Date d){ 
     bdate = d; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public Date getBirthDate() { 
     return bdate; 
    } 
} 

現在我需要調用那些在Object設定值。

對於您的情況,您需要定義一些數據旨在定義的Object類型。該類型將具有像GenericPerson這樣的字段,並且您需要使用setter方法構造函數,該構造函數接受與字段相對應的參數。

我強烈建議遵循online tutorial爲java初學者。

+1

偉大的迴應! – basic

0

我花了30分鐘才讓您的代碼編譯並正確運行。

我使用了我創建的Column類的列表。 Column類包含該列的名稱和該CSV列中的值。

test.csv文件與Java類位於同一目錄中。

以下是結果。

A: 1, 8, 7, 6 
B: 2, 1, 8, 7 
C: 3, 2, 1, 8 
D: 4, 3, 2, 1 
E: 5, 4, 3, 2 
F: 6, 5, 4, 3 
G: 7, 6, 5, 4 
H: 8, 7, 6, 5 

這裏的代碼。

package com.ggl.testing; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

public class CSVColumns implements Runnable { 

    public static void main(String[] args) { 
     new CSVColumns().run(); 
    } 

    @Override 
    public void run() { 
     Scanner scanner = openFile(); 
     if (scanner != null) { 
      readFile(scanner); 
      closeFile(scanner); 
     } 
    } 

    private Scanner openFile() { 
     String fileString = "test.csv"; 
     return new Scanner(getClass().getResourceAsStream(fileString)); 
    } 

    private void readFile(Scanner scanner) { 
     List<Column> columnList = new ArrayList<>(); 
     String a = scanner.nextLine(); 
     a = a.replace(" ", ""); 
     String[] values = a.split(","); 

     for (int i = 1; i < values.length; i++) { 
      Column column = new Column(values[i]); 
      columnList.add(column); 
     } 

     while (scanner.hasNext()) { 
      a = scanner.nextLine(); 
      a = a.replace(" ", ""); 
      values = a.split(","); 

      for (int i = 0; i < columnList.size(); i++) { 
       Column column = columnList.get(i); 
       column.addValue(Integer.valueOf(values[i + 1])); 
      } 
     } 

     for (int i = 0; i < columnList.size(); i++) { 
      System.out.println(columnList.get(i)); 
     } 
    } 

    private void closeFile(Scanner scanner) { 
     scanner.close(); 
    } 

    public class Column { 
     private List<Integer> values; 

     private final String name; 

     public Column(String name) { 
      this.name = name; 
      this.values = new ArrayList<>(); 
     } 

     public List<Integer> getValues() { 
      return values; 
     } 

     public void addValue(int value) { 
      this.values.add(Integer.valueOf(value)); 
     } 

     public String getName() { 
      return name; 
     } 

     @Override 
     public String toString() { 
      StringBuilder builder = new StringBuilder(); 
      builder.append(name); 
      builder.append(": "); 
      for (int i = 0; i < values.size(); i++) { 
       int value = values.get(i); 
       builder.append(value); 
       if (i < (values.size() - 1)) { 
        builder.append(", "); 
       } 
      } 

      return builder.toString(); 
     } 

    } 

} 
+0

那麼你的main()類會是什麼?我有點困惑。 – BillytheKid

+0

@Alec:沒有主班。這是唯一的一類,有一個主要的方法來開始這個過程。 –

0

使用LinkedHashMap存儲標題(作爲Keys)。 LinkedHashMap的保留插入順序:

public void readFile() { 

    Map<String, String> map = new LinkedHashMap<String, String>(); 
    boolean setInitValues = true, setKeys = true; 
    String[] keys = null; 

    while (x.hasNext()) { 
     String a = x.nextLine(); 
     String[] values = a.split(","); 

     if (setKeys) { // set keys 
      keys = Arrays.copyOfRange(values, 1, values.length); 
      setKeys = false; 
     } else { 
      if (setInitValues) { // set initial values 
       for (int i = 1; i < values.length; i++) 
        map.put(keys[i - 1], values[i].trim()); 
       setInitValues = false; 
      } else 
       // continue appending values 
       for (int i = 1; i < values.length; i++) 
        map.put(keys[i - 1], 
          map.get(keys[i - 1]).concat(values[i].trim())); 
     } 
    } 
    printMap(map); // print what you got 
} 

void printMap(Map<String, String> map) { 
    for (Map.Entry<String, String> entry : map.entrySet()) 
     System.out.println("Key : " + entry.getKey() + " Value : " 
       + entry.getValue()); 
} 

輸出:

Key : A Value : 1876 
Key : B Value : 2187 
Key : C Value : 3218 
Key : D Value : 4321 
Key : E Value : 5432 
Key : F Value : 6543 
Key : G Value : 7654 
Key : H Value : 8765 
+0

有沒有辦法讓鑰匙按字母順序排列? – BillytheKid

+0

我已更新示例。 'LinkedHashMap保留插入順序。 TreeMap按鍵排序。如果您不確定數據插入順序,只需使用TreeMap替換LinkedHashMap並獲得按字母順序排序的結果。 – Rajesh