使用java解析csv文件

使用java解析csv文件,java,parsing,csv,Java,Parsing,Csv,对于Java,我是一个初学者,我试图垂直地提取这些值,并将它们存储在一个带有引用的数据类型中。所以“A”将有1,8,7,6映射到它,前面的日期也将被排除在外。下面是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 这是我的密码。到目前为止,我已经能够单独获取这些行,但是我不知道

对于Java,我是一个初学者,我试图垂直地提取这些值,并将它们存储在一个带有引用的数据类型中。所以“A”将有1,8,7,6映射到它,前面的日期也将被排除在外。下面是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();
        }
}
Java是一种编程语言。我将假设您所谓的“数据结构”是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;
    }
}
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;
    }
}
我只是想展示一些基本的概念

你问

我不知道如何将它们添加到数据结构中

在我的示例中,您将实例化一个
GenericPerson

Person p = new GenericPerson(name,date);
当然,您需要
名称
日期
变量。这就是解析文件的关键所在。所以如果我有一份表格的文件

George Costanza,5/4/1956 Cosmo Kramer,12/12/1960 Jerry Seinfeld,1/2/1959 因此,您可以创建
对象
类型,定义希望它具有的字段。然后通过构造函数或setter方法填充它们。setter方法的一个例子是,如果我像这样修改
GenericPerson

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;
    }
}
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;
    }
}
现在我需要调用它们来设置
对象中的值

对于您的情况,您需要定义一些数据要定义的
对象
类型。该类型将具有类似于
GenericPerson
的字段,并且您需要具有setter方法或构造函数,该构造函数接受与字段对应的参数


我强烈建议java初学者遵循以下步骤。

我花了30分钟才让您的代码正确编译和运行

我使用了我创建的列类的列表。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();
        }

    }

}
package com.ggl.testing;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Scanner;
公共类CSVColumns实现可运行{
公共静态void main(字符串[]args){
新的CSV列().run();
}
@凌驾
公开募捐{
Scanner=openFile();
如果(扫描器!=null){
读取文件(扫描仪);
闭合文件(扫描仪);
}
}
专用扫描仪openFile(){
字符串fileString=“test.csv”;
返回新的扫描程序(getClass().getResourceAsStream(fileString));
}
专用void读取文件(扫描仪){
List columnList=new ArrayList();
字符串a=scanner.nextLine();
a=a.替换(“,”);
字符串[]值=a.split(“,”);
对于(int i=1;i
使用LinkedHashMap存储标题(作为键)。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());
}

您可以使用HashMap在其中添加值。因此,您需要声明一个HashMap,在readFile方法中遍历x,并使用HashMaps put()方法添加值。Ey Alec,请检查:;)有没有办法使按键按字母顺序排列?我更新了这个例子<代码>LinkedHashMap保留插入顺序。TreeMap是按键排序的。
如果您不确定数据插入顺序,只需将LinkedHashMap替换为TreeMap,并获得按字母顺序排序的结果。那么main()类中会有什么?我有点困惑。@Alec:没有主课。这是唯一一个类,有一个主方法来启动流程。