Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Import daty z pliku txt - Access 2007

1,517 views
Skip to first unread message

Mirosław Kowalczyk

unread,
Feb 4, 2008, 3:24:59 PM2/4/08
to
Nikt mi nie odpisał na dzisiejszy post z godz. 11:43, napiszę więc o
dalszych eksperymentach.

W pliku tekstowym mam daty w firmacie RRRRMMDD. Nie da się tego formatu
zaimportować do tabeli z polem typu Data/Godzina. Ustawiam szerokość pola na
8, separator daty pusty, kolejność dat RMD, zaznaczam rok czterocyfrowy i
wiodące zera w datach - w wyniku jest 'błąd konwersji typu'. Dopiero po
wstawieniu jakiegoś separatora, np. RRRR MM DD lub RRRR/MM/DD jest OK.

Tak samo eksport pola Data/Godzina do pliku TXT.
Ustawiam separator daty i czasu na pusty, szerokość pola na 8, eksport się
wykonuje a data w pliku TXT ma format 'RRRR MM DD GG MM SS' !!! Access
dodaje separator (spację) oraz czas, choć nikt go nie prosi.

Błąd importu daty mogę zaliczyć do małej niedoróbki Accessa 2007, ale jak
zaimportować jakąś liczbę z ułamkiem skoro kreator Accessa prowadzi mnie za
rączkę i podpowiada typ pola (podwójna precyzja) a potem - błąd konwersji.

Przejrzałem sieć i nic konkretnego nie znalazłem, prócz problemu z datą
RRRRMMDD - nierozwiązanego.

Można oczywiście zastosować VBA, ale ja używam Accessa głównie jako proste
liczydło, do szybkiej obróbki i analizy danych pochodzących z różnych źródeł
i staram się unikać pisania kodu (nie jestem zresztą w tym biegły).
Dodam, że w A'2000 tych problemów nie było, dało się nawet do pola
Data/Godzina zaimportować format 'RRRRMMDDGG.MM'.

Liczę na potwierdzenie od grupowiczów, ż 'ten typ tak ma', bo nie wydaje mi
się bym popełnił jakiś błąd.

Mirosław Kowalczyk


pi.gl...@gmail.com

unread,
Feb 5, 2008, 12:05:49 PM2/5/08
to

> Przejrzałem sieć i nic konkretnego nie znalazłem, prócz problemu z datą
> RRRRMMDD - nierozwiązanego.

Połącz plik txt do bazy lub zaimportuj taki jaki jest do tabeli tmp w
bazie.

Na pliku połączonym lub tabeli tmp zbuduj kwarendę, w której
przekonwertuj dane i dodaj do tabeli wynikowej.

np.: Date: CDate(Right([Pole1];2) & "-" & Mid([Pole1];5;2) & "-" &
Mid([Pole1];7;2)) gdzie Pole1 --> twoje "RRRRMMDD"

PS.Daty w formacie "RRRRMMDD" nie spotkałem.

Pajak


Mirosław Kowalczyk

unread,
Feb 5, 2008, 3:08:19 PM2/5/08
to

Pajak

-------------------

Tak też zamierzałem zrobić, choć nie chce mi się poprawiać aplikacji, która
już parę lat działała pod A'2000.

Ad. PS
format daty RRRRMMDD często występował, przynajmniej w "dawych dobrych
czasach". Np. w bazach dBase przekonwertowanych do postaci tekstowej pola
DATA mają właśnie format RRRRMMDD.

Mirosław Kowalczyk

MC

unread,
Feb 5, 2008, 2:45:49 PM2/5/08
to
Mirosław Kowalczyk pisze:


Swego czasu temat importu plików txt do Accessa dosyć skutecznie mnie
zmęczył (m.in. problemy z niestandardowymi formatami daty).
Rozwiązaniem okazało się użycie pliku schema.ini do parametryzacji
importu. Spytaj GOOGLE'a. Więcej informacji np. tu:

http://msdn2.microsoft.com/en-us/library/ms709353.aspx

Pozdrawiam
Mariusz

Krzysztof Naworyta

unread,
Feb 5, 2008, 3:38:08 PM2/5/08
to
Juzer Mirosław Kowalczyk <mi...@epi.com.pl> napisał


(...)


| format daty RRRRMMDD często występował, przynajmniej w "dawych dobrych
| czasach". Np. w bazach dBase przekonwertowanych do postaci tekstowej
| pola DATA mają właśnie format RRRRMMDD.

To prawda. Zresztą jest to format ISO, doskonale rozumiany przez np. MS
SQL.
I zdaje się jedynie słuszny podczas przekazywania wartości tekstowej do
parametru typu datetime, jeśli chcemy uniezależnić się od jakichkolwiek
ustawień lokalnych i nie babrając się funkcją Convert().

Ale zaskakujesz mnie mówiąc, że kiedykolwiek był on zrozumiały dla
access'a, podczas importu z plików tekstowych.

--
KN
(MVP, M$ Office Access)

archiwum grupy:
http://groups.google.pl/advanced_group_search
(grupa: pl*msaccess)

Mirosław Kowalczyk

unread,
Feb 6, 2008, 6:22:59 PM2/6/08
to
> | format daty RRRRMMDD często występował, przynajmniej w "dawych dobrych
> | czasach". Np. w bazach dBase przekonwertowanych do postaci tekstowej
> | pola DATA mają właśnie format RRRRMMDD.
>
> To prawda. Zresztą jest to format ISO, doskonale rozumiany przez np. MS
> SQL.
> I zdaje się jedynie słuszny podczas przekazywania wartości tekstowej do
> parametru typu datetime, jeśli chcemy uniezależnić się od jakichkolwiek
> ustawień lokalnych i nie babrając się funkcją Convert().
>
> Ale zaskakujesz mnie mówiąc, że kiedykolwiek był on zrozumiały dla
> access'a, podczas importu z plików tekstowych.
>
> --
> KN

---------------------------------
Od paru lat importuję pliki txt zawierające datę i czas w postaci
RRRRMMDDGG.MM. Robię to "ręcznie" z menu Accessa
(plik->pobierz...->importuj). W specyfikacji importu mam:

Kolejność dat : RMD
Ogranicznik daty : brak (pusty)
Ogranicznik czasu : . (kropka)
Rok czterocyfrowy : zaznaczone
Wiodące zera w datach : zaznaczone

Informacje o polu:
typ danych: Data/Godzina
początek: n
szerokość: 13

Działa w A'2000. W A'2007 nie działa, chociaż wszystkie opcje specyfikacji
importu można ustawić tak samo.

O możliwościach użycia schema.ini dowiedziałem się dopiero dzisiaj, od
kolegi MC. Po paru godzinach nauki, zrobiłem sobie przykład:

Plik contacts.txt

1ala 2007-01-01 1,123
2mirek2008-08-08 22,23444
3kazik2009-09-09 2345,4566

Plik schema.ini

[contacts.txt]
ColNameHeader=False
Format=FixedLength
MaxScanRows=0
CharacterSet=OEM
Col1="Lp" Long Width 2
Col2="Kto" Char Width 5
Col3="Kiedy" DateTime Width 13
Col4="Ile" Double Width 10
DateTimeFormat="yyyymmddhh.nn"

(wykombinowałem, że literki formatu daty są jak w DatePart)

Moja funkcja importująca

Function LoadSchema()
Dim db As DAO.Database
Set db = CurrentDb()
db.Execute _
"SELECT * INTO NewContact FROM [Text;DATABASE=C:\Moje
dokumenty;].[contacts.txt];"

db.TableDefs.Refresh
End Function

I działa analogicznie jak "ręcznie" lub metodą TransferText z odpowiednią
specyfikacją importu.
Oczywiście działa w A'2000.
W Access 2007 też "trochę" działa. Powstaje tabela NewContact, ale pola
Kiedy oraz Ile są puste!!!
Pal sześć tą nieszczęsną datę, ale jak zaimportować liczbę ułamkową do pola
Double ?

Żeby było ciekawiej, po zmianie w schema.ini Double na Currency import pola
Ile jest OK.

Mirosław Kowalczyk


Mirosław Kowalczyk

unread,
Feb 6, 2008, 6:31:47 PM2/6/08
to

> Swego czasu temat importu plików txt do Accessa dosyć skutecznie mnie
> zmęczył (m.in. problemy z niestandardowymi formatami daty).
> Rozwiązaniem okazało się użycie pliku schema.ini do parametryzacji
> importu. Spytaj GOOGLE'a. Więcej informacji np. tu:
>
> http://msdn2.microsoft.com/en-us/library/ms709353.aspx
>
> Pozdrawiam
> Mariusz

