Jeśli twoje ostatnie pole jest zawsze obecne (chociaż trailing nullcols
sugeruje, że nie) i masz pewną kontrolę nad formatowaniem, możesz użyć CONTINUEIF
dyrektywy, aby traktować drugą linię jako część tego samego rekordu logicznego.
Jeśli comments
pole jest zawsze obecne i ujęte w cudzysłów, możesz to zrobić:
...
truncate
continueif last != x'22'
into table ...
Które obsłużyłyby rekordy danych, takie jak:
S;Y;"Test 1"
F;N;"Test 2"
P;Y;"Test with
new line"
P;N;""
Lub jeśli zawsze masz ogranicznik po polu komentarzy, niezależnie od tego, czy jest wypełniony, czy nie:
...
truncate
continueif last != ';'
into table ...
Który poradzi sobie:
S;Y;Test 1;
F;N;"Test 2";
P;Y;Test with
new line;
P;N;;
Oba sposoby załadują dane jako:
S M COMMENTS
- - ------------------------------
S Y Test 1
F N Test 2
P Y Test withnew line
P N
Ale to traci nową linię z danych. Aby to zachować, musisz mieć ogranicznik pola końcowego, a zamiast CONTINUEIF
separator rekordów można zmienić przy użyciu formatu rekordu strumienia
:
...
infile 'C:\Users\lab.csv' "str ';\n'"
truncate
into table ...
"str ';\n'"
definiuje terminator jako kombinację terminatora pola i znaku nowej linii. Twój komentarz dzielony ma tę kombinację tylko w ostatniej linii. W przypadku tego samego pliku danych co w poprzedniej wersji daje to:
S M COMMENTS
- - ------------------------------
S Y Test 1
F N Test 2
P Y Test with
new line
P N
4 rows selected.
Ponieważ jesteś w systemie Windows, być może będziesz musiał dołączyć \r
w formacie m.in. "str ';\r\n'"
, ale nie jestem w stanie tego sprawdzić.