Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Timo Virtanen - 04.04.08 - klo:22.57
-
Löytyisikö joku bittiritari, joka osaisi tehdä ohjelmanpätkän, jolla radioamatöörien käyttämä ADIF tiedostomuoto kääntyisi CSV muotoon. Saisin Glabel ohjelman tulostamaan radioyhteystiedot tarroille. Tarrat liimaisin QSL-kortteihin. Kortit lähtevät vasta-asemille todisteeksi yhteydestä. Meitä hamsseja on muutama miljoona, joten markkinoita olisi. Tällaista muunto-ohjelman pätkää ei ole vielä tehty, tietääkseni. ADIFista löytyy tietoa netistä googlaamalla ja annan mielelläni lisätietoa. terveisin Timo
-
Tein jonkinlaisen viritelmän Tcl:n avulla. Ohjelma ottaa ensimmäisenä parametrina tulostettavien kenttien nimet pilkuilla eroteltuna ja toisena parametrina ADIF-tiedoston nimen. Ohjelma tulostaa kentät CSV-muodossa stdout:iin. CSV-tuki on vaillinainen mikä näkyy rikkinäisenä tulostuksena jos kenttien arvot sisältävät erikoistapauksiin kuuluvia merkkejä (lähinnä lainausmerkki).
Ohjelma vaatii toimiakseen Tcl:n.
Ajoesimerkki:
$ ./adif2csv.tcl call,qso_date,time_on,time_off,operator,qslmsg,dxcc trx.adi
Ohjelmalistaus:
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
# Compatibility with Tcl 8.4
# http://wiki.tcl.tk/1530
if { [info procs lassign] eq "" } {
proc lassign {values args} {
uplevel 1 [list foreach $args [linsert $values end {}] break]
lrange $values [llength $args] end
}
}
proc readTags {data} {
set tags {}
set pos 0
while 1 {
if { [regexp -nocase -start $pos -- \
{\<([a-z0-9_]+)(?::(\d+)(?::(\w+))?)?\>} $data \
-> tag len type] } {
if { $len == "" } { set len 0 }
set pos [expr { [string first ">" $data $pos] + 1 }]
set pos2 [expr { $pos + $len - 1}]
set tag [string tolower $tag]
set value [string range $data $pos $pos2]
set pos [expr { $pos2 + 1}]
lappend tags $tag $value
} else {
break
}
}
return $tags
}
proc processFile {fileName fields} {
set fp [open $fileName]
set data [read $fp]
close $fp
set skipHeader 0
if { [string index $data 0] != "<" } {
set skipHeader 1
}
array set tags {}
foreach {tag value} [readTags $data] {
if { $skipHeader } {
if { $tag == "eoh" } { set skipHeader 0 }
}
set tags($tag) $value
if { $tag == "eor" } {
set values {}
foreach {field} $fields {
if { [info exists tags($field)] } {
regsub -all -- \" $tags($field) {""} value
lappend values [format {"%s"} $value]
} else {
lappend values {""}
}
}
puts [join $values ","]
array unset tags
}
}
}
proc main {} {
global argv0 argv
if { [llength $argv] != 2 } {
puts stderr "Usage: $argv0 fieldname(,fieldname,...) filename"
return 1
}
set fields [split [lindex $argv 0] {,}]
set fileName [lindex $argv 1]
processFile $fileName $fields
}
main
Edit: Korjattu lainausmerkin käsittely CSV-exportissa.
-
Hienoa! Miten etenen tästä? Mitkä tcl paketit asennan?. Synapticissa on monta tcl-pakettia. Miten osoitan tai haen ADIF tiedoston muunto-ohjelmaan? Odotan koekäyttöä malttamattomana. ;D terveisin Timo
-
Hienoa! Miten etenen tästä? Mitkä tcl paketit asennan?. Synapticissa on monta tcl-pakettia.
Riittänee kun asentaa joko paketin tcl8.4 tai tcl8.5 (riippuen siitä mitä paketinhallinnasta löytyy). Jälkimmäinen on tuoreempi ja samalla myös suositeltavampi asennettava mutta tämän skriptin toiminnan kannalta ei ole merkitystä kumman asentaa.
Miten osoitan tai haen ADIF tiedoston muunto-ohjelmaan?
Lähdekoodi oli tuossa aiemmassa viestissäni ja se tarvitsee vain kopioida ja tallentaa johonkin tiedostoon (esim. adif2csv.tcl). Lisäksi tiedostolle pitää antaa ajo-oikeudet ja komentoriviltä tämä onnistuu komennolla "chmod +x adif2csv.tcl" ja tämän jälkeen tiedoston suorittaminen pitäisi onnistua aiemmassa viestissä olleen ajoesimerkin mukaisesti. Esimerkissä oletettiin että hakemistossa on ADIF-tiedosto trx.adi.
Komentorivin perusteita en rupea tässä opettamaan. Mikäli se on vierasta niin kannattaa opiskella sen käyttöä jostakin muualta (http://linux.fi/index.php/Komentorivin_perusteet).
Jokuhan voisi tietysti tehdä tuolle graafisen käyttöliittymän.
-
Jep, komentorivin käyttö opetellaan muualla. Ei muuta kuin testiajoon. Ilmoittelen miten käy ....terveisin Timo
-
ADIF kääntyy CSV:ksi. ;D ;D Ohessa esimerkki:
"TM5A","20070909","190908","191041","","","227"
"JW6BKA","20070909","231808","231947","","","259"
"3B7C","20070920","102500","000000","","","4"
"RA9LI","20070920","123400","170423","","","15"
Homma jatkuu... terveisin Timo
-
ADIF kääntyy CSV:ksi. ;D ;D
Hyvä kuulla.
-
Homma etenee. Adif >> CSV muunnoksen tallensin oh7jha.csv nimellä kotikansioon. Asensin Glabel ohjelman ja tein testitarran. Hain oh7jha.csv tiedoston Glabel ohjelmaan. Otin esikatselun ja siellä oli!!! Nyt ollaan pitkällä.
Ongelma on se, että tarvitsen vain 6 oleellista tietoa tarraa varten.
<call:5>G7IYA <dxcc:3>223 <cqz:2>14 <cont:2>EU <qso_date:8>19990101 <time_on:6>182500 <time_off:6>182500 <name:5>Brian <qth:8>Radstock <band:3>20M <mode:3>SSB <rst_sent:2>59 <rst_rcvd:2>59 <qsl_sent:1>Y <qsl_sent_via:1>B <qsl_rcvd:1>Y <qsl_rcvd_via:1>B <tx_pwr:6>100,00 <eor>
Tuossa ADIF pätkässä on yhden radioyhteyden tiedot, siitä pitäisi poimia <call> <qso_date> <time_on> <band> <mode> <rst_sent> tarraa varten. Miten tuo onnistuu lähdekoodillasi? terveisin Timo
-
Tuossa ADIF pätkässä on yhden radioyhteyden tiedot, siitä pitäisi poimia <call> <qso_date> <time_on> <band> <mode> <rst_sent> tarraa varten. Miten tuo onnistuu lähdekoodillasi? terveisin Timo
Ensimmäisellä parametrilla kerrotaan pilkuilla eroteltuina haluttujen kenttien nimet.
$ ./adif2csv.tcl call,qso_date,time_on,band,mode,rst_sent tiedosto.adif
-
;D ;D ;D Nyt ollaan kalkkiviivoilla:
"TM5A","20070909","190908","20M","SSB","59"
"JW6BKA","20070909","231808","20M","SSB","59"
"3B7C","20070920","102500","15M","SSB","59"
terveisin Timo
-
;D Toimii! ;D Sain tulostettuaa PDF-tiedostoon haluamani mallin mukaiset tarrat! Näin ei tarvitse tuhlata kalliita tarroja tulostustesteihin. Miten on mgronder, saanko välittää lähdekoodin linux lokiohjelmaa tekevälle kaverille liitettäväksi seuraavaan lokiohjelman versioon? (Googleta "cqrlog"). Siis ei kaupalliseen tarkoitukseen. Olen todella kiitollinen ja on vaikea löytää foorumille sopivia, nasevia ilmauksia, mutta kelpasiko näin alkuun "Kiitos!" terveisin Timo
Voitko ottaa yhteyttä emaililla oh7jha "miukumauku" sral.fi
-
Miten on mgronder, saanko välittää lähdekoodin linux lokiohjelmaa tekevälle kaverille liitettäväksi seuraavaan lokiohjelman versioon? (Googleta "cqrlog").
Ihan vapaasti. Epäilen vain tuon hyödyllisyyttä kun tuo cqrlog on näköjään tehty pascalilla ja minun skriptini on Tcl:ää.
Voitko ottaa yhteyttä emaililla
Lähetin sähköpostia.