-----------------------
Przyczyniłeś się do poszerzenia mojej wiedzy! Jak ja mogłem żyć nie znając
schema.ini? Swoje "odkrycia" opisałem w Re dla KN. Niestety, wszystko co
wyczytałem sprawdza się w A'2000, nie działa w A'2007. Gdyby Ci się udało
zaimportować w A'2007 datę yyyymmdd lub liczbę ułamkową do pola Double -
powiadom mnie o tym

dziękuję

Mirosław Kowalczyk


Mirosław Kowalczyk

unread,
Feb 7, 2008, 8:28:38 AM2/7/08
to

> Błąd importu daty mogę zaliczyć do małej niedoróbki Accessa 2007, ale jak
> zaimportować jakąś liczbę z ułamkiem skoro kreator Accessa prowadzi mnie
> za rączkę i podpowiada typ pola (podwójna precyzja) a potem - błąd
> konwersji.

--------------------------

Ale namieszałem z datą!
Pod koniec prób pomyliłem się i wyciągnąłem fałszywe wnioski. Jeszcze raz:

plik contacts.txt

1ala 2007010112.24 1,123
2mirek2008080809.35 22,444
3kazik2009090910.55 52345,566

plik schema.ini

[contacts.txt]
ColNameHeader=False
Format=FixedLength
MaxScanRows=0
CharacterSet=OEM
Col1="Lp" Long Width 2
Col2="Kto" Char Width 5
Col3="Kiedy" DateTime Width 13

Col4="Ile" Currency Width 10
DateTimeFormat="yyyymmddhh.nn"

W A'2000 plik importuje się poprawnie, zarówno kreatorem importu, jak i moją
funkcją, wykorzystującą schema.ini.

W A'2007 stosując kreato importu nie importuje się pole Kiedy (DateTime) i
Ile (Double). Jednak wykorzystując schema.ini pole Kiedy importuje się
poprawnie, nie importuje się pole Ile.
Jeżeli pole Ile będzie typu Currency - dane się importują obiema metodami.
PS.
Próbowałem (bez rezultatów) w schema.ini wpisów:
NumberDigits=3
DecimalSymbol=","

Wnioski (A'2007)
--------------------
1. Data w pliku tekstowym może mieć "dziwny" format, pod warunkiem, że
wykorzystujemy schema.ini
2. Liczby ułamkowej nie potrafię zaimportować do pola Double (nie ośmielę
się stwierdzić, że to błąd Access'a)

Mirosław Kowalczyk


Krzysztof Naworyta

unread,
Feb 7, 2008, 4:25:45 PM2/7/08
to
Juzer Mirosław Kowalczyk <manki_v...@gazeta.pl> napisał

(...)


| Od paru lat importuję pliki txt zawierające datę i czas w postaci
| RRRRMMDDGG.MM. Robię to "ręcznie" z menu Accessa
| (plik->pobierz...->importuj). W specyfikacji importu mam:

Potwierdza sie stare przysłowie (za Einsteinem):
Wszyscy wiedzą, że czegoś nie da się zrobić, aż przychodzi ktoś, kto tego
nie wie i to robi (!!!)
;-)


| O możliwościach użycia schema.ini dowiedziałem się dopiero dzisiaj, od
| kolegi MC.

Pomijając jakieś ewidentne bug'i, czy to access'a 2007 czy nowszych
sterowników ISAM,
to nie przeceniałbym możliwości schema.ini

Jego ewidentną zaletą jest to, że nie robi żadnych wpisów w lokalnych
systemowych tabelach MDB, dzięki czemu baza nie rozrasta.
Ale, z tego co pamiętam, możliwości owych tabel (IMEX) czasami okazywały
się większe niż analogicznego schema.ini
Może to dzisiaj nie ma większego znaczenia, bo coś tam zostało poprawione,
niemniej należy pamiętać, że ISAM korzystają z jet'a i w przypadku jet 3.5
był problem z brakiem ogranicznika tekstu (delimited), a zniknął on z jet
4.0

| Po paru godzinach nauki, zrobiłem sobie przykład:

brawo!

| Żeby było ciekawiej, po zmianie w schema.ini Double na Currency import
| pola Ile jest OK.

Może a'2007 tak ma ?
Oczywiście, że byłoby to przykre ...
Z drugiej czym dla Ciebie się różni walutowy od podwójnej precyzji, skoro
obydwa łapią sie w tym samym zakresie dokładności ?
Wręcz polecałbym "walutowy", jako typ stałoprzecinkowy ...
Stawianie na "Double" prowadzi donikąd (zwykle).

0 new messages