我正在尝试使用各种数据类型读取CSV文件。
表格的一行如下所示:
Single,Monthly,Accelerated,John,Smith,08/15/1951,是
然后,我需要将每个字段分配给变量名称,执行一些计算,打印输出,然后移动到Excel工作表中的下一行
到目前为止,我一直在使用以下
ArrayList<String> lines = new ArrayList<>();
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line = null;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
但是这会创建一个数组,每个插槽包含一个长字符串,其中包含相应excel行的文本(包括逗号)。 这似乎效率低下且不切实际,因为我必须遍历每个槽/字符串以提取值。
一旦我掌握了这种方法,我就不会在编写代码时遇到任何问题,但我不知道最好的方法来解决这个问题
分别读取每个单元格并分配给变量是否更好? 或者,最好一次读取文件并在之后遍历它? 也许有一种更有效的方法来完成这项任务
编辑:我也尝试将整个CSV文件作为2D数组读取,但不同的数据类型可能是一个问题..?
答案 0 :(得分:0)
您无需存储线条。而是创建一个表示每一行的类,并将它们添加到列表中。
类似的东西:
/Completed Reports
你可以保留它们没有任何访问限定符或将它们设为私有并添加getter / setter。
在文件阅读器中,使用csv中使用的分隔符分割行,默认情况下为逗号(class MyData
{
String status;
String salary;
String accelerated;
String firstName;
String lastName;
String date;
String trueOrFalse;
}
)
,
或强>
如果您只想进行一些计算和打印,则不需要单独的课程,甚至不需要ArrayList<MyData> datas = new ArrayList<MyData>();
while ((line = reader.readLine()) != null) {
String[] columns = line.split( "," );
MyData data = new MyData();
data.status = columns[0];
data.salary = columns[1];
.
.
data.trueOrFalse = columns[6];
datas.add( data );
}
。
只是做:
ArrayList<String> lines
如果是这种情况,则无需存储信息。
答案 1 :(得分:0)
你可以尝试类似的东西。使用StringTokenizer以逗号分隔行,并在每次迭代中将这些元素作为字符串添加到另一个List中。
ArrayList<ArrayList<String>> lines = new ArrayList<>();
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line = null;
while ((line = reader.readLine()) != null) {
ArrayList<String> tokens = new ArrayList<>();
StringTokenizer st = new StringTokenizer(line, ",");
while (st2.hasMoreElements()) {
tokens.add(st2.nextElement());
}
lines.add(tokens);
}
}
现在您可以使用适当的强制转换将它们转换为您想要的类型。例如,要获取日期,
DateFormat format = new SimpleDateFormat("mm/dd/yyyy", Locale.ENGLISH);
String dateString = lines.get(0).get(5);
Date date = format.parse(dateString);