Permalänk
Medlem

ASP (vbScript): Dela sträng

Jag har en msaccess tabell med en kolumn fylld av händelser för ägarbyten av bussar som jag försöker separera och stoppa in i en annan tabell och då samtidigt dela av datan så att händesledatum företagsnamn och ID kommer i egna kolumner istället för samma kolumn.

Jag har lyckats hämta ut varje ägare i en array genom att dela strängen

TestArray = Split((rs("agarhistorik")), vbLf)

Vilket innebär att jag får ut varje ägare för bussarna på egna rader

ital = 0 For Each agare In TestArray ital = ital + 1 response.write("Ägare"& ital&" "&agare&"<br />") Next

Vilket ger följande resultat för en post:

Ägare1 1996-10-25 Söne Trafik AB, Lidköping 218
Ägare2 2004-01-28 Swebus AB 1321
Ägare3 2004-08-02 Söne Trafik AB 218
Ägare4 2007-01-10 Söne Buss i Göteborg AB, Stenkullen 218
Ägare5 2008-07-15 Bus Trade Center AB, Solna 1531

Här kommer jag inte längre... Jag kan inte komma på något bra sätt att dela data för att passa rätt i kolumnerna i den nya tabellen. Tabellen har följande kolumner Datum, Ägare och ID.

Alla tips och tricks mottages varmt då det är många tusen poster i databasen som jag behöver att flytta =/

Permalänk

Antingen använder du dig av string.Split som splittar på ett tecken jkkombinerad med substring för att ta ut mellan ett visst iindex i strängen. Ett snyggare sätt att göra det på är regex. Läs på om det så hjälper jag dig gärna att skriva ett uttryck

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av KurreKula
Antingen använder du dig av string.Split som splittar på ett tecken jkkombinerad med substring för att ta ut mellan ett visst iindex i strängen. Ett snyggare sätt att göra det på är regex. Läs på om det så hjälper jag dig gärna att skriva ett uttryck

Tack för hjälpen det blev enligt nedan i slutändan och det verka fungera bra Titta inte för mycket för den är väldigt slavrigt skriven men nu vet jag att det går iaf Får slipa lite till på den imorron sen går det nog att flytta över kolumnen till den andra databasen. När databasen en gång skapades valde man att skriva allting i en tabell Vilket jag nu försöker att rätta till....

ital = 0 For Each agare In TestSearchArray ital = ital + 1 trima = trim(agare) on error resume next i = Left(TrimA, 1) If i = "(" THEN Response.Write "<B>Årtal: </b><br />" response.write("Ägare"& ital&" <br>Rawtext: "&TrimA&"<br />") Response.Write "<b>Vagnnummer#: " ELSE response.write("Ägare"& ital&" <br>Rawtext: "&TrimA&"<br />") strLeftText = Left(TrimA, 10) Response.Write "<B>Årtal: </b>"&strLeftText&"<br />" strrightText = right(TrimA, 5) strrightText = TRIM(strrightText) Response.Write "<b>Vagnnummer#: </b>"&strrightText&"<br />" a = right(agare, Len(agare)-10) a = left(a, Len(a)-5) a = trim(a) Response.Write "<b>Ägare#: </b>"&a END IF response.write("<br>------------------------------------------<br>") Next

Permalänk
Citat:

Ursprungligen inskrivet av sammyj
Tack för hjälpen det blev enligt nedan i slutändan och det verka fungera bra Titta inte för mycket för den är väldigt slavrigt skriven men nu vet jag att det går iaf Får slipa lite till på den imorron sen går det nog att flytta över kolumnen till den andra databasen. När databasen en gång skapades valde man att skriva allting i en tabell Vilket jag nu försöker att rätta till....

