Hi!
Hogyan lehet asszociatív módon lekérni egy select egyik sorának egyik oszlopát?
A gondom az, hogy bizonyos oszlopok elemei tartalmaznak spaceket is, és az IFS szerint kicsit elromlik a ciklusom.
Íme a kód:
read $passwd;
while read SOR; do
while read -a tomb; do
id=${tomb[0]};
name=${tomb[1]}
email=${tomb[2]}
valid=${tomb[3]}
echo "$id: $name, $email, $valid";
done < <(echo $SOR)
done < <(mysql -u user --password=$passwd db ie 'select ..');
Pl. a name oszlop tartalmaz spaceket, és emiatt tolódik az érték, pl. egyes sorokban az email értéke a name első space utáni része lesz, pl. a keresztnév.
Köszi.
- 1486 megtekintés
Hozzászólások
IFS="
"
(a tartalma egy enter)
- A hozzászóláshoz be kell jelentkezni
Gondoltam rá, hogy az IFS- sel kellene valamit kezdeni, csak nem jöttem rá, hogy mit. Sajnos a fenti megoldás nem jó, így az első (id) változóban megkapom az egész sort, ami persze sajnos logikus is, hiszen enter csak a sorok végén fordul elő, az oszlopok között nem :- (. Kipróbáltam azt is, hogy a belső ciklus előtt elmentem az IFS- t, utána pedig mindig visszaállítom, de akkor sem jó... . ^
- A hozzászóláshoz be kell jelentkezni
Oke, vegigolvastam mit szeretnel csinalni, es szerintem ertem is. Csunya, de megoldas, hogy oszloponkent selectelsz, a space-eket lecsereled valami nem hasznalt karakterre, megcsinalsz veluk mindent amit akarsz, es visszaalakitod a space-eket. Ezt valoszinu meg lehet csinalni szebben is, nem ertek az sql-hez a select, insert, update, delete-n tul.
Ha a fenti peldanal maradunk, ott eleg a name-re kulon select, es azokra az oszlopokra, amiben szokoz lehet.
- A hozzászóláshoz be kell jelentkezni
Hasonlóra én is gondoltam, hogy egy php + wget párossal úgy kiszedem, hogy legyen normális (egyedi) határolókarakter a mezők között, és utána cut- tal fel tudom dolgozni, de valahogy nem tudom elképzelni, hogy nincsen rendes megoldás ehhez mysql- ben. Igazából gyanús nekem, hogy tabok vannak az oszlopok között, legalábbis amikor kiiratom, akkor rendezetten írja ki, s ha az egyik mező egy karakterrel hosszabb, akkor egy tabnyival kezdődik később. Na, ezt megmondtam, de remélem érthető volt :- ).
- A hozzászóláshoz be kell jelentkezni
HA viszont tabok vannak az oszlopok kozott, akkor meg lehet csinalni IFS-sel is. Az IFS erteke alapesetben whitespace, allitsd be tabra.
- A hozzászóláshoz be kell jelentkezni
Bocs, tegnap elfelejtettem leírni, hogy kipróbáltam IFS- t tabra állítani, de nem ment, akkor mindent megkaptam az első változóban, vagy lehet, hogy a joe nem kezeli rendesen a tabokat? Nem hinném, de kipróbálnám valami kóddal. Tudja valaki hogy lehet úgy megadni a tabot? Bár mondjuk fura lenne, ha egy tab lenyomására valami mást írna le a joe.
- A hozzászóláshoz be kell jelentkezni
mceditnek alapbeallitasnal van ilyen baja, hogy space-t rak tab helyett, lehet joe-nak is. Hasznalj vi-t:). Esetleg az IFS="\t" is mukodhet.
- A hozzászóláshoz be kell jelentkezni
Hali,
ha nem csak es kizarolag az nev tartalmazhat space-t, akkor nyilvan nem lehet megoldani, hiszen nem egyertelmu, mi hova tartozik. Ha csak es kizarolag a nevben lehet space, ird at a select-et, uh hogy a nev legyen az utolso oszlop. Ha jol ertem amit irtal ez egybol megoldja a problemat, de ha nem, akkor is megkonnyiti.
PS. a read $passwd gyanus, sztem az read passwd volt.
PS2. nem latom az ertelmet a 2 ciklusnak:
while read -a tomb; do
done < <(mysql -u user --password=$passwd db ie 'select ..');
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni
uh, az tényleg
read passwd
, csak azt a sort utólag raktam bele kézzel, és valahogy elírtam :- ). Ha a végén van a név mező (ebben az esetben csak az tartalmaz szóközt), akkor hogy tudom megoldani, hogy mondjuk a tomb 3. elemétől az összeset fűzze bele egy változóba? Most csak azt tudom elképzelni, hogy írok rá egy while ciklust, ami addig fűzi az elemeket hozzá, amíg a tömb értéke be van állítva (ugyanis van olyan név, ami 5 részes), de nincs erre valami egyszerűbb megoldás?
A 2 ciklus azért kell, mert a külső beolvas egy sort, a belső meg a sor elemeit olvassa be a tomb változóba, bár mivel csak egyszer fut le, elég lenne helyette egy
read -a tomb < <(echo $SOR)
is :- ).
- A hozzászóláshoz be kell jelentkezni
Erre gondoltam, kicsit elnagyoltan irtam az elobb..
while read id email valid name; do
echo "$id: $name, $email, $valid";
done < <(mysql -u user --password=$passwd db ie 'select ..');
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni