No to w końcu zabierzmy się za przygotowanie tabel do masowego ładowania danych z plików CSV. Jeśli myślisz: "Po co w ogóle przygotowywać tabelę? Co w tym trudnego?", to jeszcze sporo musisz się dowiedzieć o prawdziwym świecie. Żaden plik nie jest "idealny". Zawsze znajdzie się jakaś łyżka dziegciu — czy to duplikaty, zbędne spacje, błędy w typach danych albo po prostu niezgodność struktury.
Rozkminmy, jak dobrze przygotować bazę, żeby plik CSV załadował się bez przypałów.
Zanim wrzucisz plik CSV, zdecyduj, jak dokładnie dane będą trzymane w bazie. To znaczy, że najpierw trzeba stworzyć tabelę z odpowiednią strukturą.
Przykład: ładowanie danych o studentach
Załóżmy, że mamy plik CSV students.csv z info o studentach. Jego zawartość wygląda tak:
id,name,age,email,major
1,Alex,20,alex@example.com,Computer Science
2,Maria,21,maria@example.com,Mathematics
3,Otto,19,otto@example.com,Physics
Na tej podstawie tworzymy tabelę:
CREATE TABLE students (
id SERIAL PRIMARY KEY, -- Unikalny identyfikator studenta
name VARCHAR(100) NOT NULL, -- Imię studenta (string do 100 znaków)
age INT CHECK (age > 0), -- Wiek studenta (musi być większy od 0)
email VARCHAR(100) UNIQUE, -- Unikalny email
major VARCHAR(100) -- Główny kierunek
);
id SERIAL PRIMARY KEY: Dodaliśmy klucz główny do unikalnej identyfikacji wierszy. Jeśli w twoim pliku CSV już są unikalne identyfikatory, użyj kolumnyidz pliku.name VARCHAR(100) NOT NULL: Imię studenta musi być podane, a długość ograniczona do 100 znaków.age INT CHECK (age > 0): Wiek musi być liczbą i dodajemy sprawdzenie, żeby zawsze był większy od 0.email VARCHAR(100) UNIQUE: Email musi być unikalny, żeby nie było duplikatów.major VARCHAR(100): Wskazuje główny kierunek studenta. Tu nie ma ograniczeń.
Twoje tabele powinny być sensownie zaprojektowane, żeby pasowały do danych i jednocześnie chroniły przed błędnymi danymi. To zmniejszy liczbę błędów przy ładowaniu.
Sprawdzanie danych przed ładowaniem
Pliki CSV często kryją niespodzianki. Zanim wrzucisz dane, upewnij się, że pasują do struktury tabeli.
Jak sprawdzić dane?
Zgodność kolumn
Upewnij się, że liczba kolumn w CSV zgadza się z liczbą kolumn w tabeli. Na przykład, jeśli w tabeli jest 5 kolumn, a w pliku CSV 6, ładowanie skończy się błędem.Typy danych
Sprawdź, czy dane w każdej kolumnie pasują do oczekiwanych typów. Na przykład, w kolumnieagepowinny być tylko liczby całkowite.
Narzędzia do walidacji
Excel albo Google Sheets. Otwórz plik w edytorze arkuszy i sprawdź, czy nie ma pustych wierszy albo komórek z błędnymi danymi.
Python. Użyj biblioteki pandas do sprawdzenia typów danych:
import pandas as pd
# Czytamy CSV
df = pd.read_csv('students.csv')
# Sprawdzamy dane
print(df.dtypes) # Wypisuje typy danych dla każdej kolumny
print(df.isnull().sum()) # Sprawdza puste wartości
Czyszczenie danych przed ładowaniem
Najczęściej dane z zewnętrznych źródeł wymagają czyszczenia. Inaczej możesz natknąć się na błędy przy ładowaniu.
Typowe problemy z plikami CSV
Puste wiersze lub kolumny
Jeśli w wierszu brakuje wartości w obowiązkowej kolumnie (NOT NULL), to wywali błąd.
Przykład błędnych danych:
id,name,age,email,major
1,Alex,20,alexey@example.com,Computer Science
2,Maria,,maria@example.com,Mathematics
Rozwiązanie: Zamień puste wartości na dozwolone. Na przykład, pusty age zamień na NULL.
Zbędne spacje
Spacje na początku lub końcu stringów mogą robić problemy. Na przykład, "Alex" i "Alex" będą traktowane jako różne wartości.
Rozwiązanie w Pythonie: usuń zbędne spacje.
df = df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
Błędne znaki lub kodowanie
Jeśli plik zawiera specjalne znaki niekompatybilne z bazą, ładowanie może się nie udać.
Przykład: Użyj narzędzia iconv do konwersji kodowania:
iconv -f WINDOWS-1251 -t UTF-8 students.csv > students_utf8.csv
Czyszczenie danych: przykład z Pythonem
import pandas as pd
# Czytamy plik
df = pd.read_csv('students.csv')
# Czyścimy dane
df['name'] = df['name'].str.strip() # Usuwamy spacje
df['email'] = df['email'].str.lower() # Email na małe litery
df['age'] = df['age'].fillna(0) # Uzupełniamy puste wartości wieku
df['age'] = df['age'].astype(int) # Konwertujemy wiek na int
# Zapisujemy zmiany do nowego pliku
df.to_csv('cleaned_students.csv', index=False)
Zawsze sprawdzaj dane przed ładowaniem. Pamiętaj: dobry programista oszczędza sobie czas, wyłapując problemy wcześniej!
Przydatna checklista do przygotowania tabel i danych
Zanim zaczniesz pracę z CSV, sprawdź:
- Struktura tabeli pasuje do danych (kolumny, typy danych, ograniczenia).
- Plik CSV nie ma pustych wierszy, zbędnych spacji ani błędnych znaków.
- Kodowanie pliku jest kompatybilne z PostgreSQL (najlepiej używać UTF-8).
- Korzystasz z narzędzi do analizy i czyszczenia danych (np. Python, Excel).
Teraz jesteś gotowy na ładowanie danych z CSV! Ale zanim to zrobimy, upewnij się, że twoja tabela jest dobrze zbudowana i dane są wyczyszczone. W następnej lekcji będziemy dalej ogarniać proces ładowania danych do PostgreSQL, w tym obsługę błędów i konflikty.
GO TO FULL VERSION