Время чтения из файла, разделенного запятой и заголовком в Java - PullRequest
0 голосов
/ 22 октября 2018

У меня есть список с кучей раз в файле.Моя цель состоит в том, чтобы поместить все время в их собственный массив строк с именами time1, time2 и time3.Файл выглядит следующим образом:

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

Я попытался разбить каждую прочитанную строку, а затем превратить ее в токены, разделенные запятой.Тем не менее, это не кажется правильным решением в настоящее время, так как первый элемент всегда начинается с пробела, а последний элемент не имеет запятой.Мне было интересно, если кто-нибудь знает обойти эту проблему.

Вот код, который я до сих пор придумал:

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 временных списка, называемых time1, time2 и time3.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вот еще один более простой подход:

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();
    }
}

Учитывая входные данные, показанные в вашем вопросе, получается следующий вывод:

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]
0 голосов
/ 23 октября 2018

Поскольку вы уверены, что вам нужно ровно 3 строковых массива, приведенный ниже код разделяет начальную строку с разделителем времени, удаляет "1, ", "2, ", "3, " в начале, обрезает и удаляет , в конце и, наконец, после удаления всех пробелов разбивает каждый элемент с , в качестве разделителя, производящего 3 строковых массива.

    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 строковых массива:

[5:01, 3:21, 4:05, 1:52]
[2:11, 6:35, 2:00, 5:00]
[12:09, 11:35, 9:02]
0 голосов
/ 23 октября 2018

Вот модульный тест, который делает то, что вы хотите.Мне пришлось немного отформатировать вашу входную строку.Вы должны быть в состоянии получить эту работу для вас с минимальными изменениями.

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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...