Tema: Re: get info from txt file
Autorius: Laimis
Data: 2013-11-20 00:34:15
CurrentUser rašė:
> Čia ir yra tokių kaip aš bėda. kaip sakydavo senelis "devyni amatai -
> dešimtas badas". Aš savo gyvenime tiek dalykų esu kandęs, kad pačiam
> būtų sunku patikėti. Visko vis tiek neapžiosi. Aišku, tai ką tikiesi

Būtų gerai, jei vienas iš tų devynių amatų būtų gebėjimas mokytis; tada 
bado tikrai nebūtų... :-)
O ši patarlė jau kiek praranda aktualumą. Nes nūdieną, įvairiausių 
technologijų sūkuryje, reikia ne apžioti, o efektyviai pritaikyti ir 
pasinaudoti.
Taip, daugelyje dalykų tenka slysti paviršiumi, išmanyti labai 
paviršutiniškai, tačiau pramokęs/suvokęs/atsiminęs principus, gebėsi ir 
pritaikyti (kaip ir pasigilinti, kai prireiks).
Aš awk irgi gerai nemoku. Atsimenu, kaip jis veikia: skaito nuosekliai 
po eilutę (records), skaidydamas tekstą į laukus (fields). Kas skiria 
laukus ir eilutes galima nustatyti ir keisti. Taip pat sulyg kiekviena 
eilute tikrinamos sąlygos ir jei jos patenkinamos — vykdomas sąlygų 
kodas. Turi aibę matematinių ir tekstinių funkcijų, regexp.
Viskas: daugmaž tiek žinių man pakanka išspręsti tavo uždavinį 
pakankamai greitai.



> finale tikslas būtų toks kaip attchm. Bet ten dar yra daugiau teksto,
> kuris neatrodo vien stulpeliuose, todėl ir maniau, kad vienas nekintamas

Tai gana paprasta (su komentarais):

BEGIN {
	# Šis BEGIN blokas vykdomas prieš skaitant failą.
	# Kol kas nustatome, kad po kiekvieno print nedėliotų newline
	# ORS — output record separator
	ORS = ""
}

## Sąlygų blokai ##

# Regular expression sąlyga, nors galima parašyti ir taip:
# ($1 == "Date:" || $1 = "Time:") { ... }
$1 ~ /Date:|Time:/ {
	# išvedame datą arba laiką su kabliataškiu
	print $2 ";"
}


# Penki stulpeliai eilutėje (tik eilutės su temperatūra) ir žyma
# (pirmas stulpelis) prasideda raide E, o po to seka skaičius.
# Suprantama, čia gali tekti koreguoti, taikyti kompleksiškesnes
# sąlygas, jei failo formatas keičiasi, gali būti įvairesnis

NF >= 5 && $1 ~ /E[0-9]+/ {
	# išvedame trečią ir ketvirtą stulpelius
	print $3 ";" $4 ";"
}


# blokas be sąlygos (vykdomas kiekvienai perskaitytai eilutei)
{
	# jis tuščias	
}


END {
	# šis END blokas vykdomas perskaičius failą
}

Vualia:
 > cat report.txt | iconv -f utf-16 -t utf-8 | gawk -f parse.awk

11/19/13;06:24;195.0;195.0;185.0;185.3;175.0;175.2;165.0;164.9;

Tai — praktiškai pilnavertis CSV, kurį gali importuoti (galima ir 
stulpelius: Data, Laikas, E1 ... pradžioje pridėti) į excel'į (Data -> 
Import External Data). Arba jau tikrai turėtum susigaudyti, kaip tokį 
failą VBA išnarstyti ir į celes surašyti:

arr = Split(line, ";")
<...>