首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中从逗号和标题分隔的文件中读取时间

在Java中从逗号和标题分隔的文件中读取时间
EN

Stack Overflow用户
提问于 2018-10-23 04:06:20
回答 3查看 77关注 0票数 0

我在一个文件里有一个列表,里面有很多次。我的目标是将所有的时间都放在它们自己的字符串数组中,分别称为time1time2time3。该文件如下所示:

代码语言:javascript
复制
time1, 5:01,3:21,4:05,1:52 time2, 2:11,6:35,2:00,5:00 time3, 12:09, 
11:35, 9:02

我试着把读到的每一行都拆分,然后把它转换成记号,用逗号隔开。然而,这似乎不是一个有效的解决方案,因为第一个元素总是以空格开头,而最后一个元素没有逗号。我想知道是否有人知道解决这个问题的方法。

这是我到目前为止想出的代码:

代码语言:javascript
复制
public void read_file(){
try{
    times = new Scanner(new File("times.csv"));
    read_file();
}
catch(Exception e){
    System.out.printf("Could not find file\n");
}                
}
public void read_file(){

while(times.hasNextLine()){
    i++;
    String a = times.nextLine();
    String time[] = a.split(",");
    //would only add first 4 elements
    if(i < 4){
        timeList1.add(time[i])
    }
}
}

这里的问题是,我不知道如何检查我必须继续运行的元素数量,因为列表中的次数是不可预测的。唯一保持不变的是,总会有3个时间列表,分别称为time1time2time3

EN

回答 3

Stack Overflow用户

发布于 2018-10-23 05:42:48

这是一个单元测试,它可以做你想做的事情。我不得不稍微格式化一下你的输入字符串。您应该能够以最少的更改为您完成此工作。

代码语言:javascript
复制
import org.junit.Test;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Dr. Parameter
 */
public class TimeParser {

    private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("k:mm");

    @Test
    public void test(){

        // Test input
        String times = "time1, 5:01,3:21,4:05,1:52, time2, 2:11,6:35,2:00,5:00, time3, 12:09,11:35, 9:02";

        // Set up Objects used to collect
        String currentKey = "";
        HashMap<String, List<LocalTime>> timeMap = new HashMap();

        // Iterate though list
        String[] lineBreaks = times.split("\n");
        for(String line : lineBreaks){
            String[] csvBreaks = line.split(",");
            for(String csv : csvBreaks){

                //try to parse a time and add it to the key set, add a new key if there is a failure
                try {
                    timeMap.get(currentKey).add(LocalTime.parse(csv.trim(), formatter));
                } catch (Exception ex){
                    currentKey = csv;
                    timeMap.put(currentKey, new ArrayList<>());
                }
            }
        }

        //Print result:
        for(Map.Entry<String, List<LocalTime>> entry : timeMap.entrySet()){
            System.out.println("times for key: " + entry.getKey());
            for(LocalTime time : entry.getValue()){
                System.out.println("\t" + time);
            }
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-10-23 06:14:26

下面是另一种更简单的方法:

代码语言:javascript
复制
public class ReadTimes {
    private Map<String, List<String>> timeLists = new HashMap();
    public void read_file() {
        try {
            Scanner times = new Scanner(new File("times.csv"));
            read_file(times);
        } catch (Exception e) {
            System.out.printf("Could not find file\n");
        }
    }
    public void read_file(Scanner times) {
        String label=null;
        while (times.hasNextLine()) {
            String time[] = times.nextLine().trim().split("[, ]+");
            for (String timeString : time) {
                if (timeString.startsWith("time")) {
                    label = timeString;
                    timeLists.put(label, new ArrayList());
                } else if (label != null) {
                    timeLists.get(label).add(timeString);
                }
            }
        }
        // dump the map of arraylists for demonstration purposes...
        for (Entry<String,List<String>> timeEntry : timeLists.entrySet()) {
            System.out.println(timeEntry);
        }
    }

    public static void main(String[] args) {
        ReadTimes rt = new ReadTimes();
        rt.read_file();
    }
}

给定问题中显示的输入数据,将生成以下输出:

代码语言:javascript
复制
time1=[5:01, 3:21, 4:05, 1:52]
time2=[2:11, 6:35, 2:00, 5:00]
time3=[12:09, 11:35, 9:02]
票数 1
EN

Stack Overflow用户

发布于 2018-10-23 06:24:05

因为你确定你想要3个字符串数组,下面的代码以"time“作为分隔符拆分初始字符串,删除开头的"1, ""2, ""3, ",修剪并删除结尾的,,最后在删除所有空格后,以,作为分隔符拆分每一项,生成3个字符串数组。

代码语言:javascript
复制
    String times = "time1, 5:01,3:21,4:05,1:52, time2, 2:11,6:35,2:00,5:00, time3, 12:09,11:35, 9:02";

    String[] splitted = times.split("time");

    // exclude 0th item which is ""
    for (int i = 1; i < splitted.length; i++) {
        splitted[i] = splitted[i].trim();

        int index = splitted[i].indexOf(" ");

        if (splitted[i].endsWith(","))
            splitted[i] = splitted[i].substring(index + 1, splitted[i].length() - 1);
        else
            splitted[i] = splitted[i].substring(index + 1);

        splitted[i] = splitted[i].replaceAll(" ", "");
    }

    try {  // just in case
        String time1[] = splitted[1].split(",");
        System.out.println(Arrays.toString(time1));
        String time2[] = splitted[2].split(",");
        System.out.println(Arrays.toString(time2));
        String time3[] = splitted[3].split(",");
        System.out.println(Arrays.toString(time3));
    } catch (Exception e) {
        e.printStackTrace();
    }

打印3个字符串数组:

代码语言:javascript
复制
[5:01, 3:21, 4:05, 1:52]
[2:11, 6:35, 2:00, 5:00]
[12:09, 11:35, 9:02]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52937021

复制
相关文章

相似问题

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