excel tábla gyors, fájdalommentes átalakítása

 ( john_silver | 2010. november 9., kedd - 13:43 )

Adott egy excel tábla benne a következő adatokkal:

kód|sorszám|dátum|parameter1|parameter2|paraméter...|paraméter83

az oszlopok alatt pedig jönnek az értékek

ezt a táblázatot kellene úgy átalakítani, hogy minden paraméter és a hozzá tartozó érték egy sor

kód|sorszám|dátum|paraméter1|érték
kód|sorszám|dátum|paraméter2|érték

remélem érthető, hogy mit szeretnék, a cél az lenne, hogy az így kapott táblát adatbázisba lehessen beimportálni.

Kézzel elég macerás lenne.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

ha nem megy a visualbasic, akkor csinálj belőle csv-t, aztán feldolgozod egy pársoros, tetszőleges nyelven írt szkripttel...

http://pastebin.com/Sa45i9yL

Beillesztettem ide hogy hogyan néz ki a tábla csv-ben és hogy milyet szeretnék.
Sajnos nem értek sem a visualbasic-hez, sem a szkriptekhez.

Ha jól gondolom, akkor a szkript venné az első sort és mindig csak egy paramétert másolna mellé plusz az értéket, ha végzett mind a 83 paraméterrel, akkor lépne a második sorra.
Remélem jól gondolom, de szkriptként megírni nem tudnám.

"Ha jól gondolom, akkor a szkript venné az első sort és mindig csak egy paramétert másolna mellé plusz az értéket, ha végzett mind a 83 paraméterrel, akkor lépne a második sorra."
Nagyon jól megfogalmaztad mit kell csinálni! Már csak ki kellene választanod az eszközt amivel ezt megcsinálod.
Itt az ideje egy szkriptnyelvbe belemélyedni! Nem kell megijedni persze mert ez egy elég egyszerű feladat.
Aminek utána kéne nézned ha megvan a nyelv, címszavakban:
fájl beolvasás soronként stringváltozóba
string tördelése adott jel (;) mentén
töredékek tömbváltozóba helyezése
ciklus tömb olvasásához
stringek összefűzése
stringsor kírása fájlba

És már meg is vagy!

Köszönöm.

Már egy ideje úgy is szeretném megismerni a perl-t, valószínűleg ez lesz a választott nyelv.

Vízmű Rt. ?

Nem. Az adatok viszont vízvizsgálati eredmények.

Azért gondoltam...

Milyen adatbázis?(sql loadert lehetne használni)
Van valamilyen eszközöd tábla editálásra? (copy-paste)

Firebird az adatbázis.

Tudom a táblát szerkeszteni.

Mihez/mivel használod az adatbázist magát? Mármint nem valami általad írt szoftver lesz a vége, amibe integrál(tat)hatnád az importot?
Amúgy egyszerű scriptnyelvként én php-t szoktam használni ilyen célokra. Némi programozói vénával a függvényreferenciákból max. fél óra alatt össze-copy-paste-elhetsz egy ilyen scriptet.

Az adatbázist egy nem általam írt program használja. Az új adatok már a program által elvárt formában fognak érkezni, a program előtti adatokat kell emészthető formára hozni, hogy be tudjam importálni.

Azt sajna nem ismerem, és nem tudom, menne-e a copypaste.
Mondjuk annyit megér a dolog, hogy létrehozol
egy temp táblát a kívánt oszlopokkal, lehetőleg string mezőtípussal(hossz is fontos), aztán megnyitod a táblát
valahogy így : select * from temp for update és felveszel egy pár üres sort(insert). Átklattyintasz az excelbe, kijelölöd az átvinni kivánt oszlopokat,
sorokat copy(a szükséges adatokat áttheted egy másik sheetre is onnan egyszerűbb), majd vissza db kezelőbe és paste(itt egy sort próbálj kijelölni, ne az oszlopba akard berakni az összes adatot). Ha sikerült
akkor mehet mindre, ha nem akkor kézimunka.

Hmm... Ez is jó kis túrás, de ennyi erével végülis excelben is át lehet sakkozni, csak kicsit munkás:
-paraméter fejlécek leduplikálása további 83 oszlopfejnek, majd leszaporítása a teljes tábla hosszában
-utána cut-paste ezeket az oszlopokat egyenként az értékoszlopaik elé, így lesz alapadatok|par1|érék1|par2|érék2...stb.
-aztán leduplikálni a munkalapot, az egyikről a paraméter/érték-pár oszlopok felét kidobni, másikról a másik felét, majd 1 táblába egymás után másolni és ezt iterálni a kívánt végeredményig

Végülis, ~20 perc alatt szerintem ez is megvan :)

Az excel tábla kétezer sort tartalmaz, minden sort lényegében meg kell szorozni nyolcvanhárommal az 166.000 sor. Nem szívesen állnék neki kézzel.

A sorok száma igazából lényegtelen. A 2e nem is olyan sok. Inkább az a 83 oszlop a munkás ennél a verziónál :(
Úgyhogy végülis megértelek - csak ötleteltem.
Maradjon a script!

Miért kellene szorozni?
Amit a pastebinre tettél, ott csak 8 oszlop van, ami érdekel,
ezt nem hiszem, hogy sok időbe kerül kijelölni, vagy másik
sheetre tenni.
Vagy elnéztem?
Táblába táblát kellene copypaste-zni.
Erre irányult a hozzászolásom.

Ilyesmire gondoltal?

Ertelem szeruen ki kell mentened egy fajlba, adnod kell neki +x jogot. Ellenorizd, hogy a perl ott van e ahova az elso sor mutat. Futtatni ugy tudod, hogy
akarmi.pl input.csv>output.csv

Windows alatt szedd le a perl -t pl innen (vagy cygwin -ben is van). Futtatni ugy tudod, hogy
perl akarmi.pl input.csv>output.csv

Biztos nem tokeletes, de kiindulasnak jo lesz.

Mivel az AWK-ot kedvelem:

#!/usr/bin/awk -f

BEGIN { FS = ";" }

(NR == 1) {
	for (i = 1; i <= NF; ++i)
		title[i] = $i;
}

(NR != 1) {
	for (i = 6; i <= NF; ++i) {
		for (j = 1; j < 6; ++j)
			printf("%s;", $j);

		printf("%s;%s;\n", title[i], $i);
	}
}

futtatás: ./akarmi.awk in.csv > out.csv

-----
"Ha javulni látod a dolgokat, akkor valami fölött elsiklottál."

Kicsit szebben:

#!/usr/bin/awk -f

BEGIN { FS = ";" }

(NR == 1) {
	for (i = 1; i <= NF; ++i)
		title[i] = $i;
	
	head = "";
	for (j = 1; j < 6; ++j)
		head = head title[j] ";";
}

(NR != 1) {
	for (i = 6; i <= NF; ++i) 
		printf("%s%s;%s;\n", head, title[i], $i);
}

-----
"Ha javulni látod a dolgokat, akkor valami fölött elsiklottál."

Nagyon köszönöm a kódokat, ki fogom próbálni. Megpróbálom megérteni, hogy mi mit csinál.