Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 40093 Skopiuj do schowka [ADODB] Ginące rekordy.
Autor Wiadomość
kulasart
[Usunięty]

Wysłany: 28-02-2014, 16:03   [ADODB] Ginące rekordy.

Część doświadczonych użytkowników tego forum jest zdania, że ADODB (dokładniej ADODB.Recordset) nie nadaje się do obsługi dużej ilości danych, ponieważ w niewytłumaczalny, losowy sposób "gubi" dane.
Moje doświadczenia z ADODB pokazują, że problem leży po stronie danych, które importujemy/obrabiamy, a nie samego ADO.

Postaram się pokazać Wam podstawowe błędy występujące w importowanych plikach, a także jak można niektórym z nich zaradzić.

1) case1.txt - Jest to plik bazowy. Jego struktura jest poprawna.

2) case2.txt - Plik posiada błędnie wykorzystany znak ". W wierszu 7 w kolumnie RAND_STRING, znak ten pojawia się tylko 1 raz. Kolejny raz występuje dopiero na końcu wiersza numer 10. Oznacza to, że wszystko co jest pomiędzy nimi traktowane będzie jak jedna wartość.
Pozornie zatem tracimy dane (kilka rekordów), które faktycznie zostały odczytane jako jedna wartość.

2.1) case2_1.txt - Plik posiada błędnie wykorzystany znak ". W wierszu 7 w kolumnie RAND_STRING, znak ten pojawia się tylko 2 razy. Niestety nie obejmuje on całej wartości pola. Skutek jest oczywisty - tracimy część danych z tego konkretnego pola.

3) case3.txt - Plik zawiera wartość tekstową w kolumnie, w której przechowywane są liczby. Ponieważ zamiana tekstu na liczbę jest niemożliwa, tracimy bezpowrotnie tą wartość.

3.1) case3_v1.txt - Rozwiązanie problemu z punku 3.
W pliku schema.ini ręcznie ustalamy typy danych jakie są przechowywane w kolumnach. Dla konfliktowej kolumny wybieramy typ Text i problem przestaje występować.

3.2) case3_v2.txt - Inna metoda na rozwiązanie problemu z punktu 3.
W pliku schema.ini dopisujemy "MaxScanRows=0", czym wymuszamy na ADO sprawdzenie wszystkich rekordów w celu ustalenia jaki tym danych jest przechowywany w poszczególnych kolumnach. Przy dużej ilości rekordów opcja ta znacząco spowalnia prace ADO.

4) case4.txt - Plik w jednym z pól tekstowych zawiera znak, który został wybrany jako znak rozdzielający kolumny od siebie. Dodatkowo pole to nie jest ujęte w "" lub ''.
Dane w konkretnym rekordzie przesuwają się o 1 pozycję, co skutkuje zwiększeniem ilości kolumn oraz może powodować utratę danych.

5) case5.txt - Plik w jednym z pól tekstowych posiada wartość liczbową.
Ponieważ łatwo dokonać konwersji liczby na tekst (wystarczy ująć wartość w ""), ADO ją przeprowadza.


Opisane problemy związane są nie tylko z importem plików tekstowych (*.txt, *.csv itd) ale również plików excelowych (*.xsl, *.xslx).

Chętnie dowiem się jakie Wy macie doświadczenia w tym temacie.

importADO.zip
Pobierz Plik ściągnięto 191 raz(y) 20.86 KB

ID posta: 219494 Skopiuj do schowka
 
 
OShon 
Excel Expert



Zaproszone osoby: 383
Pomógł: 1619 razy
Posty: 8251
Wysłany: 28-02-2014, 16:51   

A ktoś jakiś czas temu udowadniał mi że tak wcale nie jest.
Kiedyś na Codersach dyskutowałem na ten temat, którym przedmiotem były dziury danych na poziomie plików textowych oraz XLSach.
Dlatego ADO używam jedynie w przypadku ACC/ORA/MySQL/MSSQL.
_________________
Oskar Shon - MVP Office System/Development 11/19r, 3x MCC
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Sprawdź promocje na polskie dodatki do MS Office w VBATools.pl
ID posta: 219501 Skopiuj do schowka
 
 
kulasart
[Usunięty]

Wysłany: 28-02-2014, 17:25   

ACC/ORA/MySQL/MSSQL same w sobie zapewniają nam spójność danych.
Pliki tekstowe i XLS'y to bardzo "luźne" źródła danych, w których panuje samowolka. Co chcę - to wpisuję.
I właśnie ta samowolka jest główną przyczyną błędów.
ID posta: 219509 Skopiuj do schowka
 
 
Tajan


Pomógł: 4241 razy
Posty: 9445
Wysłany: 28-02-2014, 20:39   

