读取Java中的CSV文件并将值存储在int数组中
我有一个CSV字符串文件,格式如下:读取Java中的CSV文件并将值存储在int数组中,java,csv,Java,Csv,我有一个CSV字符串文件,格式如下: 14/10/2011 422 391.6592 394.52324 0.039215686 13/10/2011 408.43 391.7612 395.0686031 0.039215686 12/10/2011 402.19 391.834 395.3478736 0.039215686 我所要做的就是读取csv文件,然后将第3列和第4列数据存储在整数数组中 这是我写的代码: BufferedReade
14/10/2011 422 391.6592 394.52324 0.039215686
13/10/2011 408.43 391.7612 395.0686031 0.039215686
12/10/2011 402.19 391.834 395.3478736 0.039215686
我所要做的就是读取csv文件,然后将第3列和第4列数据存储在整数数组中
这是我写的代码:
BufferedReader CSVFile =
new BufferedReader(new FileReader("appleData.csv"));
String dataRow = CSVFile.readLine();
int count = 0;
while (dataRow != null){
String[] dataArray = dataRow.split(",");
EMA[count] = dataArray[2];
SMA[count] = dataArray[3];
dataRow = CSVFile.readLine(); // Read next line of data.
}
// Close the file once all data has been read.
CSVFile.close();
我想以两个数组结束,EMA包含第3列的所有值,SMA包含第4列的值
我得到一个空指针异常。有人能告诉我我犯了什么错误吗?您的文件似乎使用空格/制表符作为分隔符,但您使用逗号分隔。那对我来说毫无意义 假设数据行具有一定的长度,而不进行检查。那对我来说毫无意义 此代码将向您展示如何做得更好:
package cruft;
import org.apache.commons.lang3.StringUtils;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* CsvParser
* @author Michael
* @link http://stackoverflow.com/questions/14114358/reading-csv-file-in-java-and-storing-the-values-in-an-int-array/14114365#14114365
* @since 1/1/13 4:26 PM
*/
public class CsvParser {
public static void main(String[] args) {
try {
FileReader fr = new FileReader((args.length > 0) ? args[0] : "resources/test.csv");
Map<String, List<String>> values = parseCsv(fr, "\\s+", true);
System.out.println(values);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Map<String, List<String>> parseCsv(Reader reader, String separator, boolean hasHeader) throws IOException {
Map<String, List<String>> values = new LinkedHashMap<String, List<String>>();
List<String> columnNames = new LinkedList<String>();
BufferedReader br = null;
br = new BufferedReader(reader);
String line;
int numLines = 0;
while ((line = br.readLine()) != null) {
if (StringUtils.isNotBlank(line)) {
if (!line.startsWith("#")) {
String[] tokens = line.split(separator);
if (tokens != null) {
for (int i = 0; i < tokens.length; ++i) {
if (numLines == 0) {
columnNames.add(hasHeader ? tokens[i] : ("row_"+i));
} else {
List<String> column = values.get(columnNames.get(i));
if (column == null) {
column = new LinkedList<String>();
}
column.add(tokens[i]);
values.put(columnNames.get(i), column);
}
}
}
++numLines;
}
}
}
return values;
}
}
以下是我得到的输出:
{date=[14/10/2011, 13/10/2011, 12/10/2011], value1=[422, 408.43, 402.19], value2=[391.6592, 391.7612, 391.834], value3=[394.52324, 395.0686031, 395.3478736], value4=[0.039215686, 0.039215686, 0.039215686]}
Process finished with exit code 0
您的文件似乎使用空格/制表符作为分隔符,但您使用的是逗号分隔。那对我来说毫无意义 假设数据行具有一定的长度,而不进行检查。那对我来说毫无意义 此代码将向您展示如何做得更好:
package cruft;
import org.apache.commons.lang3.StringUtils;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* CsvParser
* @author Michael
* @link http://stackoverflow.com/questions/14114358/reading-csv-file-in-java-and-storing-the-values-in-an-int-array/14114365#14114365
* @since 1/1/13 4:26 PM
*/
public class CsvParser {
public static void main(String[] args) {
try {
FileReader fr = new FileReader((args.length > 0) ? args[0] : "resources/test.csv");
Map<String, List<String>> values = parseCsv(fr, "\\s+", true);
System.out.println(values);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Map<String, List<String>> parseCsv(Reader reader, String separator, boolean hasHeader) throws IOException {
Map<String, List<String>> values = new LinkedHashMap<String, List<String>>();
List<String> columnNames = new LinkedList<String>();
BufferedReader br = null;
br = new BufferedReader(reader);
String line;
int numLines = 0;
while ((line = br.readLine()) != null) {
if (StringUtils.isNotBlank(line)) {
if (!line.startsWith("#")) {
String[] tokens = line.split(separator);
if (tokens != null) {
for (int i = 0; i < tokens.length; ++i) {
if (numLines == 0) {
columnNames.add(hasHeader ? tokens[i] : ("row_"+i));
} else {
List<String> column = values.get(columnNames.get(i));
if (column == null) {
column = new LinkedList<String>();
}
column.add(tokens[i]);
values.put(columnNames.get(i), column);
}
}
}
++numLines;
}
}
}
return values;
}
}
以下是我得到的输出:
{date=[14/10/2011, 13/10/2011, 12/10/2011], value1=[422, 408.43, 402.19], value2=[391.6592, 391.7612, 391.834], value3=[394.52324, 395.0686031, 395.3478736], value4=[0.039215686, 0.039215686, 0.039215686]}
Process finished with exit code 0
[1] while循环中应该有一个count+ [2] 您尚未定义/初始化数组EMA和SMA-导致异常 [3] 如果使用逗号拆分()并使用空格分隔的文件,则结果将是一个单位长度的数组,索引2和3将使用generate NullPointerException-即使正确初始化数组也是如此
我建议通过将它们添加到循环中的列表(如ArrayList或Vector)来读取数字,因为您事先不知道其大小。一旦退出循环,创建2个大小合适的数组,并将其复制到数组中的数据中。让垃圾收集器来处理向量。[1]while循环中应该有一个count++ [2] 您尚未定义/初始化数组EMA和SMA-导致异常 [3] 如果使用逗号拆分()并使用空格分隔的文件,则结果将是一个单位长度的数组,索引2和3将使用generate NullPointerException-即使正确初始化数组也是如此
我建议通过将它们添加到循环中的列表(如ArrayList或Vector)来读取数字,因为您事先不知道其大小。一旦退出循环,创建2个大小合适的数组,并将其复制到数组中的数据中。让垃圾收集器处理向量。代码的问题在于int[]EMA不是初始化。它只是定义EMA是一个整数数组,而没有有效地创建它(您只有引用) 我的建议是将EMA和SMA更改为,而不是使用属性,您可以将当前元素添加到列表中 在循环结束时,您可以使用size()方法获得每个ArrayList的元素数,并可以使用toArray方法将它们更改为数组,从而实现您可能达到的任何目标
当然,我假设您在示例中忘记了逗号。否则,您应该将分隔符更改为空白 代码的问题在于int[]EMA不是初始化。它只是定义EMA是一个整数数组,而没有有效地创建它(您只有引用) 我的建议是将EMA和SMA更改为,而不是使用属性,您可以将当前元素添加到列表中 在循环结束时,您可以使用size()方法获得每个ArrayList的元素数,并可以使用toArray方法将它们更改为数组,从而实现您可能达到的任何目标
当然,我假设您在示例中忘记了逗号。否则,您应该将分隔符更改为空白 你为什么不直接显示stacktrace?NPE发生在哪里?NPE发生在EMA[count]=dataArray[2]行;您在哪里初始化
EMA
?EMA是这样初始化的全局变量:int[]EMA;这是一份声明。您必须使用正确的大小初始化数组(尽管这应该引发和IndexOutOfBounds,而不是NPE)。请显示代码。为什么不显示堆栈跟踪?NPE发生在哪里?NPE发生在EMA[count]=dataArray[2]行;您在哪里初始化EMA
?EMA是这样初始化的全局变量:int[]EMA;这是一份声明。您必须使用正确的大小初始化数组(尽管这应该引发和IndexOutOfBounds,而不是NPE)。请显示代码。感谢您提供了如此详细的答案,我将尝试为我的代码实现一个类似的解决方案:)或仅采用我给您的解决方案。感谢您提供了如此详细的答案,我将尝试为我的代码实现一个类似的解决方案:)或仅采用我给您的解决方案。