将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++; } } }
让我们一步一步地完成它:
-
我添加了3个以上的导入:
ArrayList
,Arrays
和List
– 你会很快看到他们的好处。 它们都来自java.util
库,这是每个JDK都可用的标准库。 -
Java中的每个类名都以大写字母开头(按照惯例 – 它也会用小写字母构建,但你应该习惯这个约定) – 我在你的代码中“修复”了这个。
-
我添加了一个二维数组
List
。 这可能看起来有点令人困惑,但这意味着我们创建了一个包含解析结果的变量- > lines = new ArrayList<>()
lines
。List
语法意味着我们有一个generics类型List
,它有一个类型参数String
– 换句话说:一个字符串列表。 整个List
意味着我们有一个字符串列表列表,一个二维字符串数组。- >
-
使用
while
循环中的lines.add(Arrays.asList(values))
,我们可以将您解析的行添加到此二维数组中。Arrays.asList(values)
将String[]
数组转换为List
因为我们需要它与List
类型兼容。 这允许您的行具有可变长度。- >
-
我添加的最后几行只是打印二维数组的内容,并且应该为您提供如何访问此数组中的值的一个很好的示例。 如果您需要有关此构造的进一步帮助,请查看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文件中的行的元素。 您可以自由访问列表中的任何行/元素。
如果您不熟悉List
和ArrayList
如何在Java中工作,请参考几乎所有在线Java教程,包括Oracle Tutorial 。
搜索有关使用Commons CSV的数百篇post的Stackoverflow 。