Z tego co piszesz, wynika że, ograniczniki tekstu maja w ADO wyższy priorytet od ograniczników pól. Wg mnie jest to ewidentny błąd. Logiczne byłoby gdyby wartość pola z niepoprawnie użytym ogranicznikiem tekstu była uznawana za Null, a rekord wczytywany zgodnie z ogranicznikami pól. Chociaż, zgodnie ze specyfikacją csv ograniczniki tekstu nie są obligatoryjne, więc takie "niepoprawne" pole równie dobrze mogłoby być wczytywane zgodnie z zawartością pliku tekstowego. Szczególnie, że taki "samotny" cudzysłów może zostać użyty np do oznaczenia wartości podawanych w calach.
ID posta: 219523 Skopiuj do schowka
 
 
kulasart
[Usunięty]

Wysłany: 28-02-2014, 21:28   

Otóż nie. Ograniczniki mają taki priorytet jaki mieć powinny.
Standardowym ogranicznikiem tekstu jest wspomniany cudzysłów. Kiedy ADO na takowy natrafi, to traktuje wszystko co jest za nim jako wartość jednego pola. Kiedy na trafia na domykający cudzysłów, wie że pole się skończyło.
Dlaczego nie reaguje na znak nowego wiersza oraz ogranicznik pola? Bo oba mogą się znaleźć w polu zawierającym tekst.


W sytuacji kiedy spodziewamy się takich dziwnych przypadków możemy ręcznie ustawić ogranicznik tekstu.
W schema.ini dopisuje się wtedy odpowiednią linijkę:
Kod:
TextDelimiter='


Poprawnie skonstruowany plik powinien mieć ujęte w "" (lub inną parę znaków ograniczających) ujętą każdą wartość tekstową, która zawiera znak ograniczający tekst. Sam zaś znak ograniczający powinien być poprzedzony odpowiednim znakiem modyfikacji (zazwyczaj \ lub ").
Posługując się przykładem podanym przez Tajan'a wartość:
Cytat:
Belka ma długość 35"

powinna zostać zapisana w postaci:
Cytat:
"Belka ma długość 35"""
ID posta: 219533 Skopiuj do schowka
 
 
Tajan


Pomógł: 4241 razy
Posty: 9445
Wysłany: 28-02-2014, 23:26   

Zatem mamy pierwszą regułę bezpiecznego importu plików tekstowych za pomocą ADO:
"Pola tekstowe muszą być ujęte w cudzysłowy!"
ID posta: 219562 Skopiuj do schowka
 
 
OShon 
Excel Expert



Zaproszone osoby: 383
Pomógł: 1619 razy
Posty: 8251
Wysłany: 28-02-2014, 23:38   

Tajan napisał/a:
"Pola tekstowe muszą być ujęte w cudzysłowy!"

No a do tego świetnie nadaje sie moje narzędzie XLS do CSV
:) co nie wyklucza powątpiewania co do ADO dla plików TXT.
_________________
Oskar Shon - MVP Office System/Development 11/19r, 3x MCC
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Sprawdź promocje na polskie dodatki do MS Office w VBATools.pl
ID posta: 219565 Skopiuj do schowka
 
 
Tajan


Pomógł: 4241 razy
Posty: 9445
Wysłany: 28-02-2014, 23:52   

Jednak ADO jest w pewnych zadaniach niezastąpione. Np. ADO.Stream jest fajnym narzędziem i chociaż wymaga nieco dodatkowych zabiegów przy podziale na pola to oferuje np. konwersję pomiędzy stronami kodowymi.
ID posta: 219569 Skopiuj do schowka
 
 
kulasart
[Usunięty]

Wysłany: 01-03-2014, 00:47   

Tajan napisał/a:
"Pola tekstowe muszą być ujęte w cudzysłowy!"

Dołożyłbym do tego escape'owanie (Zna ktoś polski odpowiednik tego zwrotu?) znaków cudzysłowia.

Tajan napisał/a:
ADO.Stream jest fajnym narzędziem (...) oferuje np. konwersję pomiędzy stronami kodowymi.

Konwersja może i jest ale ślimaczy się niemiłosiernie przy większej ilości danych. Lepiej w tym przypadku sprawdza się użycie MultibyteToWideChar + WideCharToMultibyte z WinAPI.


OShon, jak Twoje narzędzie traktuje znak ' oraz ".
ID posta: 219580 Skopiuj do schowka
 
 
OShon 
Excel Expert



Zaproszone osoby: 383
Pomógł: 1619 razy
Posty: 8251
Wysłany: 01-03-2014, 19:07   

Nie bierze pod uwagę początkowego pojedynczego apostrofu "osa" a resztę jak pow napisałeś:
Cytat:
""ala ma kota"";5;"osa";"osa'"


Oczywiście Tekst w zajączkach można opuścić (bo nie wszystkie programu to lubią) jak i wybrać kwantyfikator dla zapisu.
_________________
Oskar Shon - MVP Office System/Development 11/19r, 3x MCC
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Sprawdź promocje na polskie dodatki do MS Office w VBATools.pl
ID posta: 219636 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe