将CSV文件转换为2D数组

时间:2015-10-09 09:36:34

标签: java arrays

我在一维数组中有一个我的想法的例子。它只会输出列。 我的想法是使用2d数组来选择行和列。 这是我的代码:

String fName = "c:\\csv\\myfile.csv";
String thisLine; 
int count=0; 
FileInputStream fis = new FileInputStream(fName);
DataInputStream myInput = new DataInputStream(fis);
int i=0; 

while ((thisLine = myInput.readLine()) != null) {
     String strar[] = thisLine.split(";");
     out.println(strar[1]); // Here column 2
}

myfile.csv

Id;name
E1;Tim
A1;Tom

输出:

  

名字蒂姆汤姆

5 个答案:

答案 0 :(得分:3)

我只是将分割结果(String[])添加到List然后如果你真的想要它作为2d数组,那么在事后将其转换。

List<String[]> lines = new ArrayList<String[]>();
while ((thisLine = myInput.readLine()) != null) {
     lines.add(thisLine.split(";"));
}

// convert our list to a String array.
String[][] array = new String[lines.size()][0];
lines.toArray(array);

答案 1 :(得分:1)

首先我们不知道csv文件中有多少行。因此无法确定2d阵列的长度。我们必须根据这种情况增加数组的大小。但是,通常用java重新调整数组大小是不可能的。因此,当我们需要重新调整数组大小时,我们会创建源数组的新数组和副本内容。

为您解决方案:

int i = 0;//line count of csv
String[][] data = new String[0][];//csv data line count=0 initially
while ((thisLine = myInput.readLine()) != null) {
    ++i;//increment the line count when new line found

    String[][] newdata = new String[i][2];//create new array for data

    String strar[] = thisLine.split(";");//get contents of line as an array
    newdata[i - 1] = strar;//add new line to the array

    System.arraycopy(data, 0, newdata, 0, i - 1);//copy previously read values to new array
    data = newdata;//set new array as csv data
}

创建测试以查看csv数据:

for (String[] strings : data) {
    for (String string : strings) {
        System.out.print("\t" + string);
    }
    System.out.println();
}

<强>输出:

Id  name
E1  Tim
A1  Tom

答案 2 :(得分:0)

我会使用动态结构来读取所有行。您还应该使用try-resource块自动关闭流。

public static String[][] readCSV(String path) throws FileNotFoundException, IOException {
    try (FileReader fr = new FileReader(path);
            BufferedReader br = new BufferedReader(fr)) {
        Collection<String[]> lines = new ArrayList<>();
        for (String line = br.readLine(); line != null; line = br.readLine()) {
            lines.add(line.split(";"));
        }
        return lines.toArray(new String[lines.size()][]);
    }
}

答案 3 :(得分:0)

这是我实现的代码:

String fileName = "myfile.csv";
List<List<String>> list = new ArrayList<List<String>>();
BufferedReader br = new BufferedReader(new FileReader(fileName));
String line = br.readLine();
String[] headers = line.split(";");
for(String header: headers) {
    List<String> subList = new ArrayList<String>();
    subList.add(header);
    list.add(subList);
}
while((line = br.readLine()) != null) {
    String[] elems = line.split(";");
    for(int i = 0; i < elems.length; i++) {
        list.get(i).add(elems[i]);
    }
}
br.close();
int rows = list.size();
int cols = list.get(0).size();
String[][] array2D = new String[rows][cols];
for(int row = 0; row < rows; row++) {
    for(int col = 0; col < cols; col++) {
        array2D[row][col] = list.get(row).get(col);
    }
}

array2D是您的需要。

答案 4 :(得分:0)

我认为您应该看到此代码:

  1. 读取 csv 文件后。
  2. 读取列表中的所有行。
  3. 定义两个数组,一个是一维数组,第二个是二维数组
  4. for 循环到 csv 文件中的记录数(第一个循环)
  5. 将每条记录分成一维数组
  6. for 循环在第一个循环内沿着 csv 文件中的列数
  7. 将一维数组中的每个值分配到二维数组中

代码:

    Path path= Paths.get("url_of_csv_file");
    List<String> arr= Files.readAllLines(path);
    String[] arr2; 
    String[][] arr3= new String[records][columns];
    for(int i=0; i<records; i++){
        arr2= arr.get(i).split("\\,");
    for(int j=0; j<columns; j++)
        arr3[i][j]= arr2[j];
    }
    //test case
    for(int i=0; i<records; i++){
        for(int j=0; j<columns; j++)
            System.out.print(arr3[i][j]+"  ");
        System.out.println();
    }