Gå til innhold

Effektivisere slavearbeid i tekstfil


Anbefalte innlegg

Hei,

 

jeg møter stadig på situasjoner der jeg står ovenfor repetive oppgaver i forskjellige filer. Det som nå står for dører er å endre litt på en samling vCalendar filer.

 

Eksempel:

BEGIN:VCALENDAR
VERSION:1.0
BEGIN:VEVENT
DTSTART:20070111T151500Z
DTEND:20070111T170000Z
RRULE:W1 TH #18
LOCATION;ENCODING=QUOTED-PRINTABLE:S6=2C=20Gl=F8shaugen
SUMMARY;ENCODING=QUOTED-PRINTABLE:Fluid=20=D8ving
LAST-MODIFIED:20070109T140048Z
END:VEVENT
END:VCALENDAR

Min k750i mobil viser ikke plassering i oversikten men først i detaljer, derfor ønsker jeg å ta de to første bokstavene fra location og legge dem til på slutten av summary, etter et mellomrom.

Pseodo:

Loop gjennom fil og finn aktuelle linjer
String summary += location.getTwoFirstChar();
Lagre

 

når jeg støter på slike oppgaver og det dreier seg om mer enn 10 filer pleier jeg å sette meg ned og skrive et java program for oppgaven.

 

Men denne gangen begynte jeg å tenke litt, finnes det noen bedre måte å gjøre dette på?

 

Hvordan ville du utført en slik oppgave?

Gjøres dette enkelt med en makro i Vim eller lignende? (Har kun et overflatisk forhold til Vim, det har ennå ikke gått for oss...)

Endret av clumzy
Lenke til kommentar
Videoannonse
Annonse

#!/usr/bin/perl -w

use MIME::QuotedPrint;

use strict;

my $loc_string = "LOCATION;ENCODING=QUOTED-PRINTABLE:";
my $mod_string = "LAST-MODIFIED";

my @filenames; foreach (@ARGV) {
 push @filenames,glob
};

foreach my $filename (@filenames) {
 open (IN, "<$filename");
 open (OUT, ">new_$filename");

 my $entries;
 while(<IN>) {
   $entries .= $_;
 }
 
 while ($entries =~ m/(BEGIN:VCALENDAR.*?END:VCALENDAR)/gis) {
   my $entry = decode_qp($1);
   
   my $loc_index = index($entry, $loc_string) + length($loc_string);
   my $mod_index = index($entry, $mod_string) - 1;
   
   my $two_chars = substr($entry, $loc_index, 2);
   
   my $first = substr($entry, 0, $mod_index);
   my $rest = substr($entry, $mod_index, length($entry));
 
   print OUT encode_qp($first . " " . $two_chars . $rest . "\n");
 }
 
 close(OUT);
 close(IN);
}

 

Tok meg den frihet å løse oppgaven for deg, i Perl. Jeg bruker ActiveState Perl 5.8.8 for Windows, og har i tillegg måttet installere perl-pakken MIME-Base64-Scripts som inneholder modulen QuotedPrint.

 

Programmet kjøres slik:

 

perl vcal.pl innfil

 

Programmet vil da produsere en utfil med navnet

 

new_innfil

 

Programmet kan også kjøres med wildcards:

 

perl vcal.pl *.vcal

 

Programmet vil da produsere utfiler med prefikset 'new_'.

 

Jeg går på ingen måte 100% god for programmet, da jeg ikke har brukt så fryktelig lang tid på å kvalitetssikre outputen. Et problem er at tekst-enkodingen (QUOTED_PRINTABLE) før og etter ser litt forskjellig ut.

Lenke til kommentar

Takk skal du ha, det var riktignok litt mer enn jeg ba om.

 

Jeg forstår det slik, at når du møter en oppgave som dette, ser du det enklest å skive et lite perl program. Slik som jeg som oftest skriver et java program.

 

Det jeg egentlig lurer på er om vi virkelig gjør dette på enklest mulig måte. For meg tar det ca 15 - 20 min å skrive et slikt program, teste og rette. Så det er forholdvis enkelt.

 

Men hva ville du anbefalt moren din å gjøre hvis hun støter på et slikt repetivt problem? Jeg ser til tider min mor sitte med slike ting og jobbe seg gjennom det som en maskin, det gjør meg frustrert og fortvila. Jeg pleier da ofte å løse det for henne, eller vise henne "søk og erstatt" funskjonen i f.eks. word.

 

Hvordan kunne moren din løst oppgaven ovenfor?

Lenke til kommentar

Jeg hadde igrunn vært kjempefornøy om moren min klarte å skru på maskinen! :)

 

Den beste måten å løse dette problemet på for folk som ikke kan programmere er vel å betale lillebror i familien 15,-/time for å gå igjennom å gjøre dette manuelt...? Lillebror som kanskje er litt interesert i data kanskje forstår at dette går ann å gjøre automatisk etterhvert :)

 

 

Hva med å ikke løse dette på vanlig måte i [insert your favourite language], men heller å prøve å løse det i [insert untried language]? Så får man løst problemet samtidig som man lærer seg noe nytt...

Lenke til kommentar

Så datamaskiner er faktiskt så ubrukelige at de ikke kan la min mor ordne noe så enkelt som det der?

 

Hvorfor kan ikke hun bare skrive inn i cmd "Jeg vil bytte ut det der med det der"?

 

Jeg blir bare stadig mer overbevist om at datamaskiner suger, og at de henger langt langt etter vår tid.

Lenke til kommentar

Når kunstig innteligens kommer for alvor, så vil man nok kunnet si slikt som det clumzy. Men da må vi ha kommet så langt at datamaskinene kan tenke like godt som oss, og dermed programmere seg selv.

 

