加载 CSV 和拆分属性

Load CSV and split attributes

我正在尝试加载一个 csv 文件并将 'timespan' 拆分为 'begin' 和 'end'。如果时间跨度由一个日期组成 'begin' 和 'end' 相同。

timespan,someOtherField, ...
27.03.2017 - 31.03.2017,someOtherValue, ...
31.03.2017,someOtherValue, ...

结果:

begin,end,someOtherField
27.03.2017,31.03.2017,someOtherValue, ...
31.03.2017,31.03.2017,someOtherValue, ...

目前我正在使用 OpenCSV 逐行加载文件。这很好用,但我不知道如何拆分一个属性。可能我必须将 CSV 解析为数组?

对于任何行 l,您可以使用 StringTokenizer 来获取由 ,:

分隔的标记
StringTokenizer tokens = new StringTokenizer(l, ",")

第一个标记代表timespan,所以:

String timespan = tokens.nextToken()

然后你可以根据" - "分割时间跨度,所以:

String[] startEnd = timespan.split(" - ");

最后,你要计算startEnd的大小,如果startEnd.length == 1,那么你绝对知道开始beginend是重合的,所以startEnd[0],startEnd[0]

否则结果将如下所示startEnd[0],startEnd[1]

希望能帮到您解决问题。

感谢您的回答!我将 csv 解析为一个额外的 class 并为每条记录创建了一个对象。下面的代码显示了时间跨度的拆分。我现在将从所有对象重建一个新的 csv 文件。

// Load CSV as Booking objects
    ArrayList<Booking> bookings = Utils.readCSV(csvClean);

    for (int i = 0; i < bookings.size(); i++) {
        String timespan = bookings.get(i).getTimespan();
        String begin = "";
        String end = "";

        if (timespan.contains(" - ")) {

            // Split timespan and set values
            String[] parts = timespan.split(" - ");
            begin = parts[0].trim();
            end = parts[1].trim();

            bookings.get(i).setBegin(begin);
            bookings.get(i).setEnd(end);

        } else {
            bookings.get(i).setBegin(timespan.trim());
            bookings.get(i).setEnd(timespan.trim());
        } // end if else

    } // end for