Comparazione stringhe non corretta

di il
6 risposte

Comparazione stringhe non corretta

Ciao a tutti!
ho bisogno di una mano sulla comparazione di stringhe perché io non riesco a venirne a capo da solo: gestendo dei file CSV, voglio verificare che la prima riga di ciascun file corrisponda a quella che io definisco come "intestazione standard". Ho quindi creato una proprietà dell'app (in Settings.Default) di tipo string in cui ho copia/incollato la prima riga di un file che so essere corretto.
Al momento dell'importazione di un nuovo file, lo apro in uno StreamReader, eseguo la ReadLine e poi confronto la stringa ottenuta con l'impostazione di cui sopra.
Il problema nasce nel momento in cui, pur aprendo lo stesso file da cui son partito per fare il copia/incolla, ottengo che le stringhe son diverse!
Riporto di seguito il codice che uso
            using (StreamReader reader = new(path))
            {
                //Verifico le intestazioni di colonna
                string currentHeaders = reader.ReadLine();
                for(int i = 0; i < currentHeaders.Length; i++)
                {
                    Debug.WriteLine($"Carattere {i}: {currentHeaders[i]} - {Settings.Default.csvHeaders[i]} => { currentHeaders[i] == Settings.Default.csvHeaders[i]}");
                }
                if (Settings.Default.csvHeaders != currentHeaders)
                {
                    //eccetera eccetera...
Entro sempre nell'if, quando mi aspetterei di non entrarci (meno che mai se apro il file da cui son partito... )
Il ciclo for l'ho aggiunto momentaneamente per provare a vedere quali caratteri non combaciano e l'output è il seguente:
...
Carattere 59: T - T => True
Carattere 60: ? - À => False
Carattere 61:   -   => True
...
Carattere 81: T - T => True
Carattere 82: ? - À => False
Carattere 83: ; - ; => True
...
Carattere 92: T - T => True
Carattere 93: ? - À => False
Carattere 94: _ - _ => True
...
Il carattere a sinistra è quello che ottengo dalle impostazioni, mentre quello di destra arriva dalla ReadLine.

Potrebbe essere un problema di Encoding dello StreamReader? Cosa devo studiare per approfondire? Avete qualche suggerimento da provare per risolvere?

Grazie in anticipo

6 Risposte

  • Re: Comparazione stringhe non corretta

    Sgrubak ha scritto:


    Potrebbe essere un problema di Encoding dello StreamReader?
    E' senz'altro un problema di encoding.

    Quando si elaborano informazioni leggendo e scrivendo file di testo, la codifica da utilizzare per i caratteri da rappresentare è una informazione fondamentale da fornire, altrimenti non è possibile interpretare o memorizzare i caratteri nel modo corretto all'interno degli stessi file.

    Sgrubak ha scritto:


    Cosa devo studiare per approfondire?
    Studia il concetto di encoding dei caratteri.

    Sgrubak ha scritto:


    Avete qualche suggerimento da provare per risolvere?
    Quando usi metodi di apertura file per lettura e scrittura dei caratteri, usa sempre l'overload dove si può specificare l'encoding da utilizzare, e indicalo sempre.

    Ciao!
  • Re: Comparazione stringhe non corretta

    Sgrubak ha scritto:


    ho bisogno di una mano sulla comparazione di stringhe perché io non riesco a venirne a capo da solo: gestendo dei file CSV [...]
    P.S.

    Se vuoi lavorare agevolmente con file in formato CSV, esiste l'ottimo package .

    Io l'ho usato in diverse occasioni e mi ha reso servigi più che eccellenti, ad esempio identificando i record con campi mancanti, lavorando correttamente con un buffer, eseguendo il parsing corretto di valori, anche custom, e gestendo anche gli encoding (per tornare al discorso precedente).

    Ciao!
  • Re: Comparazione stringhe non corretta

    Grazie mille Marco! Mi metto a studiare
  • Re: Comparazione stringhe non corretta

    Ovviamente seguendo le tue indicazioni ho risolto.
    Sono andato in maniera molto empirica a specificare manualmente i vari tipi di encoding nel parametro del costruttore dello StreamReader. Arrivato al Latin1 ha funzionato e non ho più toccato. Speriamo che quei file continuino ad arrivarmi sempre nello stesso formato.

    In merito a CsvHelper è un pacchetto davvero molto interessante. Nel caso mi ritrovassi a gestire nuovamente file CSV mi metterò a provarlo. Al momento mi son già scritto a manina il parsing della stringa e l'officina non mi sta lasciando il tempo da trascorrere coi i miei giocattoli in Visual Studio...)
  • Re: Comparazione stringhe non corretta

    Sgrubak ha scritto:


    Sono andato in maniera molto empirica a specificare manualmente i vari tipi di encoding nel parametro del costruttore dello StreamReader. Arrivato al Latin1 ha funzionato e non ho più toccato. Speriamo che quei file continuino ad arrivarmi sempre nello stesso formato.
    Se apri il file di testo con Notepad++, ma anche con altri editor oppure nello stesso Visual Studio, c'è sempre una barra di stato che riporta l'encoding utilizzato: salvo casi eccezionali, poiché è l'editor che cerca di "indovinare" l'encoding, quello riportato è corretto.

    Se il file codificato proviene da una fonte esterna, in caso di problemi prendi tu le redini in mano segnalando espressamente che l'encoding ti occorre ben determinato, altrimenti è impossibile elaborare i file con sicurezza (e magari fai avanzare dei caratteri strani o indesiderati).

    Se hai la possibilità di scegliere, forse lo standard de facto del Web - UTF8 - è uno dei più versatili perché coniuga una minore occupazione media di spazio con la capacità di rappresentare comunque tutti i caratteri Unicode (aggiungendo i byte necessari), e quindi non pone limitazioni.

    Ciao!
  • Re: Comparazione stringhe non corretta

    Alka ha scritto:


    Se apri il file di testo con Notepad++...
    Che pollo che sono! Notepad++ è stata una delle prime prove che ho fatto ma mica l'ho vista la barra in basso... Ho cercato nelle impostazioni e nei vari menù in alto e non l'avevo trovato.

    Alka ha scritto:


    Se hai la possibilità di scegliere, forse lo standard de facto del Web - UTF8...
    Purtroppo il file mi arriva, e credo che abbiano delle impostazioni di default spagnole. I file che invece converto io li codifico già UTF-8, come suggeriva la guida che mi hai linkato.
Devi accedere o registrarti per scrivere nel forum
6 risposte