Data müxtəlif sistemlərdən gələndə, onların formatı fərqli ola bilər. Bir faylda sütunlar vergüllə ayrılır, digərində nöqtəli vergül, üçüncüsündə isə tab əsas ayırıcı ola bilər. Data yükləyərkən ayırıcıların düzgün seçilməməsi səhvlərə və ya datanın səhv interpretasiyasına səbəb ola bilər.
Hələ bu azmış kimi, real həyatda elə situasiyalar olur ki, sənə standart CSV başlıqları olmadan tekst formatında data yükləmək lazım olur, həmçinin boş dəyərləri emal etmək və boş sətrlərin NULL kimi interpretasiya olunmasını nəzərə almaq lazımdır. Ona görə də ayırıcıların və formatların sazlanması kütləvi data yükləmədə əsas işlərdən biridir.
Əsas ayırıcılar: onlarla necə işləmək lazımdır?
PostgreSQL-də COPY komandası ayırıcıların sazlanmasında çevikdir. Gəlin baxaq, bu necə işləyir.
Ayırıcıların təyin edilməsi
Default olaraq COPY komandası CSV faylında sütunların vergüllə ayrıldığını gözləyir. Amma bu həmişə rahat olmur: kiminsə faylında nöqtəli vergül (;), dik xətt (|) və ya hətta tab (\t) istifadə oluna bilər.
Ayırıcıyı DELIMITER parametri ilə belə göstərə bilərsən:
COPY students FROM '/path/to/students.csv'
DELIMITER ','
CSV HEADER;
Əgər vergül əvəzinə nöqtəli vergül istifadə olunubsa:
COPY students FROM '/path/to/students.csv'
DELIMITER ';'
CSV HEADER;
Tab ilə olan faylı da yükləmək olar:
COPY students FROM '/path/to/students.tsv'
DELIMITER E'\t'
CSV HEADER;
Burada E'\t' göstərir ki, ayırıcı tab simvoludur.
Qeyri-standart ayırıcı ilə faylın yüklənməsi
Praktik nümunə: səndə kurslar haqqında data olan fayl var və orada ayırıcı kimi dik xətt (|) istifadə olunub. Fayldakı data belədir:
course_id|course_name|credits
1|SQL Basics|3
2|Advanced SQL|4
3|PostgreSQL Masterclass|5
Bu datanı courses cədvəlinə belə yükləyə bilərsən:
COPY courses(course_id, course_name, credits)
FROM '/path/to/courses.csv'
DELIMITER '|'
CSV HEADER;
Burada biz PostgreSQL-ə açıq şəkildə deyirik ki, ayırıcı dik xəttdir.
Data formatlarının yükləmə zamanı sazlanması
Ayırıcılar işin bir hissəsidir. Fayldakı datanın formatı da vacibdir. Gəlin əsas format sazlama yollarına baxaq.
Boş sətrlərin ignor olunması və NULL təyin edilməsi
Böyük data fayllarında tez-tez boş sətrlər və ya sütunlar olur. PostgreSQL onları default olaraq boş sətr kimi görür, əgər başqa cür göstərilməyibsə. Belə dəyərləri NULL kimi interpretasiya etmək üçün NULL AS parametrindən istifadə edə bilərsən:
Nümunə. Tutaq ki, sənin faylında belə boş dəyərlər var:
id,first_name,last_name,email
1,John,Doe,
2,Jane,Smith,jane.smith@example.com
3,,Brown,james.brown@example.com
email sütununda boş dəyərləri NULL kimi yükləmək üçün:
COPY students(id, first_name, last_name, email)
FROM '/path/to/students.csv'
DELIMITER ','
CSV HEADER
NULL AS '';
Nəticədə fayldakı boş dəyərlər cədvəldə NULL kimi saxlanacaq.
Boş sətrlərin ignor olunması
Bəzən faylda boş sətrlər olur və onları yükləmək lazım deyil. PostgreSQL belə sətrləri avtomatik ignor edə bilir.
Nümunə. Faylda boş sətr var:
id,first_name,last_name,email
1,John,Doe,john.doe@example.com
2,Jane,Smith,jane.smith@example.com
IGNORE_BLANK_LINES parametrindən istifadə edirik:
COPY students(id, first_name, last_name, email)
FROM '/path/to/students.csv'
DELIMITER ','
CSV HEADER
NULL AS ''
IGNORE_BLANK_LINES;
İndi boş sətrlər yükləmə zamanı ignor olunacaq.
Qeyri-standart data formatı ilə işləmək
Bəzən sənə CSV yox, tekst formatında data yükləmək lazım olur. Məsələn, faylda sətrlər dik xətt | ilə ayrılıb və başlıq sətri yoxdur.
Fayl nümunəsi:
1|John|Doe|john.doe@example.com
2|Jane|Smith|jane.smith@example.com
Bu halda belə sorğu istifadə edə bilərsən:
COPY students(id, first_name, last_name, email)
FROM '/path/to/students.txt'
DELIMITER '|'
NULL AS ''
CSV;
Əgər faylda başlıq yoxdursa, sadəcə HEADER parametrini sil.
Data formatlarının sazlanmasına praktik nümunə
Ssenari: səndə grades.tsv adlı fayl var və orada tələbələrin qiymətləri saxlanılır. Data belədir:
student_id course_id grade
1 101 85
1 102 90
2 101 78
2 102 88
3 101 95
3 102
Tələb olunur:
- Faylı boş dəyərləri
NULLkimi interpretasiya edərək yüklə. - Dataya düzgün yükləndiyinə əmin ol.
Həll:
gradescədvəlini yarat:
CREATE TABLE grades (
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
grade INTEGER
);
- Fayldan datanı yüklə:
COPY grades(student_id, course_id, grade)
FROM '/path/to/grades.tsv'
DELIMITER E'\t'
NULL AS ''
CSV HEADER;
- Yüklənmiş datanı yoxla:
SELECT * FROM grades;
Gözlənilən nəticə:
| student_id | course_id | grade |
|---|---|---|
| 1 | 101 | 85 |
| 1 | 102 | 90 |
| 2 | 101 | 78 |
| 2 | 102 | 88 |
| 3 | 101 | 95 |
| 3 | 102 | NULL |
Tövsiyələr və tipik səhvlər
Səhv: ayırıcının uyğun olmaması. Əgər düzgün ayırıcı göstərməsən, PostgreSQL ya səhv verəcək, ya da datanı səhv yükləyəcək. Məsələn, faylda nöqtəli vergül istifadə olunubsa, amma sən DELIMITER ';' yazmağı unutsan, COPY bütün sətri bir sütun kimi götürəcək.
Səhv: NULL düzgün interpretasiya olunmur. Əgər NULL AS '' parametrini göstərməsən, fayldakı boş dəyərlər boş sətr kimi interpretasiya oluna bilər və bu, hesablamalarda və ya filtrdə səhvlərə səbəb olur.
Səhv: data formatı düzgün deyil. Ayırıcı səhv təyin olunubsa və ya faylda səhvlər varsa (məsələn, tab əvəzinə boşluq istifadə olunubsa), belə bir səhv ala bilərsən: ERROR: null value in column violates not-null constraint.
GO TO FULL VERSION