C#: importă date numai după validarea întregului fișier
Construiește un import C# care validează toate rândurile înainte de a modifica modelul. Detectează identificatori repetați și raportează linia greșită.
În acest material
Un import care adaugă fiecare rând imediat poate lăsa aplicația pe jumătate modificată dacă întâlnește o eroare la final. Pentru un fișier mic de concurs, citim și validăm mai întâi într-o colecție temporară. Abia după succes înlocuim datele active. Acest model de lucru este util pentru liste de cărți, întrebări sau produse și nu depinde de controalele din formular.
Cum lucrezi cu exemplul
Programul complet folosește C# 7.3 și API-uri disponibile în .NET Framework 4.8. Deschide Lesson.csproj din arhivă sau creează un proiect Console App (.NET Framework 4.8) și înlocuiește Program.cs. Datele de demonstrație sunt incluse în cod.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
Formatul nostru este intenționat restrâns: fiecare linie conține ID, caracterul punct și virgulă, apoi titlu. Titlul nu poate conține separatorul și nu poate fi gol. ID-ul este un întreg pozitiv, unic în fișier. Precizarea formatului evită promisiunea greșită că un simplu Split ar fi un parser CSV general.
Import construiește un Dictionary nou. Trim elimină spațiile de la margini, dar nu schimbă spațiile din interiorul titlului. Un mesaj de eroare menționează numărul liniei, numărat de la unu. Datele originale rămân accesibile în variabila current până când atribuirea rezultatului se încheie cu succes.
Exemplu și rezultat așteptat
Lista activă conține inițial ID 9. Încercăm importul 1;Algoritmi urmat de 1;Grafuri. Al doilea ID este duplicat, deci importul este refuzat la linia 2, iar current încă are ID 9. Un al doilea import, cu ID-urile 1 și 2, reușește și înlocuiește întregul set. Aceasta este politica de înlocuire, nu de îmbinare.
Set activ: ID 9 → Import: ID 1, ID 1 → Linia 2: duplicat → Refuz; ID 9 rămâne.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Xml.Linq;
using System.Data;
class Program {
static Dictionary<int,string> Import(string[] lines) {
if (lines.Length > 10000) throw new FormatException("Prea multe linii");
var result = new Dictionary<int,string>();
for (int i=0;i<lines.Length;i++) {
string[] parts=lines[i].Split(';'); int id;
if (parts.Length!=2 || !int.TryParse(parts[0],out id) || id<=0 ||
string.IsNullOrWhiteSpace(parts[1]) || result.ContainsKey(id))
throw new FormatException("Linia " + (i+1) + ": date invalide");
result.Add(id,parts[1].Trim());
}
return result;
}
static void Main() {
var current = new Dictionary<int,string> { {9,"Initial"} };
try { current=Import(new[] {"1;Algoritmi","1;Grafuri"}); }
catch (FormatException e) { Console.WriteLine(e.Message); }
Console.WriteLine("Pastrat: " + current.ContainsKey(9));
current=Import(new[] {"1;Algoritmi","2;Grafuri"});
Console.WriteLine("Importate: " + current.Count);
}
}
Rezultatul programului:
Linia 2: date invalide
Pastrat: True
Importate: 2
Greșeli și limite
Nu afișa succes înainte de validarea ultimei linii. Nu ignora în tăcere duplicatele, fiindcă ai pierde date fără explicație. Pentru fișiere foarte mari, păstrarea întregului rezultat în memorie cere o limită sau o strategie diferită. Exemplul este destinat seturilor mici, cu cel mult zece mii de linii; importul unei baze de date va folosi o tranzacție.
Exersează
Testează ID zero, titlu gol, trei coloane și două ID-uri identice. După fiecare refuz, verifică nu numai mesajul, ci și faptul că setul activ a rămas neschimbat. Apoi definește o politică de îmbinare: ce faci dacă un ID există deja? Scrie decizia înainte de implementare și construiește un exemplu care o deosebește de înlocuirea folosită aici.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: resurse, căi relative și tratarea erorilor de fișier
Lecția următoare: C#: salvează și recitește un catalog în XML.
Referință: documentația Microsoft.
Întrebări frecvente
Acesta este un parser CSV complet?
Nu. Formatul interzice separatorul în titlu și nu acceptă câmpuri citate sau linii în interiorul câmpului.
Când modific datele active?
După validarea cu succes a întregului lot temporar.
Cum raportez o eroare utilă?
Indică linia și regula încălcată, păstrând datele active neschimbate.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.