800px-Mucha-jobdziś znów gościnnie Kacper ze skryptem w służbie codzienności. pomysły zastosowania PS nie tylko do zadań administracyjnych, a również w zwykłych domowych warunkach, są mocno inspirujące. ponieważ wpisy dotyczą wyrażeń regularnych, sugeruję zapoznanie się z podstawami – np. na stronie regular-expressions.

dziś skrypt automatyzujący wyciąganie ‚clippingów’ z kindle… oddaję głos Kacprowi:

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

Od kiedy posiadam Kindle’a kupiłem tylko jedną książkę w wersji papierowej. Wśród wielu zalet Kindle ukrywa się jedna, która w szczególności przypadła mi do gustu. Nazywa się ona – My Clippings.txt. Czytniki Amazonu przechowują w tym pliku wszystkie notatki czy zaznaczenia związane z czytanymi książkami. Przykładowe wpisy w tym pliku wyglądają tak:

Jak widać, mamy tu do czynienia z pewnym schematem, a to daje nam możliwość przekształcenia tych danych na inny format. Zazwyczaj kiedy czytam książkę pierwszy raz, robię dużo zaznaczeń, żeby potem mieć możliwość przypomnienia sobie tych kwestii, które mnie najbardziej interesowały. Można oczywiście przeglądać sobie zawartość My Clippings.txt w celu odświeżenia pamięci, jednak Kindle wpisuje tam wszystko w sposób chronologiczny. Jeśli więc czytam w tym samym czasie dwie książki, to i zaznaczenia będą się przeplatały. Aby ułatwić sobie życie postanowiłem napisać skrypt, który przetworzy dane z pliku My Clippings.txt tak, żeby można było np. filtrować z której książki zaznaczenia chcemy wyświetlić.:

Jak widać skrypt nie jest skomplikowany, a najciekawsze fragmenty to regexy, które pobierają określony typ danych.

Na samym początku wstawiam średnik pomiędzy samą zawartość wpisu, a metadane. Prawdopodobnie nie jest to konieczne, ale znacznie mi ułatwiło tworzenie regexa w sekcji oznaczonej komentarzem „Extract clipping content”. Potem za pomocą wyrażenia „- (.*?) ” wydobywany jest typ wpisu. Zastosowanie nawiasów tworzy tzw. capturing groups, dzięki którym zwracana jest sama nazwa bez otaczających znaków. Jest to alternatywna wersja zapisu [Regex]::Matches($Clipping, $Pattern), który omawiałem w poprzednim wpisie.

Przy zapisywaniu tytułu książki do zmiennej wykorzystuję wyrażenie „.*(?=- )”. Ten regex zawiera tzw. positive lookahead, który zwraca wszystko od początku stringa aż do wystąpienia sekwencji znaków „- „, nie uwzględniając samej sekwencji (za to jest odpowiedzialny positive lookahead właśnie).

Na sam koniec, ponownie korzystając z capturing groups, pobieram wszystko co jest za znakiem średnika i zapisuję w zmiennej ClippingContent. Dalej jest już tylko stworzenie obiektu przy pomocy hashtable’a i dodanie go do tablicy Clippings, która jest zwracana przez skrypt.

Kacper

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

eN.