dane przekazywane są w różny, czasem dość dziwny sposób. ostatnio potrzebowałem danych do migracji w office365 i dane zostały przedstawione jako spis, gdzie jedynym wiążącym elementem była ilość wpisów dla każdego obiektu. coś takiego (example.txt):
jakaś nazwa parametr: wartość parametru coś: tutaj jakaś wartość kolejna linia już bez konkretnego znacznika a tutaj kolejna wartość inna nazwa parametr: inna wartość parametru coś: coś kolejna linia już bez konkretnego znacznika i tu znów wartość nazwa 3 parametr: parametr 3 coś: tralalala kolejna linia już bez konkretnego znacznika blablabla znów coś parametr: ciągle coś innego coś: przykładowy ciąg znaków kolejna linia już bez konkretnego znacznika a tutaj kolejna wartość
takich wpisów było prawie 1oo a w efekcie chodziło o stworzenie tabeli, i dokonanie transpozycji:
nazwa | parametr | coś | linia bez znacznika |
jakaś nazwa | wartość parametru | tutaj jakaś wartość | a tutaj kolejna wartość |
inna nazwa | inna wartość parametru | coś | i tu znów wartość |
nazwa 3 | parametr 3 | tralalala | blablabla |
znów coś | ciągle coś innego | przykadowy ciąg znaków | a tutaj kolejna wartość |
jak widać zapis wygenerowany na stronie był dość luźny w stosunq do tego, co chciałbym mieć na końcu. tutaj poradziłem sobie przepisując ręcznie, ale przy dużej ilości wpisów…
wszystkiego nie ma sensu automatyzować, ale podstawowym zadaniem będzie owa transpozycja. w sumie to dwie linijki kodu:
$list=cat .\example.txt for($i=0;$i -lt $list.Count;$i+=6){$list[$i..($i+5)] -join ';' | out-file example.csv -Append }
pierwsza linijka to po prostu odczytanie zawartości pliq do zmiennej. a cała 'transpozycja’ to de facto zauważenie, że:
- każdy obiekt zapisany jest na 5 liniach
- następnie jest pusta linia oddzielająca
- kiedy sklei się wszystkie 5 linii średnikami.. to w zasadzie już
cały myk jak ładnie skleić wartości tabeli do stringa? wystarczy wskazać tabelę, i użyć 'join’. ot – PowerShell. nie trzeba żadnych pętli ani wynalazków, wszystko zrobi za nas (; dodajmy do tego, że substrakt tabeli można uzyskać wskazując konkretne elementy, a jeśli są w zapisie ciągłym to wystarczy użyć ’..’ . czyli tak:
$array[fromValue..toValue]
inkrementując w pętli $i+=6 – to przeskakiwanie co 6 kolejnych linii.
'podtabela’ma natomiast podane $i+5 aby ominąć ostatnią, pustą wartość.
…teraz wystarczy otworzyć w excelu i sobie resztę doklikać i uporządkować. voila.
eN.