将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")); } } 

尽管使用@ 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> 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 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中的每个类名都以大写字母开头(按照惯例 – 它也会用小写字母构建,但你应该习惯这个约定) – 我在你的代码中“修复”了这个。

  3. 我添加了一个二维数组List> lines = new ArrayList<>() 。 这可能看起来有点令人困惑,但这意味着我们创建了一个包含解析结果的变量linesList语法意味着我们有一个generics类型 List ,它有一个类型参数String – 换句话说:一个字符串列表。 整个List>意味着我们有一个字符串列表列表,一个二维字符串数组。

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

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

将此作为输入文件( 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 

希望这可以帮助 :)

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

以下是Apache Commons , Apache Commons CSV项目的现有解决方案。 请参阅Apache Commons CSV解析器指南 。

开箱即用非常容易。

这是一个基本的worfklow:

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

如果您不熟悉ListArrayList如何在Java中工作,请参考几乎所有在线Java教程,包括Oracle Tutorial 。

搜索有关使用Commons CSV的数百篇post的Stackoverflow 。