CSV-Daten auswählen, Graph anzeigen

In der Tat…

Auch auf die Gefahr hin, noch mehr zu verwirren oder nichts sinnvolles beizutragen, ein paar Codeschnipsel, die bestimmte Aufgaben erledigen:

  • Aus einer Datei, die das besagte Format hat, also einen Verzeichnisnammen und eine Nummer enthält, kann mit readInputInfo ein InputInfo-Objekt gelesen werden, wo diese Infos drinstecken
  • Mit ein paar utility-Funktionen kann man aus den Namen von Dateien (die das angedeutete Format haben) diese Informationen extrahieren:
    • Diese Nummer (1 oder 2)
    • Das erste Datum
    • Das zweite Datum
  • Mit der fetchRelevantFiles-Methode kann man sich die Dateien auflisten lassen, die relevant sind

Alleine schon den Task in solche Building-Blocks aufzuteilen kann helfen. Mit JFreeChart hat das jetzt freilich nichts zu tun, aber … das könnte der nächste Schritt sein.

So weit erstmal. Muss da jetzt noch irgendwas nach Datum sortiert werden oder so? :confused:

package bytewelt;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class DateianzeigeUnklareFrage
{
    public static void main(String[] args) throws IOException
    {
        File inputFile = new File("./FileList.txt");
        InputInfo inputInfo = readInputInfo(inputFile);
        
        List<File> relevantFiles = 
            fetchRelevantFiles(inputInfo.directoryName, inputInfo.number, 
                LocalDate.of(2017, 6, 23));
        
        for (File file : relevantFiles)
        {
            System.out.println(file);
        }
    }

    private static class InputInfo
    {
        String directoryName;
        int number;
    }

    private static InputInfo readInputInfo(File file) throws IOException
    {
        try (BufferedReader br = new BufferedReader(new FileReader(file)))
        {
            String directoryName = br.readLine();
            String numberString = br.readLine();
            InputInfo inputInfo = new InputInfo();
            inputInfo.directoryName = directoryName;
            inputInfo.number = tryParseInt(numberString);
            return inputInfo;
        }
    }

    static List<File> fetchRelevantFiles(String directoryName, int number,
        LocalDate date)
    {
        List<File> relevantFiles = new ArrayList<File>();
        List<File> files = listFiles(directoryName);
        for (File file : files)
        {
            String fileName = file.getName();
            int fileNumber = extractNumberFromFileName(fileName);
            LocalDate startDate = extractStartDateFromFileName(fileName);
            LocalDate endDate = extractEndDateFromFileName(fileName);

            if (fileNumber == number 
                && !startDate.isAfter(date)
                && !endDate.isBefore(date))
            {
                relevantFiles.add(file);
            }
        }
        return relevantFiles;
    }

    private static LocalDate extractStartDateFromFileName(String name)
    {
        int lastUnderscoreIndex = name.lastIndexOf('_');
        if (lastUnderscoreIndex == -1)
        {
            System.out.println("Invalid file name: " + name);
            return null;
        }
        int prevUnderscoreIndex =
            name.lastIndexOf('_', lastUnderscoreIndex - 1);
        if (prevUnderscoreIndex == -1)
        {
            System.out.println("Invalid file name: " + name);
            return null;
        }
        String startDateString =
            name.substring(prevUnderscoreIndex + 1, lastUnderscoreIndex);
        return LocalDate.parse(startDateString);
    }

    private static LocalDate extractEndDateFromFileName(String name)
    {
        int lastDotIndex = name.lastIndexOf('.');
        if (lastDotIndex == -1)
        {
            System.out.println("Invalid file name: " + name);
            return null;
        }
        int lastUnderscoreIndex = name.lastIndexOf('_');
        if (lastUnderscoreIndex == -1)
        {
            System.out.println("Invalid file name: " + name);
            return null;
        }
        String endDateString =
            name.substring(lastUnderscoreIndex + 1, lastDotIndex);
        return LocalDate.parse(endDateString);
    }

    private static int extractNumberFromFileName(String name)
    {
        int dashIndex = name.indexOf('-');
        if (dashIndex == -1)
        {
            System.out.println("Invalid file name: " + name);
            return -1;
        }
        int numberEndIndex = name.indexOf('_', dashIndex + 1);
        if (numberEndIndex < 0)
        {
            System.out.println("Invalid file name: " + name);
            return -1;
        }
        String numberString = name.substring(dashIndex + 1, numberEndIndex);
        return tryParseInt(numberString);
    }

    private static int tryParseInt(String string)
    {
        try
        {
            return Integer.parseInt(string.trim());
        }
        catch (NumberFormatException e)
        {
            System.out.println("Invalid number: " + string);
            return -1;
        }
    }

    private static List<File> listFiles(String directoryName)
    {
        File directory = new File(directoryName);
        File[] filesArray = directory.listFiles();
        List<File> files = new ArrayList<File>();
        for (File file : filesArray)
        {
            if (!file.isDirectory())
            {
                files.add(file);
            }
        }
        return files;
    }

    private static void someBasicTests()
    {
        String fileName = "export_test_practise-1_2017-06-23_2017-06-23.csv";
        System.out.println(extractNumberFromFileName(fileName));
        System.out.println(extractStartDateFromFileName(fileName));
        System.out.println(extractEndDateFromFileName(fileName));
        System.out.println(listFiles("C:/Develop"));
    }

}