0Pricing
C# Academy · Lekcja

Proste wzorce analizowania CSV

Proszę analizować wiersze CSV: używać naiwnego Split dla prostych plików, bezpiecznego TryParse dla liczb, a następnie niewielkiego splittera uwzględniającego cudzysłowy dla przecinków wewnątrz cudzysłowów.

Proste wzorce analizowania CSV to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Omówienie analizowania CSV

Cel: Niezawodnie analizować małe pliki CSV.

  • Zacznij od prostego Split w przypadku plików bez cudzysłowów
  • Używaj TryParse do analizowania liczb
  • Obsługuj pola w cudzysłowach za pomocą prostego skanera

Naiwny podział (bez cudzysłowów)

W przypadku plików CSV bez cudzysłowów prosty Split działa i jest łatwy do zrozumienia.

using System;

public class Program
{
  public static void Main(string[] args)
  {
    // Simple: no quotes, commas separate fields
    string line = "Apple,10,2.5";
    string[] parts = line.Split(','); // naive split

    Console.WriteLine("Name = " + parts[0]);
    Console.WriteLine("Qty  = " + parts[1]);
    Console.WriteLine("Price= " + parts[2]);
  }
}

Bezpieczne analizowanie liczb

Używaj Trim i TryParse wraz z kulturą (np. InvariantCulture), aby uniknąć awarii przy nieprawidłowych danych.

using System;
using System.Globalization;

public class Program
{
  public static void Main(string[] args)
  {
    string line = "Banana, 7, 1.99";
    string[] p = line.Split(',');

    string name = p[0].Trim();
    int qty;
    double price;

    bool okQty = Int32.TryParse(p[1].Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out qty);
    bool okPrice = Double.TryParse(p[2].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture, out price);

    Console.WriteLine("Parsed: " + name + " | ok=" + (okQty && okPrice) + " -> " + qty + " x " + price);
  }
}

Dlaczego naiwny podział zawodzi

Pola w cudzysłowach mogą zawierać przecinki, dlatego zwykły Split podzieli pole na części.

using System;

public class Program
{
  public static void Main(string[] args)
  {
    // Name has a comma inside quotes; naive split breaks it
    string line = "\"Orange, Blood\",12,3.40";
    string[] parts = line.Split(','); // wrong: splits inside the quoted name

    Console.WriteLine("Parts found = " + parts.Length); // 4, not 3
    foreach (string s in parts) Console.WriteLine("[" + s + "]");
  }
}

Podział uwzględniający cudzysłowy

Mały skaner przełącza wartość inQuotes i ignoruje przecinki znajdujące się wewnątrz cudzysłowów; obsługuje także podwojone cudzysłowy ("").

using System;
using System.Collections.Generic;
using System.Text;

public class Program
{
  // Splits a CSV line handling quotes and doubled "" inside quoted fields.
  static List<string> SplitCsvLine(string line)
  {
    List<string> fields = new List<string>();
    StringBuilder sb = new StringBuilder();
    bool inQuotes = false;

    for (int i = 0; i < line.Length; i++)
    {
      char c = line[i];

      if (c == '\"')
      {
        if (inQuotes && i + 1 < line.Length && line[i + 1] == '\"')
        {
          // Escaped quote ("") inside a quoted field
          sb.Append('\"');
          i++; // skip next quote
        }
        else
        {
          inQuotes = !inQuotes; // toggle
        }
      }
      else if (c == ',' && !inQuotes)
      {
        fields.Add(sb.ToString());
        sb.Length = 0; // reset
      }
      else
      {
        sb.Append(c);
      }
    }

    fields.Add(sb.ToString());
    return fields;
  }

  public static void Main(string[] args)
  {
    string line = "\"Orange, Blood\",12,\"He said \"\"Hi!\"\"\"";
    List<string> parts = SplitCsvLine(line);

    Console.WriteLine("Fields = " + parts.Count);
    foreach (string f in parts) Console.WriteLine("[" + f + "]");
  }
}

Od CSV do obiektów

Połącz funkcję dzielącą z TryParse i minimalnym czyszczeniem danych, aby bezpiecznie tworzyć obiekty o określonych typach.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;

public sealed class Product
{
  public string Name;
  public int Quantity;
  public double Price;
}

public class Program
{
  static List<string> SplitCsvLine(string line)
  {
    List<string> fields = new List<string>();
    StringBuilder sb = new StringBuilder();
    bool inQuotes = false;

    for (int i = 0; i < line.Length; i++)
    {
      char c = line[i];
      if (c == '\"')
      {
        if (inQuotes && i + 1 < line.Length && line[i + 1] == '\"')
        { sb.Append('\"'); i++; }
        else { inQuotes = !inQuotes; }
      }
      else if (c == ',' && !inQuotes)
      { fields.Add(sb.ToString()); sb.Length = 0; }
      else
      { sb.Append(c); }
    }
    fields.Add(sb.ToString());
    return fields;
  }

  static bool TryParseProduct(string line, out Product p)
  {
    p = null;
    List<string> f = SplitCsvLine(line);
    if (f.Count < 3) return false;

    string name = f[0].Trim().Trim('\"');
    int qty;
    double price;

    bool okQty = Int32.TryParse(f[1].Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out qty);
    bool okPrice = Double.TryParse(f[2].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture, out price);
    if (!okQty || !okPrice) return false;

    p = new Product { Name = name, Quantity = qty, Price = price };
    return true;
  }

  public static void Main(string[] args)
  {
    string[] lines = new string[]
    {
      "\"Orange, Blood\",12,3.4",
      "Apple,10,2.5",
      "\"He said \"\"Hi\"\"\",1,0.0"
    };

    List<Product> list = new List<Product>();
    foreach (string line in lines)
    {
      Product p;
      if (TryParseProduct(line, out p)) list.Add(p);
    }

    foreach (Product p in list)
    {
      Console.WriteLine(p.Name + " -> " + p.Quantity + " @ " + p.Price);
    }
  }
}

Zasada pól w cudzysłowach

Szybkie sprawdzenie: Jak poprawnie obsłużyć przecinki znajdujące się wewnątrz pól CSV ujętych w cudzysłowy?

Podsumowanie

Podsumowanie: Używaj prostego Split dla plików CSV bez cudzysłowów, analizuj liczby za pomocą TryParse i przełącz się na skaner uwzględniający cudzysłowy, gdy pola mogą zawierać przecinki.

Często zadawane pytania

Czy lekcja „Proste wzorce analizowania CSV” jest bezpłatna?

Tak — pełny tekst „Proste wzorce analizowania CSV” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Proste wzorce analizowania CSV”?

Proszę analizować wiersze CSV: używać naiwnego Split dla prostych plików, bezpiecznego TryParse dla liczb, a następnie niewielkiego splittera uwzględniającego cudzysłowy dla przecinków wewnątrz cudzy… Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.

Ile czasu zajmuje lekcja „Proste wzorce analizowania CSV”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. System.IO (ścieżki, strumienie)
  2. JSON z System.Text.Json (jawne wybieranie elementów, konwertery)
  3. Proste wzorce analizowania CSV
← Powrót do C# Academy