En stor nackdel med att sitta ensam och jobba är att man inte har någon att kasta idéer till för att få fram en bra lösning. Så jag tänkte se om någon här kan brainstorma med mig. Varför inte lägga in listorna i en databas? Hur många adresser handlar det om? Ja, tanken har funnits men då kommer följande frågor: Är det omöjligt att ställa lite hårdare krav på dina indata? Problemet med mitt indata är att det redan existerar. Om jag ska ställa hårdare krav på det så måste jag manuellt formattera om alla inlägg i databasen, lägga till några kolumner, ändra registreringsformulären, bygga om mina klasser som hanterar användare. Jag skulle antagligen löst det på ngt av följande sätt: Hejsan Ja, det skulle funka. Borde ju kunna göra inmatningsformuläret "i andra änden" på ett sådant sätt ? Inte riktigt så enkelt. Ja men resultatfilen ser ju ut så här : Ja, det ligger lite mer bakom. Knixigt Tänkte berätta lite hur lösningen blev till slut. Eftersom det blev lite bråttom så är det inte den ultimata lösningen, det får bli lite uppdateringar längre fram. Huvudsaken är att den funkar och det går snabbt att få fram alla resultat.Bollplank - Applikation för konvertering
Jag snickrar ihop min första WinForm app i VB.NET. Det är ett litet program som tar en lista med adresser, jämför den med en lista med adresser och koordinater och sätter ihop en lista med koordinaterna för adresserna från den första listan.
Jag har alltså följande listor:
- Adresslista orginal där adresserna ser ut som (XML):
"Gatunamn 1", postnummer, "stad"
"c/o fnamn lnamn, Gatunamn 2, 2 tr", postnummer, "stad"
"Gatunamn 6", postnummer, "stad"
"Gatunamn 7 ö.g.", postnummer, "stad"
- Konverteringslista (kommaseparerad textfil)
10.9182,60, 60.0001,"Gatunamn 1","","postnummer"
10.9182,60, 60.0002,"Gatunamn 2","","postnummer"
10.9182,60, 60.0003,"Gatunamn 3","","postnummer"
10.9182,60, 60.0004,"Gatunamn 5-7","","postnummer"
- Resultatlistan (kommaseparerad textfil)
10.9182,60, 60.0001, "stad"
10.9182,60, 60.0002, "stad"
10.9182,60, 60.0004, "stad"
10.9182,60, 60.0004, "stad"
Mina funderingar har med själva jämförelsen av orginallistan och konverteringslistan.
Jag måste alltså se om "Gatunamn 6" finns i konverteringslistan och vad den har för koordinater. Problemet uppstår
1. När konverteringslistan har ett nummerintervall, t.ex. 5-7 och jag ska hitta nr 6
2. När orginallistans adress t.ex. innehåller antal trappor, c/o adress, trunkerade gatunamn t.ex. Vasav.
Det jag funderat på är att först konvertera textfilen med konverteringslistan till ett sökbart format, kanske en Array eller stark typad collection. Därefter söka på postnummer, efter det ett visst antal bokstäver i gatunamnet och sedan försöka få ut vilket nummer adressen har.
Då blir frågan, hur löser man detta? Känns lite svårt med Regex eftersom det är svårt att hitta en generell formel för adresserna.
Några idéer och uppslag?
Allt är välkommet.Sv: Bollplank - Applikation för konvertering
Då kan du ställa alla möjligt slags frågor och joina i hop listorna så som du vill ha dem.
Kan efteråt välja om du vill behålla databasen eller slänga den.Sv: Bollplank - Applikation för konvertering
Eftersom det är WinForms och det ska kunna köras på en dator utan databas, så blir alternativet Access. Inget större problem men problemet skulle ändå kvarstå.
Orginallistan ligger redan i en databas tillgänglig via internet. Den hämtas från en URL, därav XML-formatet. Dessa måste hämtas varje gång programmet körs eftersom det garanterat kommer vara ny information varje gång. Själva problemet är ändå hur man från de adresserna ska kunna få ut gatunamn och nummer och sedan kunna matcha numret mot ett intervall i konverteringslistan.
Konverteringslistorna får jag i kommaseparerade textlistor och kan utan problem konvertera dessa till vilket format jag nu vill ha dem i. Problemet där är ändå att vissa adresser är det nummer och vissa nummerintervall.Sv: Bollplank - Applikation för konvertering
Annars borde det väl en sån här ordning funka:
Första numeriska tecknet börjar att specificera gatunumret.
Det borde ju gälla oavsett om man anger antalet trappor, osv. Norra Storgatan 4A 3trp, skriver man väl, typ?
Allt före första numeriska tecknet är gatunamnet, och om man strippar bort alla "gatan" "gata", "vägen" och "väg", och gör om det till "g" resp. "v", och alltid kör med förkortningar i den andra tabellen så behöver man ju inte tänka på det.
Det svåra sen är att ta ett intervall av adresser, men man kan väl anta att det bara är ett intervall om det är ett "-" emellan?
Sen skiter man helt sonika i allt efteråt.
Hur man skriver c/o-adresser kan jag inte, men antingen gör man på samma sätt med dem, och struntar i första adressen, eller så hoppar man fram till efter "c/o", och gör det där?
Är ingen hejare på RegExp, men programmatiskt funkar ju en sån algoritm. Sen ska det ju vara effektivt också, men det är ju en annan femma.Sv: Bollplank - Applikation för konvertering
Det jag förmodligen måste göra är att gå igenom de inlägg som finns (drygt 700st så det är inte SÅ farligt) och se så att de följer en viss standard. När sedan nya användar registrerar sig så får administratören (som får ett mail varje gång) kontrollera att standarden följs och om den inte gör det så får de korrigera.
T.ex.
c/o fnamn enamn, gatunamn gatunummer, trappa
Om det följs så blir det lite enklare att få ut alla uppgifter. Problemet kommer när det endast finns ett intervall i konverteringslistan, men som du säger, man borde kunna lösa det genom att kolla efter "-" och kanske först ta bort alla med nummer högre än det man har.Sv: Bollplank - Applikation för konvertering
- läs in båda filerna i Dataset i minnet, o matcha sedan med Find..
- läs in båda filerna till tabeller i en temporär access-databas som du skapar i runtime och matcha tabellerna...
- sen sparar du ner resultatet i en sådan fil du vill ha.
OlaSv: Bollplank - Applikation för konvertering
Jag har fått uppfattningen att listan med ev. intervall inte kan(bör) variera utseendemässigt.
Mitt förslag är att du byter ut alla intervall mot riktiga adresser först och kör jämförelsen efteråt.
Alltså skulle ett intervall "5-7" ge tre poster 5, 6 och 7.
Konverteringen skulle väl antagligen inte behöva göras varje gång man drar igång programmet.
Sällan en adress flyttar sig geografiskt :-)
/JohanSv: Bollplank - Applikation för konvertering
Konverteringslistorna får jag i kommaseparerade textfiler. Dessa tänkte jag ändå göra om till kanske XML eller lägga in i en databas. Antingen gör jag som ditt förslag, eller så har jag två kolumner "FromNum" och "ToNum". Om koordinaterna gäller nr 6 så blir det 6 i båda, om det är ett intervall blir det 5 i ena och 7 i andra.
Något sådant blir det i alla fall.
Men tyvärr så är det största problemet att få ut adresserna som ska konverteras. Jag tror att jag måste bestämma ett standardformat och sedan får administratören kontrollera varje gång en kund registrerar sig eller ändrar sin information.
Typ:
c/o fnamn enamn, gatunamn nummer, trappor o.dyl.
Med en sådan standard är det lätt att få fram gatunamn och nummer.Sv: Bollplank - Applikation för konvertering
Tyvärr är väl befintliga adresser ett manuellt arbete...
Vänta nu - resultatet har ju ingenting med adresser att göra ?
Borde man inte kunna köra på alla postnummer inom en viss stad bara ?
Strunta i adresserna helt enkelt
/JohanSv: Bollplank - Applikation för konvertering
1. Adresserna finns redan. Att göra om inmatningen kräver en hel del ändringar, som jag beskriver i ett inlägg ovan.
2. Resultatet har med adresser att göra på så sätt att koordinaterna är för specifika adresser. Att köra på postnummer funkar inte eftersom många adresser har samma postnummer, men olika koordinater. Det är många adresser per stad så konverteringslistorna är detaljerade, adress=koordinat.Sv: Bollplank - Applikation för konvertering
10.9182,60, 60.0001, "stad"
10.9182,60, 60.0002, "stad"
10.9182,60, 60.0004, "stad"
10.9182,60, 60.0004, "stad"
Finns inga adresser här ?
Som jag såg det var det här ett sätt att sammanställa listor med koordinater per stad. (krångligt)
Om det var det man var ute efter skulle man kunna köra postnummer, stad från adresslistan mot
postnummer koordinat från konv.listan.
Inser att det ligger lite mer bakom ?
/JohanSv: Bollplank - Applikation för konvertering
Resultatlistan består av koordinater och stad.
För att få fram den listan måste jag matcha min ruttlista med en konverteringslista.
Förklaring:
Vi ska använda ett logistikprogram för att räkna ut vilken ordning man ska köra ut till de olika adresserna på en rutt.
Logistikprogrammet använder sig av koordinater. Den befintliga applikationen med rutterna innehåller adresser.
För att få fram koordinater för varje adress så har jag detaljerade koordinatlistor som innehåller adresser och motsvarande koordinater.
För att få fram resultatlistan måste jag alltså
1. Ta fram min ruttlista med adresser
2. Matcha dessa mot koordinatlistan för att få fram koordinater för varje adress.
3. Skapa resultatlistan vilken är ruttlistan men där adresserna är utbytta mot koordinater.
Så det största problemet jag har är att få fram gatunamn och nummer ur ursprungsapplikationen eftersom kunderna lagt i lite olika saker när de registrerat sig. Jag borde kunna lösa det genom att manuellt fixa alla till den standard jag nämnde ovan och sedan se till att administratören kontrollerare. Det är i alla fall det som kräver minst arbete.
Det andra problemet är hur själva matchningen ska gå till. Koordinatlistorna får jag i kommaseparerade textfiler men jag tänkte konvertera dessa till xml-filer eller en databas.
Ruttlistorna hämtar jag i xml-format via url.Sv: Bollplank - Applikation för konvertering
700 manuellt och administratören på problem 1 låter väl rimligt.
Man vill ju bygga generellt också. Annars skulle jag (gammal textfils-nisse) nog ha
kört med VB och reg.exp. i nån kombination. På problem 2 alltså.
Eller...
Om du kör ett postnummer i taget och går igenom gatorna med koordinatlistan som grund kanske
det blir lättare att hitta gatunumret i textmassan ?
Tar nog lång tid iofs.
Jag känner att jag är till stor hjälp här...
Tyvärr :(
/JohanSv: Bollplank - Applikation för konvertering
Den kommaseparerade koordinatlistan jag fått importerade jag till en Accessdatabas.
Applikationen läser ner ordrarna i XML-format, rensar adressen, som följer en standard, så att gatunamn och nummer finns kvar och stoppar in allt i en tabell i accessdatabasen.
Därefter matchas ordrarna mot koordinater genom att jämföra orderns formatterade adress och stad med den adress och stad som finns i koordinattabellen. Long och lat koordinaterna läggs in i ordertabellen. Denna matchning görs med en sql-sats. De adresser som inte finns i koordinattabellen får 0 som koordinater.
Orderkoordinater och orderid plockas ut från ordertabellen och en textfil skapas enligt det format logistikprogrammet kräver. De ordrar som inte har koordinater lämnas utanför.
Logistikprogrammet startas och den skapade textfilen skickas in tillsammans med några parametrar som bestämmer hur optimeringen görs. Logistikprogrammet optimerar rutten, skriver om textfilen i rätt ordning och skapar även en kartbild i .bmp format.
Kan tillägga att jag även lägger till en start- och slutstopp i textfilen beroende på vilket leveransområde man valt. Detta pga att det stopp som ligger som start och slut i textfilen även ligger där efter optimeringen.
Min applikation går igenom textfilen rad för rad och lägger in sorteringsordningen i en kolumn i ordertabellen.
Applikationen plockar ut alla ordrar och sorterar dessa efter sorteringsordningen. En textfil skapas där namn, adress och produkter finns med. Sist i filen läggs de adresser som inte kunnat matchas.
Applikationen skickar textfilen till skrivaren och sedan även kartfilen så att allt skrivs ut.
Listan och kartan lämnas till chaufförerna som kör ut varorna.
Allt funkar kanon förutom att logistikprogrammet har vissa brister i optimeringen. Så dom har fått bakläxa och får förbättra sin produkt. Det är inte så bra när stopp 1 ligger i Liljeholmen, stopp 2 på Söder vid Hornstull och stopp 3 och 4 i Liljeholmen och Gröndal. Inte precis optimerat då, men dom vet tydligen var felet ligger... säger dom.
Som sagt, detta är inte den mest optimala lösningen men det viktiga var att få igång den. Eftersom det går hyfsat snabbt att få fram resultatet så funkar det bra. Men det blir väl lite ändringar och optimeringar efterhand när tid finnes.