static void Main(string[] args) { CSVParser parser = new CSVParser("test.csv"); //display unordered records from file. Console.WriteLine("Unordered"); Console.WriteLine("Row Number\tFullName\t Number \t Date"); foreach (var row in parser.Rows) { Console.WriteLine("{0}\t{1}\t{2}\t{3}", row.RowNumber, row.Cell[0].Value, row.Cell[1].Value, row.Cell[2].Value); } Console.WriteLine("press enter to continue"); Console.ReadLine(); //order by column 1 which is a string var orderedbycolumn0 = parser.Rows.OrderBy(i => (string)i.Cell[0]).ToList(); Console.WriteLine("Order by Name"); Console.WriteLine("Row Number\tFullName\t Number \t Date"); foreach (var row in orderedbycolumn0) { Console.WriteLine("{0}\t{1}\t{2}\t{3}", row.RowNumber, row.Cell[0].Value, row.Cell[1].Value, row.Cell[2].Value); } Console.WriteLine("press enter to continue"); Console.ReadLine(); //order by column 2 which might be an int var orderedbycolumn2 = parser.Rows.OrderBy(i => (int?)i.Cell[1]).ToList(); Console.WriteLine("Order by Number"); Console.WriteLine("Row Number\tFullName\t Number \t Date"); foreach (var row in orderedbycolumn2) { Console.WriteLine("{0}\t{1}\t{2}\t{3}", row.RowNumber, row.Cell[0].Value, row.Cell[1].Value, row.Cell[2].Value); } Console.WriteLine("press enter to continue"); Console.ReadLine(); //order by column 3 which might be an datetime var orderedbycolumn3 = parser.Rows.OrderBy(i => (DateTime?)i.Cell[2]).ToList(); Console.WriteLine("Order by Date"); Console.WriteLine("Row Number\tFullName\t Number \t Date"); foreach (var row in orderedbycolumn3) { Console.WriteLine("{0}\t{1}\t{2}\t{3}", row.RowNumber, row.Cell[0].Value, row.Cell[1].Value, row.Cell[2].Value); } Console.WriteLine("press enter to continue"); Console.ReadLine(); }
public string Clean(string Parametri) { var result = string.Empty; var parameters = Parametri.Split('§'); if (parameters.Length == 0) { return("-ER - È necessario specificare il path del file csv"); } //la funzione si aspetta in input il path del file seguito dal carattere § e il separatore del file CSV (di default è ;) string filename = Parametri.Split('§')[0]; if (parameters.Length == 2) { //not implemented - per il momento utilizza solo il punto e virgola string separator = Parametri.Split('§')[1]; result = @"-WG - La funzionalità di scelta del carattere separatore non è implementata. Il separatore di Default è il punto e virgola"; } try { var file = File.ReadAllText(filename); AntlrInputStream inputStream = new AntlrInputStream(file); CSVLexer lex = new CSVLexer(inputStream); CommonTokenStream TokenStream = new CommonTokenStream(lex); CSVParser par = new CSVParser(TokenStream); CSVErrorListener el = new CSVErrorListener(); par.RemoveErrorListeners(); par.AddErrorListener(el); var csvContext = par.csvFile(); if (el.SyntaxErrorsList.Count > 0) { result += @"-ER - Nel file csv sono presenti righe con più colonne rispetto all'intestazione: Righe Errate "; foreach (var se in el.SyntaxErrorsList) { result += se.Line + ", "; } result = result.Remove(result.Length - 2); result += "\n"; return(result); } CSVCleanerListener listener = new CSVCleanerListener(TokenStream); ParseTreeWalker walker = new ParseTreeWalker(); walker.Walk(listener, csvContext); if (listener.shortRows) { result += @"-ER - Nel file csv sono presenti righe con meno colonne rispetto all'intestazione\n"; } if (listener.LogRows.Count != 0) { result += @"-WG - Il file contiene righe vuote in fondo e/o separatori in eccesso a fine riga"; foreach (var row in listener.LogRows) { result += "\nRiga " + row.Key + " - " + row.Value; } } //se non ci sono errori bloccanti sovrascrivo il file "pulito" if (!listener.shortRows && el.SyntaxErrorsList.Count == 0) { File.WriteAllText(filename, listener.r.GetText()); } } catch (IOException exIO) { return(" - ER - Errore in lettura o scrittura del file csv\n " + exIO.Message); } catch (Exception e) { return("-ER - Errore non gestito: " + e.Message); } if (result.Equals(string.Empty)) { result = "+OK"; } return(result); }