Centrum skryptów - Microsoft office

W jaki sposób zaimportować plik .CSV do bazy danych programu Access?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

W jaki sposób zaimportować plik .CSV do bazy danych programu Access?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! W jaki sposób zaimportować plik .CSV do bazy danych programu Access?

-- CS

Cześć Skrypciarze! Odpowiedź

Cześć, CS. Za chwilę przejdziemy do Twojego pytania, ale Skrypciarz piszący te słowa nie powstrzymał się jednak przed chwilą od narzekania. Reklamy nadawane w przerwach między relacją z Super Bowl. Kilkakrotnie zdarzyło się, że Skrypciarz po ich obejrzeniu nie mógł pojąć, w jaki sposób to, co właśnie zobaczył, miałoby go skłonić do kupna reklamowanego produktu. W co najmniej jedynym wypadku nie wiedział nawet, co jest reklamowane! Jednak jedna reklama wywarła na Skrypciarzu wrażenie: występuje tam robot pracujący na linii montażowej samochodów, który przypadkiem upuszcza śrubkę. Zostaje natychmiast zwolniony i nie może znaleźć innej pracy – w końcu jest robotem fabrycznym i nie nadaje się do pracy w fast-foodzie. Chce już skoczyć z mostu, ale w tym momencie się budzi – to był tylko sen.

Trzeba przyznać, że był to sprawnie zrobiony wyciskacz łez. Nie dało się biednemu robotowi nie współczuć. Ale jeśli wziąć pod uwagę, że amerykańskie firmy samochodowe mają się coraz gorzej, to jest to kiepski komunikat dla robotników – popełnij jeden błąd, a zostaniesz zwolniony. I wiesz co? Znasz się tylko na budowie samochodów, więc innej pracy nie znajdziesz – nawet przy hamburgerach.

Świetne na morale!

Czy to wszystko ma jakiś związek z importowaniem pliku .CSV (skrót od comma-separated values, czyli wartości rozdzielone przecinkiem) do bazy danych Access? Nie bardzo. Ale to owszem:

Const adOpenStatic = 3

Const adLockOptimistic = 3

Const ForReading = 1



Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = c:\scripts\test.mdb" 



objRecordSet.Open "SELECT * FROM Employees", _

    objConnection, adOpenStatic, adLockOptimistic



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt")



Do Until objFile.AtEndOfStream

    strEmployee = objFile.ReadLine

    arrEmployee = Split(strEmployee, ",")



    objRecordSet.AddNew

    objRecordSet("EmployeeID") = arrEmployee(0)

    objRecordSet("EmployeeName") = arrEmployee(1)

    objRecordSet("Department") = arrEmployee(2)

    objRecordSet.Update



Loop



objRecordSet.Close

objConnection.Close

Szczerze mówiąc, nie znamy metody bezpośredniego importowania pliku .CSV do bazy Access. (Nie mówimy, że taka metoda nie istnieje. Po prostu jej nie znamy.) Jednak nic nie stoi na przeszkodzie, aby otworzyć plik .CSV i „ręcznie" dodać nowe rekordy. Tak jak w naszym skrypcie.

Zakładamy, że baza danych programu Access została już założona. W naszym przykładowym skrypcie użyjemy bazy C:\Scripts\Test.mdb. W niej znajduje się tabela o nazwie Employees, składająca się z trzech pól:

  • EmployeeID
  • EmployeeName
  • Department

Jak się pewnie domyślacie, nasz plik tekstowy (C:\Scripts\Test.txt) także składa się z trzech pól:

1989,Ken Myer,Finance

1990,Pilar Ackerman,Research

1991,Jonathan Hass,Human Resources

Mamy wiec trójkę pracowników, których chcemy dodać do bazy danych. Oto jak to zrobimy.

Zaczynamy od zdefiniowania trzech stałych: adOpenStatic i adLockOptimistic, używanych w pracy z bazą danych, oraz ForReading, której będziemy używać w pracy z plikiem tekstowym. Następnie za pomocą poniższego fragmentu kodu otwieramy plik Test.mdb i tworzymy zestaw rekordów składający się z całej zawartości tabeli Employees:

Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = c:\scripts\test.mdb" 



objRecordSet.Open "SELECT * FROM Employees", _

    objConnection, adOpenStatic, adLockOptimistic

Gdybyście się zastanawiali, wyjaśniamy że większa część wcześniejszego kodu daje się wykorzystać na każdym komputerze bez żadnych zmian. Zmienić należy tylko ścieżkę dostępu do bazy danych i nazwę tabeli.

Po otwarciu bazy danych kolejnym krokiem jest otwarcie pliku tekstowego. W tym celu tworzymy wystąpienie obiektu Scripting.FileSystemObject, a następnie używamy metody OpenTextFile do otwarcia pliku Test.txt do odczytu:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt")

Teraz możemy zacząć dodawać do bazy nowe rekordy. Najpierw uruchamiamy pętlę Do Until, która przechodzi przez cały plik (tzn. działa, dopóki właściwość AtEndOfStream nie osiągnie wartości True). Wewnątrz pętli uruchamiamy metodę ReadLine, która odczytuje pierwszy wiersz pliku tekstowego i zapisuje jego wartość w zmiennej strEmployee:

strEmployee = objFile.ReadLine

Co to oznacza? Otóż oznacza to, że wartość strEmployee wygląda tak:

1989,Ken Myer,Finance

Bardzo dobrze, ale na razie jej nie użyjemy – musimy wyciągnąć z niej poszczególne pola. Możemy to zrobić używając funkcji Split, która rozdzieli ciąg znaków w miejscach przecinków:

arrEmployee = Split(strEmployee, ",")

Uzyskujemy w ten sposób tablicę (o nazwie arrEmployee), składającą się z następujących elementów:

  • 1989
  • Ken Myer
  • Finance

Nie da się ukryć, że elementy te akurat odpowiadają trzem polom bazy danych.

Możemy już więc dodać do bazy Kena Myera. Wywołujemy metodę AddNew, która dodaje nowy rekord do tabeli Employees. Następnie podajemy wartości pól, używając do tego poniższego kodu:

objRecordSet("EmployeeID") = arrEmployee(0)

objRecordSet("EmployeeName") = arrEmployee(1)

objRecordSet("Department") = arrEmployee(2)

Nie ma tu nic skomplikowanego. W wierszu 1 przypisujemy wartość pola EmployeeID elementowi 0 naszej tablicy. (Jak pamiętamy, pierwszy element tablicy VBScript zawsze ma numer porządkowy 0.) W wierszu 2 przypisujemy wartość pola EmployeeName elementowi 1 tablicy. I tak dalej.

Po przypisaniu odpowiednich wartości zapisujemy nowy rekord w bazie danych, używając metody Update:

objRecordSet.Update

Teraz pętla powtarza cały proces dla kolejnego wiersza pliku tekstowego. I tak aż do końca.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft office