首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Read Tab-Separated-Columns Tab- Java

Read Tab-Separated-Columns Tab- Java
EN

Stack Overflow用户
提问于 2019-08-23 03:58:54
回答 3查看 191关注 0票数 0

制表符分隔的文件:

代码语言:javascript
运行
复制
2019-06-06 10:00:00 1.0
2019-06-06 11:00:00     2.0

我想遍历文件一次,并将每一列的值添加到一个列表中。

我的工作方法是:

代码语言:javascript
运行
复制
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);
}
}

我得到了:

代码语言:javascript
运行
复制
[1.0]
[2.0]

如果没有对nullìsEmptyArrayIndexOutOfBoundsException的检查,它将无法工作。

我非常感谢任何关于如何在保持扫描器方法的同时节省几行代码的提示。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-23 04:18:00

您可以通过使用try-with resources打开和关闭Scanner来清理您的代码:

代码语言:javascript
运行
复制
try (Scanner inputStream = new Scanner(file))
{
//your code...
}

这很有用,因为一旦留下try块,inputStream就会自动关闭,您不需要使用inputStream.close();手动关闭它。

此外,如果你真的想“保存行”,你也可以组合这些步骤:

代码语言:javascript
运行
复制
double val_2 = Double.parseDouble(values[2]);
List_2.add(val_2);

由于您实际上不会在其他地方使用val_2,因此每个步骤只需执行一步:

代码语言:javascript
运行
复制
List_2.add(Double.parseDouble(values[2]));

最后,您还使用了!values[1].isEmpty() == true,它将boolean值与true进行比较。这通常是一种糟糕的做法,您可以将其简化为具有相同功能的!values[1].isEmpty()。尽量不要将==boolean%s一起使用,因为没有必要。

票数 1
EN

Stack Overflow用户

发布于 2019-08-23 04:31:59

一种选择是使用列号作为键来创建列表的Map。这种方法给出了“无限制”的列数和与问题中的完全相同的输出。

代码语言:javascript
运行
复制
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);
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-08-23 04:11:24

你可以像下面这样做:

代码语言:javascript
运行
复制
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程序员一样,所以我决定编写一个示例代码,让您有一个良好的起点。祝好运

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57616307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档