为输入文件的每一列创建动态列表

时间:2015-12-29 12:32:51

标签: java list file

我需要创建一个可以创建数据图形表示的工具。 我需要查看输入文件,该文件可以是具有不同列数的任何.txt或.csv,之后,用户可以选择要在图表上表示的数据。

我们说我有一个像这样的输入文件:

Column1;Row1;50;20;Column5 
Column1;Row2;60;30;Column5
Column1;Row3;70;40;Column5
Column1;Row4;80;50;Column5
Column1;Row5;90;60;Column5

我需要为输入文件的每一列创建一个列表。对于此示例,要创建5个列表。如果它有10列可以创建10个列表。 我尝试了列表列表,但我不知道如何动态创建对象:

try {
            fis = new FileInputStream("C:/Users/User/Desktop/test1.txt");
            reader = new BufferedReader(new InputStreamReader(fis));


            String line = reader.readLine();
            String[] column = line.split(";");
            while(line != null){
                singleList.add(column[0]);
                line = reader.readLine();
            } 
            listOfLists.add(singleList);

任何人都可以帮助我吗?如果你能用一个特定的例子(我在Java中有点新的话)。

2 个答案:

答案 0 :(得分:1)

请不要使用自定义实现

opencsv

Apache Commons CSV

使用opencsv

的示例
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.opencsv.CSVReader;

/**
 *
 * @author V.Ladynev
 */
public class Example {

    public static void main(String[] args) throws Exception {
        // Build reader instance
        CSVReader reader = new CSVReader(
                new FileReader("C:/Users/User/Desktop/test1.txt"), ';', '"');
        // Read all rows at once
        List<String[]> allRows = readAll(reader);

        int colsCount = size(first(allRows));
        if (colsCount == 0) {
            return;
        }

        List<List<String>> result = new ArrayList<List<String>>();

        for (int colIndex = 0; colIndex < colsCount; colIndex++) {
            List<String> col = new ArrayList<String>();
            for (String[] row : allRows) {
                col.add(get(row, colIndex));
            }
            result.add(col);
        }

        System.out.println(Arrays.toString(result.toArray()));
    }

    public static List<String[]> readAll(CSVReader reader) throws IOException {
        try {
            return reader.readAll();
        } finally {
            reader.close();
        }
    }

    public static <T> T first(List<T> items) {
        return items == null || items.size() == 0 ? null : items.get(0);
    }

    public static <T> int size(T[] array) {
        return array == null ? 0 : array.length;
    }

    public static <T> T get(T[] array, int index) {
        return size(array) > index ? array[index] : null;
    }

}

答案 1 :(得分:1)

我想这就是你想要的:

FileInputStream fis = new FileInputStream("C:/Users/User/Desktop/test1.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));

List<List<String>> listOfList = new ArrayList<>();

String line = reader.readLine();
String[] column = line.split(";");

//initial
for(int i = 0; i<column.length;i++){
    listOfList.add(new ArrayList<String>());
}

while(line != null){
    column = line.split(";");
    for(int i = 0; i<column.length;i++){
        istOfList.get(i).add(column[i]);
    }

    line = reader.readLine();
}

System.out.println(listOfList);