Nyt on nöyrryttävä ja kysyttävä viisaammilta.
Minulla on csv-tiedosto (dumppi tietokannan taulusta), jossa on hirvittävä määrä vanhan järjestelmän id-numeroita (esim. muotoa: AA3432OO9). Vein tähän ko. tiedostoon liittyviä tietoja järjestelmään ja jotta voisin liittää nämä niihin, tulisi minun korvata csv-tiedoston vanhat id-numerot uuden järjestelmän tarjoamilla.
Järkeilin, että helpointa olisi menetellä seuraavasti:
1. Tehdään luettelo, jossa on järjestelmään vietyjen tietojen id:t ja niiden vanhat id:t (jotka täsmäävät csv-tiedoston id:n).
2. Kirjoitetaan skripti, joka poimii luettelosta yksi kerrallaan vanhan id:n, etsii sitä vastaavat id:t csv-tiedostosta ja korvaa löytämänsä id:t luettelossa olevilla uusille id:llä.
Tämä on varmaan helppo juttu jollekin, mutta oma osaaminen shell-puolen (ja yleisestikin) ohjelmoinnissa on vaatimatonta, joten pyytäisinkin vinkkiä, miten olisi viisainta edetä tämän kanssa.
Kiitoksia.
p.s. Ja tämä ei ole a) koulutehtävä tai b) työtehtävä, jonka tekemisestä minulle maksetaan palkkaa, vaan osastoa työ tekijäänsä kiittää.
Merkkijonojen korvaaminen (skripti, csv)
Xcode, Mac OS X Server sekä muuta hauskaa ja hyödyllistä
7 viestiä
• Sivu 1/1
-
- Viestit: 169
- Liittynyt: 30.5.2007 klo 21.00
Merkkijonojen korvaaminen (skripti, csv)
Viesti Kirjoittaja K-Mikko »
-
- Viestit: 1014
- Liittynyt: 6.11.2004 klo 19.35
Re: Merkkijonojen korvaaminen (skripti, csv)
Viesti Kirjoittaja nobu178 »
Jos toisiaan vastaavat id:t on selvillä, homma hoituu lennossa, kaksi silmukkaa vaan. Mallin kirjoittamiseen tarvitaan kuitenkin vähän enemään tietoja.
-
- Viestit: 1351
- Liittynyt: 11.12.2009 klo 21.11
Re: Merkkijonojen korvaaminen (skripti, csv)
Viesti Kirjoittaja jpsuominen »
Eli onko niin, että "vanha id" <-> "uusi id" on yksi-yhteen, vai voiko yhtä vanhaa id:tä vasten olla useampi uusi id tai toisin päin? Jäi nimittäin vähän epäselväksi. Jos tarkennat tuon ja laitat vähän osviittaa noiden csv-tiedostojen muodosta niin äkkiäkös tuollaisen skriptin sulle pyöräytän.K-Mikko kirjoitti: 2. Kirjoitetaan skripti, joka poimii luettelosta yksi kerrallaan vanhan id:n, etsii sitä vastaavat id:t csv-tiedostosta ja korvaa löytämänsä id:t luettelossa olevilla uusille id:llä.
-
- Viestit: 2505
- Liittynyt: 23.11.2004 klo 20.02
- Paikkakunta: Oulu
Re: Merkkijonojen korvaaminen (skripti, csv)
Viesti Kirjoittaja tkt »
Tähän ongelmaan on olemassa lähes ääretön määrä ratkaisuja. Valinta riippuu mm. tehtävän toistuvuudesta sekä aineiston koosta. Suurilla aineistoilla kannattaa käyttää tietokantapohjaista ratkaisua, mutta pienet saa parhaiten tehtyä käsin. Ohessa on esimerkki keskikokoisesta ratkaisusta.
aineisto.txt: Tiedosto, jossa on alkuperäinen aineisto. Kentät on eroteltu puolipisteellä ja rivit unix-rivinvaihtolla (\n).
koodit.txt: Luettelo avain-arvo pareista. Ensiksi vanha koodi ja perässä uusi arvo. Kentät on eroteltu puolipisteellä ja rivit unix-rivinvaihtolla (\n).
poimi.command: Shell-skripti aineistojen yhdistämistä varten. Ajetaan komennolla "sh poimi.command" ja tulos saadaan stdout:iin. Lopputuloksen muoto on sama kuin alkuperäinen aineisto, mutta kunkin rivin loppuun on lisätty uusi tieto.
Kaikki yo. tiedostot tulee tallettaa samaan hakemistoon, jotta ohjelma toimisi. Erityisen tarkkana kannattaa olla rivinvaihtojen kanssa. Esimerkki olettaa käytettävän unix-rivinvaihtoja. Jos poimi.command -tiedostolle määritellään suoritusoikeudet (chmod a+x poimi.command), niin ohjelman voi ajaa myös graafisessa tilassa kaksoisosoittamalla poimi.command -ikonia.
--Ari
aineisto.txt: Tiedosto, jossa on alkuperäinen aineisto. Kentät on eroteltu puolipisteellä ja rivit unix-rivinvaihtolla (\n).
Koodi: Valitse kaikki
1;kaali;aapeli
2;porkkana;toopeli
3;lanttu;jumpeli
4;nauris;kummeli
5;retiisi;tomppeli
8;peruna;aapeli
9;kurkku;toopeli
6;tomaatti;jumpeli
7;banaani;kummeli
11;omena;tomppeli
14;ananas;aapeli
16;pinjansiemen;toopeli
18;ruohosipuli;jumpeli
21;paprika;kummeli
12;jalapeno;tomppeli
Koodi: Valitse kaikki
aapeli;Risto Reipas
toopeli;Isto Innokas
jumpeli;Atso Aneeminen
kummeli;Tuure Tunnokas
tomppeli;Martti Vartti
Koodi: Valitse kaikki
#!/bin/bash
for i in `cat aineisto.txt`; do
avain=`echo $i|awk -F\; '{print $3}'`
arvo=`grep $avain koodit.txt|awk -F\; '{print $2}'`
echo $i";"$arvo
done
--Ari
-
- Viestit: 1351
- Liittynyt: 11.12.2009 klo 21.11
Re: Merkkijonojen korvaaminen (skripti, csv)
Viesti Kirjoittaja jpsuominen »
Tosin tuossa haluttiin korvata se alkuperäinen, joten muokkasin ehdotustasi hieman. Ja turhaa siitä mitään skriptiä on tehdä jos tuo halutaan ajaa vain kerran, nuo komennot voi kirjoittaa tuollaisenaan komentoriville jolloin haluttu tuloste löytyy uusi_aineisto.txt tiedostosta.tkt kirjoitti:Koodi: Valitse kaikki
for i in `cat aineisto.txt`; do avain=`echo $i|awk -F\; '{print $3}'` arvo=`grep $avain koodit.txt|awk -F\; '{print $2}'` echo $i | sed s/$avain/$arvo/ done > uusi_aineisto.txt
-
- Viestit: 1014
- Liittynyt: 6.11.2004 klo 19.35
Re: Merkkijonojen korvaaminen (skripti, csv)
Viesti Kirjoittaja nobu178 »
sedistä puuttuu launausmerkit.
-
- Viestit: 169
- Liittynyt: 30.5.2007 klo 21.00
Re: Merkkijonojen korvaaminen (skripti, csv)
Viesti Kirjoittaja K-Mikko »
Kiitoksia vastanneille hyvistä ideoista ja ratkaisuehdotuksista. Koitin aamusella vielä kerran googlettaa vastausta ja löysinkin tällaisen ratkaisun, minkä ehdin todeta toimivaksi. Itseasiassa tämä taitaa olla karvalakki-versio tkt:n esittelemästä selkeämmältä ja ymmärrettävämmältä näyttävästä toteutuksesta.
korvaus.sh:
korvaa.txt (formaatissa korvattava string|korvaava string):
Ja scriptin tulosteen voi halutessaan ohjata uuteen tiedostoon:
korvaus.sh:
Koodi: Valitse kaikki
awk -v FS='|' ' NR == FNR { arr[$1]=$2; next }
{
for (str in arr)
gsub(str,arr[str])
print $0
}' korvaa.txt Aineisto.csv
Koodi: Valitse kaikki
00120000001ANVwAAO|2x13412
Koodi: Valitse kaikki
./korvaus.sh > UusiTask.csv
7 viestiä
• Sivu 1/1
Palaa sivulle “Ohjelmointi, skriptit ja palvelimet”
Hyppää
- Yleiset aiheet
- ↳ Ajankohtaista Apple-maailmasta
- ↳ Käyttöjärjestelmät
- ↳ Ohjelmat
- ↳ Yleiskeskustelu
- Mac ja oheislaitteet
- ↳ Yleiskeskustelu laitteista
- ↳ MacBook, MacBook Pro ja MacBook Air
- ↳ iMac
- ↳ Mac mini
- ↳ Mac Pro ja Mac Studio
- ↳ Ongelmia Macin kanssa?
- iPhone, iPad ja Apple Watch
- ↳ iPhone-, iPad- ja Apple Watch -laitekeskustelu
- ↳ iPhone-, iPad- ja Apple Watch -ohjelmat sekä iOS
- ↳ Ongelmia iPhonen, iPadin tai Apple Watchin kanssa?
- Huviksi ja hyödyksi
- ↳ Off-topic
- ↳ Kuva ja graafinen suunnittelu
- ↳ Audio ja musiikki
- ↳ Video, televisio ja elokuvat
- ↳ Pelit ja pelaaminen
- ↳ Ohjelmointi, skriptit ja palvelimet
- ↳ Tietoturva ja varmuuskopiointi
- ↳ Verkot, mobiilidata ja muut puhelimet
- ↳ Retronurkka
- ↳ Foorumin ylläpito
- Kauppapaikka
- ↳ Myydään Mac
- ↳ Myydään iPhone, iPad ja iPod
- ↳ Myydään muut Applen tuotteet
- ↳ Myydään muuta tietotekniikkaa
- ↳ Ostetaan Mac
- ↳ Ostetaan iPhone, iPad ja iPod
- ↳ Ostetaan muut Applen tuotteet
- ↳ Ostetaan muuta tietotekniikkaa
- ↳ Vaihdetaan, annetaan, työtä haetaan ja tarjotaan
- ↳ Kauppapaikan keskustelu ja hintavinkit