claeis / iox-ili

implementation of IOX API
3 stars 8 forks source link

CsvReader cannot read tab separated files #90

Open edigonzales opened 4 years ago

edigonzales commented 4 years ago

Eventuell auch eine Konstellation von unterschiedlichen Betriebssystem und exotischen Encodings. Sollten Tabs grundsätzlich funktionieren?

task validateCsv(type: CsvValidator, dependsOn: 'downloadData') {
    models = "SO_AGI_MOCheckSO_20200715"
    firstLineIsHeader = true
    valueDelimiter = null
    valueSeparator = '\t'
    encoding = "windows-1252"
    dataFiles = [pathToTempFolder.toString()+"/mocheckso_errors.csv"]
}

Auch habe ich versucht den Tab aus Notepad++ zu kopieren, was aber auch nicht funktioniert. Anbei die CSV-Datei.

mocheckso_errors.zip

claeis commented 4 years ago

Nicht reproduzierbar. Kann vom CsvReader korrekt gelesen werden:

mocheckso_errors.Topic.Class1 oid o2 {BFSNr 2545, DatasetID 9BD80A80781C6343B868B50C7B86BBCC, DatasetName 254500.itf, ErrorCategory error, ErrorCount 1, ErrorDescription LFP3 muss die gleichen Attributwerte wie der Hoheitsgrenzpunkt haben, ErrorID CH030701, ErrorX 2612264.014, ErrorY 1232538.75, ILModel DM01AVSO24LV95, ILTable LFP3, ILTopic FixpunkteKategorie3, Kt SO, RICSDate 20201002, RICSProfile all,data_forward, RICSService MOCHECKSO}
edigonzales commented 4 years ago

Hast du die gleichen Parameter verwendet? Delimiter, Separator, encoding? Bist du auf Windows?

claeis commented 4 years ago
        CsvReader reader=new CsvReader(new File(TEST_IN,"mocheckso_errors.csv"));
        reader.setFirstLineIsHeader(true);
        reader.setValueSeparator('\t');
        assertTrue(reader.read() instanceof StartTransferEvent);
        assertTrue(reader.read() instanceof StartBasketEvent);
        IoxEvent event = reader.read();
        while(event instanceof ObjectEvent){
            IomObject iomObj=((ObjectEvent)event).getIomObject();
            System.out.println(iomObj);
            event = reader.read();
        }
claeis commented 4 years ago

Und ja: Windows.

edigonzales commented 4 years ago

Funktioniert auch unter macOS.

edigonzales commented 4 years ago

Funktioniert mit sogis/gretl-runtime Image. In sep ist ein Copy/Paste-Tabulator aus Notepad++.

task debugCsvReader(dependsOn: 'downloadCsv') {
    doLast {
        CsvReader reader=new CsvReader(new File(pathToTempFolder.toString()+"/mocheckso_errors.csv"));
        reader.setFirstLineIsHeader(true);
        char sep = '    '
        reader.setValueSeparator(sep);
        reader.read()
        reader.read()
        IoxEvent event = reader.read();
        while(event instanceof ObjectEvent){
            IomObject iomObj=((ObjectEvent)event).getIomObject();
            System.out.println(iomObj);
            event = reader.read();
        }
    }
}
edigonzales commented 4 years ago

Geht auch: char sep = '\t'

edigonzales commented 4 years ago

Problem ist folgendes:

1) GRETL-CsvValidator-Task: valueSeparator = '\t' 2) CsvValidator-Task speichert Separator in Settings-Klasse: https://github.com/sogis/gretl/blob/master/gretl/src/main/java/ch/so/agi/gretl/tasks/CsvValidator.java#L65 3) Settings.setValue() verwendet StringUtility.purge() Methode: https://github.com/claeis/ehibasics/blob/master/src/ch/ehi/basics/settings/Settings.java#L59 4) StringUtility.purge() trimmed den String mittels String.trim(): https://github.com/claeis/ehibasics/blob/master/src/ch/ehi/basics/tools/StringUtility.java#L27 Das entfernt auch Tabulatoren.