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

Fórumok

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ások

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!

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.

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 :)

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.