Scrittura su un file CSV

Per scrivere su un file .csv, si crea una classe statica chiamata GestioneFile, che contiene un metodo statico ScriviSuFile.

Classe e metodo:


static class GestioneFile {
    public static void ScriviSuFile(List<Contatto> rubrica) {
        try {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "File dati | *.csv";

            if (sfd.ShowDialog() == true) {
                StreamWriter sw = new StreamWriter(sfd.FileName, false);

                foreach (Contatto item in rubrica) {
                    sw.WriteLine(CreaRecord(item));
                }

                sw.Close();
            }
        } catch (System.IO.IOException e) {
            MessageBox.Show(e.Message);
        } catch (Exception e) {
            MessageBox.Show(e.Message);
        }
    }

Metodo di supporto CreaRecord:


    private static string CreaRecord(Contatto parContatto) {
      return parContatto.Cognome + ";" +
             parContatto.Nome + ";" +
             parContatto.DataDiNascita + ";" +
             parContatto.Numero;
  }
}

Nota: Il metodo CreaRecord riceve un oggetto Contatto e restituisce una stringa formattata in stile CSV, dove i campi sono separati da ;.

Esempio di riga CSV prodotta:

Rossi;Mario;01/01/1990;1234567890

Lettura da un file CSV

Successivamente, si implementa il metodo CaricaFile per leggere i dati da un file CSV e ricostruire la lista di oggetti Contatto.

Metodo CaricaFile:

public static List<Contatto> CaricaFile() {
    try {
        List<Contatto> elenco = new List<Contatto>();
        string stringaRecord;

        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "File dati | *.csv";

        if (ofd.ShowDialog() == true) {
            StreamReader sr = new StreamReader(ofd.FileName);

            while ((stringaRecord = sr.ReadLine()) != null) {
                elenco.Add(DivideRecord(stringaRecord));
            }

            sr.Close();
        }

        return elenco;
    } catch (System.IO.IOException e) {
        MessageBox.Show(e.Message);
        return null;
    } catch (Exception e) {
        MessageBox.Show(e.Message);
        return null;
    }
}

Nota: Il metodo CaricaFile apre un file CSV selezionato dall’utente, legge riga per riga e ricostruisce la lista dei contatti tramite la funzione DivideRecord.


Conversione di una riga CSV in un oggetto Contatto

Metodo DivideRecord:

private static Contatto DivideRecord(string record) {
    string[] cs = record.Split(';');
    return new Contatto(cs[0], cs[1], cs[2], cs[3]);
}

Nota: Si assume che la classe Contatto abbia un costruttore che accetta quattro stringhe (Cognome, Nome, DataDiNascita, Numero).