需要了解读取CSV文件并在java中使用它们

时间:2014-10-14 01:00:30

标签: java csv

我试图读取包含GPS坐标(纬度,经度和海拔)的CSV文件以及每个实例的时间戳。格式如下:

2014-08-06T21:02:23Z,-33.7939310,151.0553090,-5.0

将每个单独分成一个路点(基本上将每一行放入一个数组中)然后分开每个路径点以将每个数据成员作为自己的字符串。所以,快速概述我到目前为止所做的工作。

我用逗号分隔字符串以提供4个单独的字符串,然后使用parseDouble将数字字符串更改为双精度字符串。

我认为我的格式错误但我并不是百分之百确定,因为我还不熟悉java,最后一种方法将涉及使用来自" getters"的数据。

任何帮助都会非常感激,因为我正在努力掌握这个项目!

public class Waypoint {

// The radius of the Earth in km
final double R = 6373.0; 

public double getLatitude(String[] field) {
    double latitude = Double.parseDouble(field[3]);



    return latitude; 
}

public double getLongitude(String[] field) {
    double longitude = Double.parseDouble(field[2]);

    return longitude;

}

public double getElevation(String[] field) {
    double elevation = Double.parseDouble(field[4]);


    return elevation;
}

public String getTimestamp(String[] field) {
    String date = field[1];


    return date;
}

public Waypoint(final String wstring) throws GPSException, FileNotFoundException  {

    Scanner scanner = new Scanner(new FileReader(wstring));

    scanner.hasNextLine();

    while(scanner.hasNextLine()) {
        String waypoint = scanner.nextLine();           
        String[] field = waypoint.split(",");           
    }

}

public double distanceTo(Waypoint wp2) {




}

}

1 个答案:

答案 0 :(得分:1)

这个问题措辞不正确,每次在这里都会让你受到打击。

您需要做的第一件事是阅读以下内容:https://stackoverflow.com/help/how-to-ask

鉴于此,您需要发布遇到的问题,我认为这是一个ArrayOutOfBoundsException,因为java数组从索引0开始,而不是1。

之后我想象你遇到日期问题,这很复杂,因为你应该使用Date解析器而不是你上面所说的。

我还假设您知道如何计算两个坐标之间的距离,如果不是那个单独的问题。

你需要开始将事情分解为更面向对象的东西。

大多数学校作业都不希望你使用像OpenCsv这样的库,因此你的扫描仪。你可以带上你的扫描仪,假设它适合你,只需创建一个结构传递到工厂。我建议List<String[]>,每个String数组都是CSV文件中的一行。

您应该根据类来思考,例如坐标类如下:

package com.techtrip.labs.stackoverflow;

import java.time.ZonedDateTime;

public class Coordinate {

    private ZonedDateTime timeStamp;
    private Double latitude;
    private Double longitude;
    private Double elevation;

    public Coordinate() {
        super();
    }

    public ZonedDateTime getTimeStamp() {
        return timeStamp;
    }

    public void setTimeStamp(ZonedDateTime timeStamp) {
        this.timeStamp = timeStamp;
    }

    public Double getLatitude() {
        return latitude;
    }

    public void setLatitude(Double latitude) {
        this.latitude = latitude;
    }

    public Double getLongitude() {
        return longitude;
    }

    public void setLongitude(Double longitude) {
        this.longitude = longitude;
    }

    public Double getElevation() {
        return elevation;
    }

    public void setElevation(Double elevation) {
        this.elevation = elevation;
    }
}

使用辅助类(或者可能是Java 8中使用默认方法的接口)

package com.techtrip.labs.stackoverflow;

import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;

public class CoordinateFactory {

    public List<Coordinate> getCoordinates(List<String[]> raw) {
        List<Coordinate> coordinates = new ArrayList<Coordinate>(raw.size());

        for (String[] row : raw) {
            coordinates.add(createCoordinate(row));
        }

        return coordinates;

    }

    private Coordinate createCoordinate(String... args) {
        // add error checking here as an assignment
        Coordinate coordinate = new Coordinate();

        coordinate.setTimeStamp(parseToLocalDateTime(args[0]));
        coordinate.setLongitude(Double.parseDouble(args[1]));
        coordinate.setLatitude(Double.parseDouble(args[2]));
        coordinate.setElevation(Double.parseDouble(args[3]));
        return coordinate;
    }

    private ZonedDateTime parseToLocalDateTime(String timeStamp) {
        // SEE Java 8 API Documentation on how to
        // Parse your date into a proper date time format

        /*
         * Let as assignment for ops
         * http://docs.oracle.com/javase/8/docs/api/java
         * /time/format/DateTimeFormatter.html
         * http://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html
         */

        return null;
    }
}

最后写一个方法来计算两个坐标之间的距离,我最后假设你有算法方便。您可以将以下内容放在主页中。

public static Double distanceBetween(Coordinate c1, Coordinate c2){

    // This should be your starting point
    return null; // replace null with the value
}

所有这一切都应该处理你的结构性物质的很大一部分。完整的程序应该进行错误检查,例如确保每行有4个格式正确的值。

以任何方式一次一个地测试每个方法。它将帮助您了解正在发生的事情。