ital = 0 For Each agare In TestSearchArray ital = ital + 1 trima = trim(agare) on error resume next i = Left(TrimA, 1) If i = "(" THEN Response.Write "<B>Årtal: </b><br />" response.write("Ägare"& ital&" <br>Rawtext: "&TrimA&"<br />") Response.Write "<b>Vagnnummer#: " ELSE response.write("Ägare"& ital&" <br>Rawtext: "&TrimA&"<br />") strLeftText = Left(TrimA, 10) Response.Write "<B>Årtal: </b>"&strLeftText&"<br />" strrightText = right(TrimA, 5) strrightText = TRIM(strrightText) Response.Write "<b>Vagnnummer#: </b>"&strrightText&"<br />" a = right(agare, Len(agare)-10) a = left(a, Len(a)-5) a = trim(a) Response.Write "<b>Ägare#: </b>"&a END IF response.write("<br>------------------------------------------<br>") Next

Ett slarvigt skrivet regex(behöver testas lite) kan se ut såhär och matchar allt det du skrivit, oavsett längd etc:

(\d{4}-\d\d-\d\d\s)([\w\s]*AB),?\s([\w\d]*)

Du kan slänga in det här:
http://derekslager.com/blog/posts/2007/09/a-better-dotnet-reg...

Där kan du testa med lite olika strängar från databasen som source och det jag skrev ovan som pattern. Då hämtar den ut det du vill ha och grupperar det i 3 grupper

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av KurreKula
Ett slarvigt skrivet regex(behöver testas lite) kan se ut såhär och matchar allt det du skrivit, oavsett längd etc:

(\d{4}-\d\d-\d\d\s)([\w\s]*AB),?\s([\w\d]*)

Du kan slänga in det här:
http://derekslager.com/blog/posts/2007/09/a-better-dotnet-reg...

Där kan du testa med lite olika strängar från databasen som source och det jag skrev ovan som pattern. Då hämtar den ut det du vill ha och grupperar det i 3 grupper

Googlade på regexpressions men fick en uppfattning av att det inte gick att dela en sträng... Bara kontrolla att strängen matchar osv men jag har säkert fel

Permalänk
Citat:

Ursprungligen inskrivet av sammyj
Googlade på regexpressions men fick en uppfattning av att det inte gick att dela en sträng... Bara kontrolla att strängen matchar osv men jag har säkert fel

Om du testar det jag skrev senast märker du att det den skriver ut 3 grupper som är de delar du ville ha... Testa, är bättre att använda det:)
edit:

typ såhär(ej testad kod):

Dim rgx As New Regex(@(\d{4}-\d\d-\d\d\s)([\w\s]*AB),?\s([\w\d]*), RegexOptions.IgnoreCase) Dim matches As MatchCollection = rgx.Matches(input) If matches.Count > 0 Then Console.WriteLine("{0} ({1} matches):", input, matches.Count) For Each match As Match In matches Console.WriteLine(" " + match.Groups[0].Value + match.Groups[1].Value + match.Groups[2].Value) Next End If

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Nu har jag fått lite tid över att fixa lite med detta och faktiskt lyckats sätta mig in lite i det här med regexp

Följande kod har jag fixat samman

