制表符分隔的文件:
2019-06-06 10:00:00 1.0
2019-06-06 11:00:00 2.0
我想遍历文件一次,并将每列的值添加到列表中。
我的工作方法是:
import java.util.*;
import java.io.*;
public class Program {
public static void main(String[] args)
{
ArrayList<Double> List_1 = new ArrayList<Double>();
ArrayList<Double> List_2 = new ArrayList<Double>();
String[] values = null;
String fileName = "File.txt";
File file = new File(fileName);
try
{
Scanner inputStream = new Scanner(file);
while (inputStream.hasNextLine()){
try {
String data = inputStream.nextLine();
values = data.split("\\t");
if (values[1] != null && !values[1].isEmpty() == true) {
double val_1 = Double.parseDouble(values[1]);
List_1.add(val_1);
}
if (values[2] != null && !values[2].isEmpty() == true) {
double val_2 = Double.parseDouble(values[2]);
List_2.add(val_2);
}
}
catch (ArrayIndexOutOfBoundsException exception){
}
}
inputStream.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println(List_1);
System.out.println(List_2);
}
}
我得到:
[1.0]
[2.0]
没有对null
,ìsEmpty
和ArrayIndexOutOfBoundsException
的检查就无法工作。
对于在保持扫描仪方法的同时如何节省几行的任何提示,我将不胜感激。
答案 0 :(得分:2)
一种选择是使用列号作为键来创建列表映射。这种方法使您“无限制”的列数和与问题中的一列完全相同的输出。
public class Program {
public static void main(String[] args) throws Exception
{
Map<Integer, List<Double>> listMap = new TreeMap<Integer, List<Double>>();
String[] values = null;
String fileName = "File.csv";
File file = new File(fileName);
Scanner inputStream = new Scanner(file);
while (inputStream.hasNextLine()){
String data = inputStream.nextLine();
values = data.split("\\t");
for (int column = 1; column < values.length; column++) {
List<Double> list = listMap.get(column);
if (list == null) {
listMap.put(column, list = new ArrayList<Double>());
}
if (!values[column].isEmpty()) {
list.add(Double.parseDouble(values[column]));
}
}
}
inputStream.close();
for(List<Double> list : listMap.values()) {
System.out.println(list);
}
}
}
答案 1 :(得分:1)
您可以按照以下方式进行操作:
BufferedReader bfr = Files.newBufferedReader(Paths.get("inputFileDir.tsv"));
String line = null;
List<List<String>> listOfLists = new ArrayList<>(100);
while((line = bfr.readLine()) != null) {
String[] cols = line.split("\\t");
List<String> outputList = new ArrayList<>(cols);
//at this line your expected list of cols of each line is ready to use.
listOfLists.add(outputList);
}
事实上,这是Java中的简单代码。但是因为您似乎是Java的初学者,并且像python程序员一样编写代码,所以我决定编写一个示例代码,以使您有一个良好的起点。祝你好运
答案 2 :(得分:1)
您可以使用try-with resources为您打开和关闭Scanner
来清理代码:
try (Scanner inputStream = new Scanner(file))
{
//your code...
}
这很有用,因为inputStream
块一旦离开try
就会自动关闭,而您无需使用inputStream.close();
手动将其关闭。
另外,如果您确实要“保存行”,则还可以组合以下步骤:
double val_2 = Double.parseDouble(values[2]);
List_2.add(val_2);
每个步骤都需要执行一次,因为您实际上并未在其他任何地方使用val_2
:
List_2.add(Double.parseDouble(values[2]));
最后,您还使用了!values[1].isEmpty() == true
,它将boolean
的值与true
进行比较。这通常是一种不好的做法,您可以将其减少为!values[1].isEmpty()
,而后者将具有相同的功能。尽量不要将==
与boolean
一起使用。