Zapis i odczyt danych

Każdy pomiar związany jest z gromadzeniem danych liczbowych. Zanim przystąpimy do analizy tych danych musimy nauczyć się je zapisywać i odczytywać z właściwych nośników. Musimy panować nad systemem kartotek , w których dane zapisujemy i formatami, w jakich te dane są zapisywane.

Ustawienie kartoteki domyślnej (SetDirectory)

Umieść ten notatnik we właściwej, wygodnej do odszukania kartotece, a następnie uruchom go z tej kartoteki.
Kartotekę domyślną mogę ustawić jako identyczną z kartoteką, w której znajduje się uruchomiony notatnik (notebook).

SetDirectory[NotebookDirectory[]]

Sprawdzam

Directory[]

Jeżeli ilość różnych plików wczytywanych lub zapisywanych nie jest duża, takie ustawienie kartotek domyślnych jest optymalne. Dla każdego rozważanego zagadnienia fizycznego lub matematycznego program liczący i rezultaty obliczeń znajdą się w tym samym miejscu.

Jeżeli jednak dane tworzą duże pliki lub gdy plików tych jest wiele wygodniej jest wyodrębnić kartotekę danych. Poniżej proponujemy utworzyć ja jako subkartotekę kartoteki notatnika.

CreateDirectory["magazyn"]
SetDirectory[%];

If[FileNames["*"]=!={},DeleteFile[FileNames["*"]]]

Wykonuję test. Rysuję funkcję i patrzę gdzie teraz zapisany zostanie się mój rysunek

p1=Plot[Sin[x],{x,-10,10}]

Export["graph1.gif",p1,"GIF"];

FileNames["*"]//TableForm

Rysunek pojawił się w mojej kartotece roboczej przewidzianej dla danych. Mogę to sprawdzić niezależnie, korzystając z poleceń systemu operacyjnego. Bardziej wyczerpujące omówienie instrukcji zarządzających dyskiem:  http://mth.drac.oa.uj.edu.pl/mufiles/00002/przyklady/os.nb

Zapisywanie danych liczbowych (Put, Get)

Zapisywanie liczb naturalnych (typu exact)

Buduję przykładową tablicę liczb

X=Table[n,{n,1,100}]

Zapisuję ją w zbiorze o nazwie dane.txt. Instrukcje Put i Get nie interpretują rozszerzeń. Wygodnie jest jednak nadać rozszerzenie txt aby dla przeglądania tych zbiorów włączały się odpowiednie przeglądarki domyślne zdefiniowane w systemie operacyjnym. (Inaczej jest przy Export i Import. Tam rozszerzenie jest istotne).

Put[X,"dane.txt"]

lub w postaci normalnej  (Ctrl,Shift,N) :

FilePrint["dane.txt"]

X>>"dane.txt"

Czytam dane z dysku

Get["dane.txt"];

lub w postaci normalnej  (Ctrl,Shift,N) :

<<"dane.txt"

Wprowadzam nową zmienną dla wczytanej tablicy

Y=<<"dane.txt"

Proces zapisu i odczytu danych poleceniami Put i Get w pełni zachowuje strukturę danych. Złożenie operacji Put i Get jest "operacją tożsamościową" (zwraca dane w postaci identycznej z pierwotną).

Put[X,"dane.txt"]
X==Get["dane.txt"]

Zapisywanie danych liczbowych (Export: List/Table)

Export["dane2.txt",X,"List"]

Y=Import["dane2.txt","List"]

m=Table[i j,{i,1,9},{j,1,9}]
%//MatrixForm

Export["m2.txt",m,"Table"]
FilePrint["m2.txt"]

Import["m2.txt","Table"]//ToExpression;
%//MatrixForm

Zapisywanie ułamków

Buduję przykładową tablicę ułamków

Y1=Table[n/7,{n,1,20}]

Y1>>"Y1.txt"

Wyświetlam zawartość zbioru (podobnie wyświetli go dowolny edytor tekstowy):

FilePrint["Y1.txt"]

Zapisywanie ułamków dziesiętnych

Przykładowa tablica liczb dziesiętnych. (Mogę zmieniać ilość pozycji znaczących operując drugim argumentem funkcji N)

Y2=N[Y1,20]

Y2>>"Y2.txt"

Wyświetlam zawartość zbioru

FilePrint["Y2.txt"]

Wczytuję i sprawdzam zgodność z oryginałem

Y3=<<"Y2.txt"

Y3==Y2

Export do tabeli Excela

Zapisywanie do formatu Excela wymaga użycia procedury Export. W tym przypadku format danych jest określony przez rozszerzenie w nazwie zbioru.

Zapisywanie listy liczb naturalnych (typu exact)

Przykładowa tablica liczb (w jednym wymiarze)

X

Export["dane.xls",X]

Dane te stanowią kolumnę liczb. Należy to sprawdzić bezpośrednio programem Excel.

Wczytuję dane z pliku xls

Y=Import["dane.xls"]

Proces zapisu i odczytu danych poleceniami Export i Import  do formatu xls w Mathematice 7 nie zachowuje struktury danych.! Dla odzyskania postaci pierwotnej konieczne jest użycie polecenia Flatten i ewentualna zamiana liczb przybliżonych (zmienno-przecinkowych) na liczby typu exact.

Y=Flatten[Import["dane.xls"],2]

IntegerPart[Y]

Ostatecznie

X==IntegerPart[Flatten[Import["dane.xls"],2]]

Podobnie postępujemy z tablicami liczb.  Macierz poniżej jest szkolną tabliczką mnożenia

X2=Table[n m,{n,1,10},{m,1,10}]
%//MatrixForm

Export["tabliczka.xls",X2]

Zapisuję ją i wczytuję ponownie

Y2=Import["tabliczka.xls"]

Podobnie jak w przypadku jednego wymiaru, również  tutaj konieczne są pewne zabiegi dodatkowe dla odzyskania pierwotnej postaci danych

Y2=Flatten[Import["tabliczka.xls"],1]

IntegerPart[Y2]
%//MatrixForm

Zapisywanie liczb wymiernych w formacie txt

Przykładowa tablica liczb wymiernych

X3=Table[n/ m,{n,1,10},{m,1,10}];
%//TableForm

X3>>"dzielenie.txt"

Wyświetlam zawartość zbioru

FilePrint["dzielenie.txt"]

Wczytuję dane z pliku

<<"dzielenie.txt"//TableForm

Sprawdzam zgodność

X3==<<"dzielenie.txt"

Zapisywanie liczb wymiernych w formacie xls

Tę samą macierz eksportuję do pliku xls

Export["dzielenie.xls",X3]

Powrotny import danych wymaga dodatkowego spłaszczenia (Flatten)

Flatten[Import["dzielenie.xls"],1];
%//MatrixForm

Zapis do pliku xls ignoruje polecenia funkcji N jeżeli ilość miejsc znaczących jest mniejsza od precyzji maszynowej.

Export["dzielenie2.xls",N[X3,2]]

Flatten[Import["dzielenie2.xls"],1]//MatrixForm

Obniżenie ilości miejsc po przecinku można uzyskać za pomocą funkcji Round

X3round=Round[X3,0.01];
%//MatrixForm

X3round>>"X3round.txt"

Export["dzielenie_round.xls",X3round]

źródło notatnika

Algebra Komputerowa  (http://mth.drac.oa.uj.edu.pl/public.php?pubcase=lecture)
Wersja programu: Mathematica 7

Andrzej Woszczyna
Wydział Fizyki, Astronomii i Informatyki Stosowanej
Uniwersytet Jagielloński