-Logos- Skrevet 10. juli 2007 Skrevet 10. juli 2007 (endret) Hei, trenger hjelp til ett prosjekt jeg jobber med. Jobben går ut på gps posisjonering av punkter med et spesiellt bygget program, i dette programmet har man også mulighet til å tracke ruta, hvor den gir ett nytt gps punkt hvert x'te sekund.... Jeg søker derfor en som kan programmer som grep og sed ol. til å hjelpe meg litt med følgende problem: Outputen fra dette programmet ser slik ut 10.07.2007 09:10:32;59,7435916666667;10,2086483333333 10.07.2007 09:10:02;59,743535;10,2086383333333 10.07.2007 09:09:22;59,74347;10,2087016666667 Jeg ønsker å konvertere dette til ett format som autoroute klarer å lese som ser slik ut: Longitude,Latitude,Name,Information -10.2086483333333,59.7435916666667,"10.07.2007 09:10:32","" -10.2086383333333,59.743535,"10.07.2007 09:10","" -10,2087016666667,59,743535,"10.07.2007 09:09:22","" Forskjellen er som sagt endring av rekkefølgen på verdiene, samt noe tegnsetting inn i dette. Hvis noen har en veldig god og enkel løsning på dette problemet, og har tid til å kanskje knotte en liten komando som enkelt flytter verdiene til riktig sted hadde jeg blitt evig glad. Det er snakk om mange hundre koordinater neddover tekstfila, så å gjøre dette manuelt ville vært evighetsjobb. På forhånd takk:) -Marius Endret 10. juli 2007 av mariunae
Kagee Skrevet 10. juli 2007 Skrevet 10. juli 2007 (endret) Ser disse dataene riktige ut? Longitude,Latitude,Name,Information -10.2086483333333,59.7435916666667,"10.07.2007 09:10:32","" -10.2086383333333,59.743535,"10.07.2007 09:10:02","" -10.2087016666667,59.74347,"10.07.2007 09:09:22","" Da kan du bruke dette, som riktignok er skrevet i PHP. <?php // Sjekk at vi har argumentene for inn- og outputfil if (isset($argv[1]) && isset($argv[2])) { // Sjek at vi kan lese inputfila if ($input = @file($argv[1],FILE_IGNORE_NEW_LINES)) { // Sjekk at vi kan skrive til outputfila if ($output = @fopen($argv[2], "w+")) { print("Kan lese inputfil og skrive outputfil, starter konvertering:\n"); // Skriv inn kolonneinformasjon i outputfila fwrite($output, "Longitude,Latitude,Name,Information\n"); $lastline = ''; foreach ($input as $line) { if ($line == $lastline) { continue; } // hopp over like linjer $lastline = $line; // Gjør dette for hver linje i inputfila #echo $line . "\n"; // Del linje på; $temp = explode(";",$line); $linepart[]= $temp[0]; $linepart[]= str_replace(",", ".", $temp[1]); // bytt ut , med . // for disse to variabler $linepart[]= str_replace(",", ".", $temp[2]); // Sett sammen den nye linjen (unexplode) $data = $linepart[2].',' . $linepart[1] . ',"' .$linepart[0] . '",""' . "\n"; #print $data; // Skriv dataene til outputfila fwrite($output, $data); // Tom variablene for klargjøring til neste linje $linepart = null; $data = null; } print("Ferdig\n"); } else { print("Kunne ikke åpne fil for skriving: " . $argv[2] . "\n"); } } else { die("Kunne ikke lese filen: " . $argv[1] . "\n"); } } else { print("Trenger input & ouputfilnavn som argumenter\n"); } ?> Kjøres på kommandolinjen etter at du har installert php5-cli (kan hende php4-cli fungerer også(cli = command line interface)) Fjern de to #'ene for å følge med på hver linje. Ubuntu: sudo aptitude install php5-cli php convert.php inputdata.txt outputdata.txt convert.php er den lagrede fila med php-koden, input og output er selvforklarende. Windows: http://no2.php.net/manual/en/features.commandline.php Tar gjerne imot kommentarer Edit: Oppdatert kode 2 ganger og resultat 1 gang Endret 11. juli 2007 av Kagee
-Logos- Skrevet 10. juli 2007 Forfatter Skrevet 10. juli 2007 (endret) Ser utrolig bra ut ved første øyekast! Eneste foreløpige feil er at i koordinatene: -10,2086383333333,59,743535 Skal det være punktum etter de 2 første tallene, ikke komma da autoroute bruker komma til å adskille med -10.2086383333333,59.743535 Neste problem er at det her kom det på 2 linjer Longitude,Latitude,Name,Information -10,2086483333333 ,59,7435916666667,"10.07.2007 09:10:32","" osv Sitter ikke med tilgang til autoroute og linux akkurat nå, men skal komme tilbake så fort jeg har mulighet. Er det mulig å være så rask;) Skjønner at jeg har mye å lære(y) Endret 10. juli 2007 av mariunae
Kagee Skrevet 10. juli 2007 Skrevet 10. juli 2007 Oppdaterte koden så den endrer , til . La til flere kommentarer, hvis noen andre vil endre på dette senere. Er ikke Autoroute et Windows (Microsoft) program? og så bruker du linux for å kovertere filene?
-Logos- Skrevet 10. juli 2007 Forfatter Skrevet 10. juli 2007 bruker selv linux til daglig, men har også en microsoft maskin som jeg jobber på med gps-posisjoneringene. Hvorfor jeg valgte å leite etter en converter i linux istedet for windows er fordi jeg veit det er så utrolig mange gode programerere til linux, samt mange teknisk gode linuxbrukere på forumet. Skal teste koden nå, så kan sende deg outputen til hele dokumentet
-Logos- Skrevet 10. juli 2007 Forfatter Skrevet 10. juli 2007 Ser den fortsatt setter på 2 linjer. Legger ved outputen Ser utrolig bra ut ved første øyekast! Eneste foreløpige feil er at i koordinatene: -10,2086383333333,59,743535 Skal det være punktum etter de 2 første tallene, ikke komma da autoroute bruker komma til å adskille med -10.2086383333333,59.743535 Neste problem er at det her kom det på 2 linjer Longitude,Latitude,Name,Information -10,2086483333333 ,59,7435916666667,"10.07.2007 09:10:32","" osv Sitter ikke med tilgang til autoroute og linux akkurat nå, men skal komme tilbake så fort jeg har mulighet. Er det mulig å være så rask;) Skjønner at jeg har mye å lære(y) 9043285[/snapback] output.zip
Sokkalf™ Skrevet 10. juli 2007 Skrevet 10. juli 2007 (endret) Prøv : cat output | sed 's/,/./g' | gawk -F';' '{printf ("-%s,%s,\"%s\",\"\"\n", $3, $2, $1)}' Hvorfor gjøre det så vrient når det kan gjøres på én linje? Edit: Glemte headeren echo "Longitude,Latitude,Name,Information" && cat output | sed 's/,/./g' | gawk -F';' '{printf ("-%s,%s,\"%s\",\"\"\n", $3, $2, $1)}' bør fikse det. Endret 10. juli 2007 av Sokkalf^
Kagee Skrevet 10. juli 2007 Skrevet 10. juli 2007 (endret) Endre // Gjør dette for hver linje i inputfila #echo $line . "\n"; // Del linje på; $temp = explode(";",$line); $linepart[]= $temp[0]; til // Gjør dette for hver linje i inputfila #echo $line . "\n"; // Del linje på; $line = rtrim($line); $temp = explode(";",$line); $linepart[]= $temp[0]; Antagelig noe problem med ekstra "newlines".... Hvorfor gjøre det så vrient når det kan gjøres på én linje? 1. Din metode er mindre cross-os enn min 2. Jeg er mye flinkere på PHP enn på gawk og sed. Endret 10. juli 2007 av Kagee
Sokkalf™ Skrevet 10. juli 2007 Skrevet 10. juli 2007 Mindre cross-OS, tja, man får da gawk og sed på windows også, via services for unix eller Cygwin.
-Logos- Skrevet 10. juli 2007 Forfatter Skrevet 10. juli 2007 Kagee, det konverteringa fungerer perfekt nå(y). Utrolig bra. Er spent på om autoroute vil klare å legge inn data'ene. Jeg har ivartfall nå en løsning å legge fram for prosjektlederen. Er veldig taknemlig for alle løsninger gitt! Ville aldri klart å sette meg så nøye inn i programmene på den korte tiden jeg har før prosjektet starter. Mange tusen takk! - Marius
Kagee Skrevet 10. juli 2007 Skrevet 10. juli 2007 det beste ville vel vært en javaløsning..... og jeg driver å lærer meg java..... fristende......
Sokkalf™ Skrevet 10. juli 2007 Skrevet 10. juli 2007 Java blir vel litt vel tungt for noe såpass enkelt. Java er ikke det letteste språket å manipulere tekst i heller. (Selv om det er forholdsvis greit) Det enkle er ofte det beste.
Kagee Skrevet 11. juli 2007 Skrevet 11. juli 2007 (endret) Med en shell, en php og en javaløsning, har man mer å velge gjennom. Det er jo antagelig flere som har Java enn som har PHP på windows/tilgang til et bashshell. convert.zip Kildekode medfølger Edit: Fjernet "-" fra utfil. Endret 11. juli 2007 av Kagee
-Logos- Skrevet 11. juli 2007 Forfatter Skrevet 11. juli 2007 (endret) Skal si jeg har mye å velge i nå. Mange takk:) Tenkte også å opplyse om at verdiene gikk rett inn i Kartprogrammet akkurat slik jeg ønsket det! Trur jeg skal klare å finne veien nå! Sånn FYI, så fant jeg seinere ut at "-" ikke skulle legges til da... så bare fjerna den. Jeg som misforstod systemet, så punktene havna plutselig ut i atlanterhavet:P -M Endret 11. juli 2007 av mariunae
-Logos- Skrevet 11. juli 2007 Forfatter Skrevet 11. juli 2007 (endret) Lite spørsmål til hvis fortsatt noen leser denna tråden: jeg har nå endt opp med ett nytt problem, at noen punkter legger seg like etterhverandre ved bruk av et annet program. Dette programmet gir koordinater for andre data. Og kan legge det rett til tekstfil. Men outputen blir som sagt litt feil. hvordan kan jeg fikse dette, jeg ser for meg en slags if funksjon som sjekker: er linja over lik -> slett er linja over ulik -> Skriv linka Verdiene jeg har er slik: Longitude,Latitude,Name 59.579215,10.24102167,117 59.579215,10.24102167,117 59.579215,10.24102167,117 59.57452667,10.25458167,118 59.57452667,10.25458167,118 59.57452667,10.25458167,118 59.57473,10.25447167,119 59.57473,10.25447167,119 59.57473,10.25447167,119 59.572685,10.25550667,120 59.572685,10.25550667,120 59.572685,10.25550667,120 59.57207667,10.25619167,121 59.57207667,10.25619167,121 59.57207667,10.25619167,121 Skal bli: Longitude,Latitude,Name 59.579215,10.24102167,117 59.57452667,10.25458167,118 59.57473,10.25447167,119 59.572685,10.25550667,120 59.57207667,10.25619167,121 Endret 11. juli 2007 av mariunae
Sokkalf™ Skrevet 11. juli 2007 Skrevet 11. juli 2007 echo "Longitude,Latitude,Name,Information" && cat output | sed 's/,/./g' | gawk -F';' '{printf ("%s,%s,\"%s\",\"\"\n", $3, $2, $1)}' | uniq Sånn
-Logos- Skrevet 11. juli 2007 Forfatter Skrevet 11. juli 2007 (endret) Hvordan bruker jeg denne? Hvis jeg har: fil-a.txt fil-b.txt Der jeg skal lese fra: fil-a.txt til fil-b.txt echo "Longitude,Latitude,Name" && cat fil-a.txt| sed 's/,/./g' | gawk -F';' '{printf ("%s,%s,\"%s\",\"\"\n", $3, $2, $1)}' | uniq > fil-b.txt ? echo "Longitude,Latitude,Name,Information" && cat output | sed 's/,/./g' | gawk -F';' '{printf ("%s,%s,\"%s\",\"\"\n", $3, $2, $1)}' | uniq Sånn 9050646[/snapback] Endret 11. juli 2007 av mariunae
Sokkalf™ Skrevet 11. juli 2007 Skrevet 11. juli 2007 Hm, ja, men det ser ikke ut til å skrive headeren til fila. Dette funket, dog : echo "Longitude,Latitude,Name,Information" >fil-b.txt && cat fil-a.txt| sed 's/,/./g' | gawk -F';' '{printf ("%s,%s,\"%s\",\"\"\n", $3, $2, $1)}' | uniq >> fil-b.txt
-Logos- Skrevet 11. juli 2007 Forfatter Skrevet 11. juli 2007 Sender tilbakemelding så fort jeg har testa på linux-maskin:)
Sokkalf™ Skrevet 11. juli 2007 Skrevet 11. juli 2007 Tror jeg misforstod litt jeg, bare la til den opprinnelige funksjonaliteten til det nye problemet. For bare å skille ut ulike linjer holder det med : cat fil-a.txt | uniq > fil-b.txt
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå