_

LISP lista w pliku ini

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

LISP lista w pliku ini

Postprzez wilda » lis 11, 2020 20:23

Może ktoś podpowiedzieć jak napisać w lispie, żeby program pobrał dane z pliku ini i utworzył listę "Dane" taką jak w poniższym przykładzie?
Kod: Zaznacz cały
  (setq Dane
   '(
     ("dane1" 
      ("wart1-1"
       "wart1-2"
       "wart1-3"
       "wart1-4"
      ))
    ("dane2"
      ("wart2-1"
       "wart2-2"
       "wart2-3"
       "wart2-4"
       "wart2-5"      
      ))      
    ("dane3"
      ("wart3-1"
       "wart3-2"
       "wart3-3"
      ))
itd.....      
    )
  )
wilda
 
Posty: 265
Dołączył(a): gru 18, 2007 21:41

Re: LISP lista w pliku ini

Postprzez Banaszkiewicz » lis 11, 2020 22:07

Najprostsza procedura polega na otwarciu pliku ini do odczytu
(do poczytania - funkcje 'open', 'read-line' & 'close'.)
W czasie odczytu pliku ini, zamienić string na listę.
Można znaleźć gotowe programiki do konwersji np. tutaj
http://www.lee-mac.com/stringtolist.html
Pozdrawiam,
J.Banaszkiewicz
Banaszkiewicz
 
Posty: 5
Dołączył(a): gru 22, 2018 11:56

Re: LISP lista w pliku ini

Postprzez wilda » lis 12, 2020 01:30

Gdyby to była jedna prosta lista to może bym jakoś poradził, ale to jest lista złożona i jak zapisać to w pliku i to odczytać, żeby otrzymać listę jak w podanym przykładzie to nie mam pojęcia.
wilda
 
Posty: 265
Dołączył(a): gru 18, 2007 21:41

Re: LISP lista w pliku ini

Postprzez badziewiak » lis 12, 2020 02:03

W C# napisałem sobie specjalizowany parser plików ini. C# to nie lisp, więc zamieszczanie tego tu nie ma sensu. Nie wiem czy poniższe pomoże, ale podpowiem, jak ja to zrobiłem:
Zasadniczym elementem jest klasa INIparser. Udostępnia zagnieżdżoną klasę SEKCJA, a w sekcji jest publiczna struktura (definicja) ZMIENNA.
Zmienna ma pola: Nazwa, wartość, komentarz wieloliniowy.
Sekcja ma pola: Nazwa, zmienneList, komentarz wieloliniowy. Dodatkowo ma metodę: dodajZmienna; posiada także akcesory (inicjowane automatycznie przed pierwszym użyciem) zmienneBezNumerowDict - zebrane w dictionary zmienne bez numerów oraz: zmienneZnumeramiDict - zmienne zakończone _nn (podkreślenie z numerami - dictionary zwraca listę zmiennych).
Sam INIparser umożliwia wczytanie sekcji wszystkich, o wybranych nazwach (z opcją przerwania po wczytaniu pierwszego wystąpienia zadeklarowanych nazw sekcji), opcją zaszyfrowania całej zawartości pliku z danymi za pomocą podanego klucza. Ponad to umożliwia dodanie nowej sekcji, nadpisanie wczytanej sekcji, usunięcie sekcji. Oczywiście jest też metoda zapisu wszystkich sekcji do pliku.
To tak z grubsza, detale są już mniej istotne. Trochę się to rozrosło, bo taką miałem praktyczną potrzebę.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2372
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: LISP lista w pliku ini

Postprzez kojacek » lis 12, 2020 07:12

wilda napisał(a):Gdyby to była jedna prosta lista to może bym jakoś poradził, ale to jest lista złożona i jak zapisać to w pliku i to odczytać, żeby otrzymać listę jak w podanym przykładzie to nie mam pojęcia.


Jeśli masz AutoCAD-a to wykorzystaj funkcje z Express-a (acet-ini-get / acet-ini-set)
Tutaj też parę słów:
https://kojacek.wordpress.com/2017/04/21/autolisp-i-pliki-ini/
Avatar użytkownika
kojacek
 
Posty: 5553
Dołączył(a): paź 03, 2005 20:17

Re: LISP lista w pliku ini

Postprzez wilda » lis 12, 2020 11:35

Nie chodzi mi o samo zapisanie czy odczyt danych z/do pliku ini, tylko o to jaki sposób powinny być zapisane dane w pliku ini, a potem jak je programowo odczytać, żeby uzyskać taką listę jak w podanym przykładzie.
Przypuśćmy, że w pliku ini dane zapisane byłyby w taki sposób, to jak je odczytywać, żeby uzyskać listę "Dane" jak w pierwszym poście?
Kod: Zaznacz cały
[dane1] 
wart1-1
wart1-2
wart1-3
wart1-4

[dane2]
wart2-1
wart2-2
wart2-3
wart2-4
wart2-5      
      
[dane3]
wart3-1
wart3-2
wart3-3

itd.....
wilda
 
Posty: 265
Dołączył(a): gru 18, 2007 21:41

Re: LISP lista w pliku ini

Postprzez kojacek » lis 12, 2020 13:13

