将csv文件读入数组

时间:2016-10-16 20:02:31

标签: java arrays csv

我正在尝试将csv文件“read_ex.csv”读入数组。我在web / stackoverflow上无休止地搜索,找到一种方法将文件读入数组。我能做的最好的是以流式方式读取它,但由于文件的大小可变,我无法将其存储在数组中。我相信ArrayList是一种处理可变大小数组的方法,但我不知道如何使用它。基本上我希望能够在while循环结束后访问String数组“values”。

import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.File;

public class sortarray {
     public static void main (String []agrs){
         String fileName= "read_ex.csv";
         File file= new File(fileName);


         try{
             Scanner inputStream= new Scanner(file);
             while(inputStream.hasNext()){
             String data= inputStream.next();
             String[] values = data.split(",");
             System.out.println(values[1]);
             }
             inputStream.close();
          }catch (FileNotFoundException e) {
             e.printStackTrace();
     }
     //This prints out the working directory
     System.out.println("Present Project Directory : "+ System.getProperty("user.dir"));

    }           

}

3 个答案:

答案 0 :(得分:17)

尽管使用@ Minjun.Y提到的Apache CSV库非常好,但我尝试提供更接近您的代码的解决方案,并且可能更容易让您遵循:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class CsvParser {

    public static void main(String[] args) {
        String fileName= "read_ex.csv";
        File file= new File(fileName);

        // this gives you a 2-dimensional array of strings
        List<List<String>> lines = new ArrayList<>();
        Scanner inputStream;

        try{
            inputStream = new Scanner(file);

            while(inputStream.hasNext()){
                String line= inputStream.next();
                String[] values = line.split(",");
                // this adds the currently parsed line to the 2-dimensional string array
                lines.add(Arrays.asList(values));
            }

            inputStream.close();
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // the following code lets you iterate through the 2-dimensional array
        int lineNo = 1;
        for(List<String> line: lines) {
            int columnNo = 1;
            for (String value: line) {
                System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value);
                columnNo++;
            }
            lineNo++;
        }
    }

}

让我们一步一步地完成它:

  1. 我添加了3个以上的导入:ArrayListArraysList - 您很快就会看到它们的优点。它们都来自java.util库,这是每个JDK都可用的标准库。

  2. Java中的每个类名都以大写字母开头(按照惯例 - 它也会用小写字母构建,但你应该习惯这个约定) - 我&#34;修复&#34;在你的代码中。

  3. 我添加了一个二维数组List<List<String>> lines = new ArrayList<>()。这可能看起来有点令人困惑,但这意味着我们创建了一个变量lines来保存解析的结果。 List<String>语法表示我们有generic type List,其类型参数为String - 换言之:字符串列表。整个List<List<String>>表示我们有一个字符串列表列表,一个二维字符串数组。

  4. 使用lines.add(Arrays.asList(values))循环中的while,我们可以将您解析的行添加到此二维数组中。 Arrays.asList(values)会将String[]数组转换为List,因为我们需要它与List<List<...>>类型兼容。这允许您的行具有可变长度。

  5. 我添加的最后几行只是打印二维数组的内容,应该为您提供一个很好的示例来说明如何访问此数组中的值。如果您需要有关此结构的进一步帮助,请查看foreach loop documentation

  6. 将此作为输入文件(read_ex.csv):

    value_1-1,value_1-2,value_1-3,value_1-4
    value_2-1,value_2-2,value_2-3,value_2-4
    value_3-1,value_3-2,value_3-3,value_3-4
    value_4-1,value_4-2,value_4-3,value_4-4
    value_5-1,value_5-2,value_5-3,value_5-4
    

    程序将打印以下输出:

    Line 1 Column 1: value_1-1
    Line 1 Column 2: value_1-2
    Line 1 Column 3: value_1-3
    Line 1 Column 4: value_1-4
    Line 2 Column 1: value_2-1
    Line 2 Column 2: value_2-2
    Line 2 Column 3: value_2-3
    Line 2 Column 4: value_2-4
    Line 3 Column 1: value_3-1
    Line 3 Column 2: value_3-2
    Line 3 Column 3: value_3-3
    Line 3 Column 4: value_3-4
    Line 4 Column 1: value_4-1
    Line 4 Column 2: value_4-2
    Line 4 Column 3: value_4-3
    Line 4 Column 4: value_4-4
    Line 5 Column 1: value_5-1
    Line 5 Column 2: value_5-2
    Line 5 Column 3: value_5-3
    Line 5 Column 4: value_5-4
    

    希望这会有所帮助:)

答案 1 :(得分:8)

  

我是java的新手,并且可以对任何将csv读入初学者可以理解的文件的方法开放。

以下是来自Apache Commons Apache Commons CSV项目的现有解决方案。请参阅Apache Commons CSV parser guide

开箱即用非常方便。

这是一个基本的问题:

  • 创建一个具有“匹配”csv文件列的字段的类。
  • csv中的每一行都是该类的一个对象,其属性对应于csv中的字段。使用库获取每个字段并将其存储在循环中的对象中。
  • 在循环中,您将使用从ArrayList中的csv读取的字段/属性存储对象
  • 循环结束后,您的ArrayList将具有“匹配”csv文件中的行的元素。您可以自由访问列表中的任何行/元素。

如果您不熟悉ListArrayList在Java中的工作原理,请参阅几乎所有在线Java教程,包括Oracle Tutorial

Search Stackoverflow有关使用Commons CSV的数百篇帖子。

答案 2 :(得分:0)

要将csv文件解析为数组,请使用以下代码。

const csv = require('csv-parser');
    const fs = require('fs');
    
    var csvData = [];
    var apiNames = [];
    fs.createReadStream("APIsName.csv")
    .pipe(csv(['ID',"API"]))
      .on('data', function (csvrow) {
        csvData.push(csvrow);
      })
      .on('end', function () {
    
        for (i = 0; i < 5; i++) {
    
          console.log(csvData);
        }
        for(y=0;y<apiNames.length;y++){
          console.log(apiNames[y].names);
        }
      });