eliotools/eliofile/eliofile.go

71 lines
1.7 KiB
Go

package eliofile
import (
"fmt"
"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 {
fmt.Println(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(f.lookUpDir+"/"+value.filename, f.lookUpDir+"/"+"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)
}
}