<% connSiteBusesMainDB = "Driver={SQL Server};Server=192.168.1.10;Database=bussdata;Uid=sa;Pwd=rt76mhp;" 'Skapa Anslutning Set conn = Server.CreateObject("ADODB.Connection") 'Create a DB Object conn.Open connSiteBusesMainDB 'Get DB connection from SiteSettings 'Hämta data sSql = ("SELECT * FROM bussar WHERE id = 3033 order by agarhistorik") Set rs = Server.CreateObject("ADODB.Recordset") rs.Open sSql, conn %> <table width="100%"> <tr> <td>Original (För post <%=(rs("id"))%>)</td> </tr> <% IF rs.EOF THEN 'Kontrollera om sökning kan starta eller fel ska skrivas ut response.write("<tr><td colspan=""6"">Din sökning gav inget resultat, prova att ändra sökurvalet</td></tr>") ELSE 'Kör LOOP DO WHILE ital1 < 500 AND NOT rs.EOF 'Hämta ägarhistorik AgareData = "" AgareData = (rs("agarhistorik")) ital1 = ital1 + 1 'Räkna rader %> <tr valign="top"> <td><%=replace(AgareData,vbLf,"<br>")%><br /><br /></td> </tr> <tr> <td> <p>Konverterad till separata kolumner</p> <% iAgare = 0 OwnerData = "" 'Kontrollera om det finns ägaredata IF Not IsNull(AgareData) THEN 'Leta utt rabdyte och skapa array OwnerData = Split(AgareData, vbLf) For Each OwnerRow In OwnerData 'För varje ägare rad kör regexp IF Not IsNull(OwnerRow) THEN iAgare = iAgare + 1 'Räkna ut vilken ägare det är response.write("<b>Ägare "&iAgare&"</b><br>") 'Skriv ut ägarenummer response.write("InnanRegExp: "&OwnerRow&"<br>") 'Skriv ärgare rad innan konvertering 'Starta regexp Set objRegExp = New RegExp objRegExp.IgnoreCase = True objRegExp.pattern = "(\d{4}-\d\d-\d\d)?\s?([\(]*[åäö:,a-z\s]*[\)]*)?\s?([0-9])*" Set colMatches = objRegExp.Execute(OwnerRow) 'Skriv ut nya ägare kolumner For Each objMatch In colMatches response.write "Datum: "&objMatch&"<br>" response.write "Ägare: " 'response.write objMatch[1] response.write "<br>BussNr: " 'response.write objMatch[2] response.write("<br><br>") Next END IF Next END IF response.write("<br>-----------------------------------------------------------------------------------------<br>") %> </td> </tr> <% rs.movenext LOOP rs.close end if %> </table>

Allting fungerar bra tills jag skall dela upp det i grupper lyckas inte lista ut hur man skall få det att fungera så som du gjorde Kurre =/

Jag har kommenterat ut följande

response.write "Datum: "&objMatch&"<br>" response.write "Ägare: " >> 'response.write objMatch[1] response.write "<br>BussNr: " >> 'response.write objMatch[2] response.write("<br><br>")

Annars får jag detta felet:

Microsoft VBScript compilation error '800a0401' Expected end of statement /asp/search/ajax/test.asp, line 60 response.write objMatch[1] -----------------------^

Jag har satt samman en testsida PMa om ni är intresserad att titta på den så får ni adressen till den. All hjälp mottages varmt

Permalänk

DU ska inte skriva objMatch.Groups[1] eller dyl.?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sammyj
Microsoft VBScript compilation error '800a0401'

Expected end of statement

/asp/search/ajax/test.asp, line 68

response.write objMatch.Groups[0]
------------------------------------------^

Tyvärr samma fel. Det är inte så att man måste berätta för den att den måste dela upp det i grupper eller något?

edit: provade både med Groups och group

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av KurreKula
DU ska inte skriva objMatch.Groups[1] eller dyl.?

Du är en ängel googla lite vidare på det där du hade och fick följande

response.write "Datum: "&objMatch.SubMatches(0)&"<br>" response.write "Ägare: " response.write objMatch.SubMatches(1) response.write "<br>BussNr: " response.write objMatch.SubMatches(2) response.write("<br><br>")

Det fungerade utmärkt!

Permalänk
Medlem

Du är f-n kung kurre. Detta fungera bättre än vad jag trodde. Många tack för hjälpen. Som sagt detta skall omvandla en dåligt planderad databas till en bättre planerad sådan. Du ska få veta mer om projektet när projektet det är mer färdigt

Nu får jag följande resultat när jag kör kode vilket är precis vad jag är ute efter:

Innan konvertering
------------------------
0000-00-00 AB Linjebuss 396
0000-00-00 GDG Biltrafik AB 1354
(avregistrerad)

Konverterad till separata kolumner
------------------------
Ägare 1
InnanRegExp: 0000-00-00 AB Linjebuss 396
Datum: 0000-00-00
Ägare: AB Linjebuss
BussNr: 396

Ägare 2
InnanRegExp: 0000-00-00 GDG Biltrafik AB 1354
Datum: 0000-00-00
Ägare: GDG Biltrafik AB
BussNr: 1354

Ägare 3
InnanRegExp: (avregistrerad)
Datum:
Ägare: (avregistrerad)
BussNr:

Permalänk

Kul att kunna hjälpa till! Alltid kul när det löser sig

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase