package eliofile import ( "fmt" "log" "os" "strings" "time" "gittea.marcokittel.de/elio/eliotools/tools" ) const FileExt = "csv" type filedata struct { filename string dt time.Time } type ElioHandleFunc func(filename string) bool type ElioDateiFoo struct { process ElioHandleFunc lookUpDir string processedDir string } func NewElioDateiFoo(lookUpDir string, process ElioHandleFunc) *ElioDateiFoo { df := ElioDateiFoo{lookUpDir: lookUpDir, process: process, } return &df } // Ordner durchiterieren. Dateien ohne csv Endnung ausschließlen. // Datumsobjekt und Warenhaus sowie Lokalität extrahieren. Ungültige Dateien überspringen. // Warenhausnamen in eine eine Hashmap ablegen. Dopplungen mit dem spätesten Zeitpunkt behalten. // Veraltete Dateien mit Präfix no-import und Postifx .old benennen. // Gültige Dateinamen zur Extraktion in Closure übergeben. func (f *ElioDateiFoo) ScanCsv() { files, err := os.ReadDir(f.lookUpDir) if err != nil { log.Fatal(err) } filemap := make(map[string]filedata) for _, file := range files { if !strings.Contains(file.Name(), FileExt) { continue } tl, err := tools.ExtractDateAndConvertToDate(file.Name()) if err != nil { continue } warehouse := tools.ExtractWarehouseAndType(file.Name()) value, ok := filemap[warehouse] if !ok { filemap[warehouse] = filedata{filename: file.Name(), dt: tl} } else { if tl.Unix() >= value.dt.Unix() { err := os.Rename(value.filename, "no-import-"+value.filename+".old") if err != nil { fmt.Printf("Datei %s konnte nicht umbenannt werden!!!", value.filename) } filemap[warehouse] = filedata{filename: file.Name(), dt: tl} } } } for _, v := range filemap { f.process(v.filename) } }