Jeg tipper mellom 50 og 100 år til det sjer. Sikkert litt for sent for mora di...

Lenke til kommentar

Datamaskiner er ikke intelligente, det du har foran deg er en kalkulator ikke noe annet.

å kalle noe Kunstig Intelligens er å dra begrepet litt langt, siden alt du ser på skjermen din er resultater av flere matematiske funksjoner i en algortime.

Datamaskiner kan ikke tenke eller forstå, og på den måten prosessorer er lagd i dag, tror jeg det aldri vil skje, at datamaskiner kan programmere seg selv, isåfall må man lage prosessor og RAM på en helt annen måte en det vi gjør i dag.

 

Jeg har sett i illustrert vitenskap at de sa at en moderne datamaskin er like intelligent som en mus, men det er helt feil. En datamaskin er ikke intelligent i det hele tatt, mer som et veldig tilbakestående insekt.

Lenke til kommentar

Mange takk Geir. Jeg er fullt klar over det du sier :)

 

Jeg er av den tro at datamaskiner vil bli intelligente, men den type datamaskiner vi har idag kommer aldri til å bli det.

 

For alt jeg vet kan det godt være organiske datamaskiner som er fremditen, det vil tiden vise :)

Lenke til kommentar
  • 1 måned senere...
Datamaskiner er ikke intelligente, det du har foran deg er en kalkulator ikke noe annet.

Du har rett i det, maskina er ikke smartere enn dem som programmerer den.

å kalle noe Kunstig Intelligens er å dra begrepet litt langt, siden alt du ser på skjermen din er resultater av flere matematiske funksjoner i en algortime.

Datamaskiner kan ikke tenke eller forstå, og på den måten prosessorer er lagd i dag, tror jeg det aldri vil skje, at datamaskiner kan programmere seg selv, isåfall må man lage prosessor og RAM på en helt annen måte en det vi gjør i dag.

Her er jeg uenig med deg, tror nok vi har det vi trenger av både prossesorer og ram for å få til kunstig intelligens, det er softwaren som mangler så vidt jeg kan se.

Jeg har sett i illustrert vitenskap at de sa at en moderne datamaskin er like intelligent som en mus, men det er helt feil. En datamaskin er ikke intelligent i det hele tatt, mer som et veldig tilbakestående insekt.

7711810[/snapback]

Det er jo i tilfelle programvaren som er intelligent. Og Illustrert Vitenskap er jo som alltid en pålitelig kilde... eh..

 

Dere har rett i at jeg sannsynligvis krever for mye. Det er jo tross alt ikke mer enn 50 år siden hullkortet sin tid. Og Xerox kom med det første grafiske brukergrensesnittet i 1981, for 26 år siden. (kilde wikipedia)

 

Så jeg kaster inn håndkleet for denne gang og gir opp, mamma får vel bare sitte der og leke datamaskin ved å gjøre repetive oppgaver manuellt.

 

Men, avslutningsvis, det finnes håp. Vet ikke hvor mange av dere som har sett demoen av multitouch screen: Youtube link Men det bør dere!

Lenke til kommentar
  • 9 måneder senere...

Dette svaret kommer sent, men FWIW:

 

post-14352-1196355836_thumb.jpg

 

Det ovenstående er en liten video som viser hvordan oppgaven kan utføres i GNU Emacs ved bruk av tastaturmakroer. Jeg har tatt eksemplet ditt og laget 20 identiske filer som jeg har plassert i katalogen D:\vcalendar. I videoen åpner jeg denne katalogen og definerer en makro som åpner filen under markøren, bruker et regulært uttrykk for å søke seg frem til LOCATION-feltet, kopierer de to første tegnene (som kan være kodet i quoted-printable, derfor et litt innfløkt uttrykk), søker seg frem til SUMMARY-feltet, går til slutten av linjen, setter inn et mellomrom, limer inn tegnene, lagrer filen, lukker bufferen og flytter markøren til neste fil. Jeg utfører så denne makroen på alle de resterende filene i katalogen, og åpner til slutt en av dem for å vise at den er forandret.

 

Merk at den ovenstående makroen forutsetter at hver fil bare inneholder én oppføring. Dersom filene inneholdt flere oppføringer, ville det ha vært nødvendig å definere to makroer: en som utfører arbeidet med å kopiere de to første tegnene i LOCATION-feltet, og en som åpner hver fil og «looper gjennom dem» med den første makroen. Dette er ikke veldig mye mer komplisert enn det som vises i videoen.

 

For øvrig har Emacs sine egne kommandoer for å håndtere quoted-printable, så i stedet for det lange regulære uttrykket jeg skriver inn for å ta høyde for quoted-printable-kodede tegn à la =F8 (som ikke forekommer så tidlig i LOCATION-feltet i eksemplet, så dette er bare teoretisk), kunne jeg ha konvertert fra quoted-printable til vanlig tekst, kopiert de to første tegnene, konvertert LOCATION-feltet tilbake, limt inn tegnene i SUMMARY-feltet og konvertert dem. (Siden det er heller tvilsomt at moren din har noe kjennskap til hva quoted-printable er for noe, ekskluderer alt dette henne, er jeg redd …)

 

Dere har rett i at jeg sannsynligvis krever for mye. Det er jo tross alt ikke mer enn 50 år siden hullkortet sin tid. Og Xerox kom med det første grafiske brukergrensesnittet i 1981, for 26 år siden.

Ifølge folket på #emacs har Emacs hatt tastaturmakroer siden 1975.

Lenke til kommentar

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