wilda napisał(a):Nie chodzi mi o samo zapisanie czy odczyt danych z/do pliku ini, tylko o to jaki sposób powinny być zapisane dane w pliku ini, a potem jak je programowo odczytać, żeby uzyskać taką listę jak w podanym przykładzie.
Przypuśćmy, że w pliku ini dane zapisane byłyby w taki sposób, to jak je odczytywać, żeby uzyskać listę "Dane" jak w pierwszym poście?
Kod: Zaznacz cały
[dane1] 
wart1-1
wart1-2
wart1-3
wart1-4

[dane2]
wart2-1
wart2-2
wart2-3
wart2-4
wart2-5      
      
[dane3]
wart3-1
wart3-2
wart3-3

itd.....



Spoko to sie da zrobic. Wieczorem wrzuce jakis przyklad.
Avatar użytkownika
kojacek
 
Posty: 5553
Dołączył(a): paź 03, 2005 20:17

Re: LISP lista w pliku ini

Postprzez kojacek » lis 12, 2020 21:40

To zaczynamy. Brak tu miejaca (teraz) aby się rozwodzić o strukturze pliku ini. Zainteresowani wiedzą (lub) się dowiedzą (to) tu (to) tam. Podobnież z acet-ami z express-a. Mamy zatem jakiś plik ini:
ini-00.png
ini-00.png (10.28 KiB) Przeglądane 194 razy

Dla naszych LISP-owych zabaw dobrze będzie go znaleźć (a gdy) to się stanie zapisać ów jako zmienną globalną:
Kod: Zaznacz cały
(setq %F (findfile "test.ini"))

ini-01.png
ini-01.png (3.81 KiB) Przeglądane 194 razy

Teraz potrzebna bedzie funkcja z Express-a, a dokładnie z pliku acetutil.arx, o nazwie acet-ini-get
Kod: Zaznacz cały
(acet-ini-get inifile [section [key [default]]])

Jak widać funkcję można wywoływać na kilka różnych sposobów. Po pierwsze - odczyt sekcji:
Kod: Zaznacz cały
(acet-ini-get %F)

ini-02a.png
ini-02a.png (4.61 KiB) Przeglądane 194 razy

Spostrzegawczy LISP-acz zauważy że nie musimy znać nazw sekcji - funkcja zwraca wszystkie znalezione. Tera przerwa, bo czuję że chyba więcej obrazków w jednym poście nie dane nam dać...
Avatar użytkownika
kojacek
 
Posty: 5553
Dołączył(a): paź 03, 2005 20:17

Re: LISP lista w pliku ini

Postprzez kojacek » lis 12, 2020 22:01

Przyszedł teraz czas na odczyt kluczy w zadanej sekcji. Ta sama acet-owa funkcja wywołana tak:
Kod: Zaznacz cały
(acet-ini-get %F "Sekcja druga")

zwróci wszyskie klucze:
ini-02b.png
ini-02b.png (4.52 KiB) Przeglądane 192 razy

Do tego momentu wszystko co się wydarzyło, było grą wstępną... ;) albowiem czas teraz na odczyt danych przypisanych do klucza. (Przykładowe) wywołanie:
Kod: Zaznacz cały
(acet-ini-get %F "Sekcja druga" "Druga_3")

i mamy:
ini-02c.png
ini-02c.png (4.38 KiB) Przeglądane 192 razy

W podobny sposób odczytamy wszystkie dane kluczy z zadanej sekcji:
Kod: Zaznacz cały
(setq k (acet-ini-get %F "Sekcja druga"))
  (mapcar
    '(lambda (%)
       (cons % (acet-ini-get %F "Sekcja druga" %))
     ) k
  )

ini-03.png
ini-03.png (6.41 KiB) Przeglądane 192 razy

Na koniec zaś, coś dla miłośników lambd i procentów (wszelkiej maści)... czyli odczyt całego pliku inii: wszystkich sekcji, ich kluczy i dnych z nini związanych:
Kod: Zaznacz cały
(mapcar
  '(lambda (%1)
     (list %1
       (mapcar
         '(lambda (%2)
           (cons %2
             (acet-ini-get %F %1 %2)
           )
        )
        (acet-ini-get %F %1)
      )
    )
  )
  (acet-ini-get %F)
)

Wynikiem jest lista:
ini-04.png
ini-04.png (8.55 KiB) Przeglądane 192 razy

i... to tyle.
(chyba) że macie jakieś pytania...
Avatar użytkownika
kojacek
 
Posty: 5553
Dołączył(a): paź 03, 2005 20:17

Re: LISP lista w pliku ini

Postprzez wilda » lis 12, 2020 23:01

To takie niby proste....czary,mary....
Ale przydałoby się jeszcze jedno zaklęcie, żeby otrzymać z tego listę jak poniżej:
Kod: Zaznacz cały
(("Sekcja1" ("AAA" "BBB" "CCC")) ("Sekcja2" ("aaaaaaaaaa" "bbbbbbbbbbb" "cccccccccccccc")) ("dane3" ("3.1" "3.2" "Czyczy")))
wilda
 
Posty: 265
Dołączył(a): gru 18, 2007 21:41

Następna strona

Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników