我试图将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"));
}
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*ihs 18
尽管使用@ 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++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
让我们一步一步地完成它:
我加了3个进口:ArrayList,Arrays和List-你将很快看到他们所擅长.它们都来自java.util库,这是每个JDK都可用的标准库.
Java中的每个类名都以大写字母开头(按照惯例 - 它也会用小写字母构建,但你应该习惯这个约定) - 我在你的代码中"修复"了这个.
我添加了一个二维数组List<List<String>> lines = new ArrayList<>().这可能看起来有点令人困惑,但这意味着我们创建了一个lines包含解析结果的变量.该List<String>语法意味着,我们有一个泛型类型 List,有一个类型参数String-换句话说:字符串列表.整体List<List<String>>意味着我们有一个字符串列表列表,一个二维字符串数组.
随着lines.add(Arrays.asList(values))在你的while循环中,我们可以添加您解析这个二维数组中的行.Arrays.asList(values)将String[]数组转换为a,List因为我们需要它与我们的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
Run Code Online (Sandbox Code Playgroud)
该程序将打印以下输出:
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
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 :)

我是java新手,并且对任何将csv读入初学者都能理解的文件的方法开放.
以下是来自Apache Commons的现有解决方案,Apache Commons CSV项目.请参阅Apache Commons CSV解析器指南.
开箱即用非常容易.
这是一个基本的worfklow:
如果您不熟悉Java的工作方式List和ArrayList工作原理,请参考几乎所有在线Java教程,包括Oracle教程.
搜索有关使用Commons CSV的数百篇帖子的Stackoverflow.