Gå til innhold

Endre format på verdier i tekstdokument


Anbefalte innlegg

Skrevet (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 av mariunae
Videoannonse
Annonse
Skrevet (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 :cool:

 

Edit: Oppdatert kode 2 ganger og resultat 1 gang

Endret av Kagee
Skrevet (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 av mariunae
Skrevet

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?

Skrevet

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

Skrevet

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

Skrevet (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 av Sokkalf^
Skrevet (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 av Kagee
Skrevet

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

Skrevet

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

Skrevet (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 av Kagee
Skrevet (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 av mariunae
Skrevet (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 av mariunae
Skrevet (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 av mariunae
Skrevet

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

Skrevet

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...