将格式化的.txt文件读入变量:Java

时间:2019-03-30 22:47:16

标签: java

我有一个名为cars.txt的格式化文本文件;它由制表符分隔。

Name    Length  Width
truck1  18.6    8.1
suv1    17.4    7.4
coupe1  14.8    5.4
mini1   14.1    5.0
sedan1  16.4    6.1
suv2    17.5    7.3
mini2   14.3    5.2
sedan2  16.5    6.2 

我需要阅读此信息,以便以后可以用于计算。 这是我目前的想法,但我很难拼凑需要执行的内容。

public class Class{

    public void readFileIn(){
        Scanner sc = new Scanner(new FileReader("cars.txt");

            try{
               while (sc.hasNextLine()){ 
                    if (/**something that catches strings*/){
                        method1(string1, double1, double2);
                        method2(double1, double2);
                    }


                }
            }catch(FileNotFoundException exception){
                System.out.println("File dosen't exist");
            }

    }
}

3 个答案:

答案 0 :(得分:2)

Scanner和Buffer Reader不再使用了,因为Java提供了一种更好的方法,用更少的代码即可达到相同的结果。 我可以看到至少三种可能的方法可以解决您的问题:

方法1 :如果您至少可以使用Java 8,则建议将java.nio.file库用于read the file as a stream of lines

def npv(cfList, r):
    f = 0
    i = 1

    pv = 0

    while f <= len(cfList):
        pv += (cfList[f] / ((1 + r) ** i))
        f += 1
        i += 1
    return pv

然后,根据您需要执行的操作,可以使用将在流的每一行上循环的forEach

Stream<String> linesStream=Files.lines("cars.txt");

Java Collectors执行所需的计算。 here可以找到有关收集器的很好的教程。您还可以使用收集器来分隔字符串等...

方法2 :您可以使用Apache Commons库来实现相同的目标。特别是,您可以使用FileUtilsStringUtils。例如:

linesStream.forEach(e -> e.myMethod());

方法3 :使用Jackson将文件转换为json或java对象,然后可以将其用于自己的转换。 Here是说明如何将CSV转换为JSON的示例。稍稍研究一下Jackson文件,您可以将其应用于您的案例。

答案 1 :(得分:1)

首先,我建议您创建一个代表您的数据的Entry类。

private class Entry {
    private String name;
    private double length;
    private double width;

    // getters and setters omitted

    @Override
    public String toString() {
        // omitted
    }
}

接下来,创建一个方法,该方法以String作为参数,并负责将一行文本解析为Entry的实例。正则表达式\\s+与所有空格字符匹配,并将您的行拆分为单独的列。请记住,在生产中,如果您没有传递有效的Double.valueOf,则RuntimeException可以抛出String

最后,您可以在此处使用Java 8流API读取文件。跳过第一行,因为它包含列标题而不是实际数据。

private void readFile() throws Exception {
    Path path = Paths.get(/* path to your file */);

    Files.readAllLines(path).stream().skip(1).map(FileReadTest::toEntry)
            .forEach(this::action);
}

在我的示例中,我只是将每个条目打印到控制台:

private void action(Entry entry) {
    System.out.println(entry);
}

结果输出:

Entry[name='truck1', length=18.6, width=8.1]
Entry[name='suv1', length=17.4, width=7.4]
Entry[name='coupe1', length=14.8, width=5.4]
Entry[name='mini1', length=14.1, width=5.0]
Entry[name='sedan1', length=16.4, width=6.1]
Entry[name='suv2', length=17.5, width=7.3]
Entry[name='mini2', length=14.3, width=5.2]
Entry[name='sedan2', length=16.5, width=6.2]

答案 2 :(得分:0)

这是一个如何正确读取文本文件的示例-用所需的字符集替换字符集。

try (final BufferedReader br = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8)) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

一旦有了单独的行,就可以按空格分隔它们:str.split("\\s+");

您将获得一个包含三个条目的数组。我想您可以找出其余的东西。