Permalänk
Medlem

ASP hämta data från SKV fil

Hur gör jag för att hämta data med hjälp av asp från en semikolon-separerad fil.
Jag har googlat och läst igenom hela programmerings forumet men inte hittat svar på min fråga.
Det är tänkt att jag ska göra en asp sida som hämtar in data från skv filen som sedan läggs in på valda ställen i en databas.
Det är själva delen som hämtar in datan från skv filen som jag inte har en aning om hur jag ska göra. Förhoppningsvis så vet någon av er det.

Exempel från skv filen.
Första raden är igentligen inte så intressant det är mer för att jag ska veta vilka vad som är vad.

Reg. nummer;Årsmodell;Vagnspecifikation;Färg;Inbyt. Säljare;Fakturadatum;Bokförings värde;
SWS986;2002;Renault Master Skåp L1H1 2,2 dCi Premier;Vit, Solid;;2002-02-14-00.00.00;;

Behövs det mer info så är det bara att säga till.
Tack på förhand.

Visa signatur

mAngAn_

Permalänk
Medlem

Jag skulle använda FileSystemObject för att öppna filen och datat i den. Sök på google.com eller kolla exempel på www.asp101.com.

Sen skulle jag köra en RegExp för att ta in all data och sedan lägga in det i ett Recordset.

Visa signatur

Visionär bakom Sveriges största publika spelsatsning. Säger jag mer så blir jag förmodligen bannad igen.

Ställ krav! Involvera er! Tänk utanför sandlådan.

Permalänk
Medlem

Håller med weird när det gäller FSO men jag skulle nog strunta i RegExp och köra split() för att få in det i en array då jag antar att varje rad i filen är uppbyggd i samma ordningsföljd.

Lite synd med split är att den inte gör en multidimensionell array så du får hålla reda på hur många element i arrayen som hör till varje post.

Mera info
http://www.devguru.com/Technologies/vbscript/quickref/split.h...

Du får en länk till FSO med på samma sida om du inte hittar nått bra:

http://www.devguru.com/Technologies/vbscript/quickref/filesys...

Visa signatur
Permalänk
Medlem

Tackar för infon, det känns som om det kommer bli mycket att ta in

Så här ser dom 2 första raderna ut helt utskrivna så det blir några värden att hålla reda på :).
Ska sätta mig och läsa på lite efter lunch och se om jag kommer någonvart.

Reg. nummer;Årsmodell;Vagnspecifikation;Färg;Inbyt. Säljare;Fakturadatum;Bokförings värde;Marginal moms;Lagerplats;Intern vagn;Sen. mätarställn;Testkostnad;Försäljnings pris 1;Markn. värde;Såld;Fordonsstatus;Chassinr;Ordernr CIS;Motor;Kaross;Lagerstatus;Växellåda;Inredning;VCC PNR;Startdatum lagerpost;Slutdatum Lagerpost;Filial;Fordonstyp;Försäljnings pris 2;Kommis- sion;Bil till Volvoanställd;Begagnatstatus:

SWS986;2002;Renault Master Skåp L1H1 2,2 dCi Premier;Vit, Solid;;2002-02-14-00.00.00;;N;Budbil;Företag;10987;;;;N;Begagnad;5573609;;Diesel, G9T;L1H1;I lager;Manuell, Renault vxl;Tyg;TM180811711038900600200 ;2002-03-27 09:40;;1;Personbil;;N;N;

Visa signatur

mAngAn_

Permalänk
Medlem

Kolla mitt inlägg ovan igen om du missade att jag editerade in en bra länk om FSO. Vad ska du göra med värdena som du får in ska du bara skriva ut dem på sidan? Då kan du göra nått sånt här:

Öppna textfilen med FSO

Loop genom filen. Tips! do until FSO.AtEndOfStream ..... kod ... Loop

Strunta i första raden i filen genom en if sats eller liknande. Alternativt kan du fixa detta när du skriver ut arrayen med så har du dina rubriker klara med om detta kommer att ändras direkt i skv-filen.

Läs in hela innehållet i filen till en sträng variabel

Använd Split för att göra din array

Loopa genom arrayen och skriv ut. Tips! For i = 0 to ubound(arrayen) http://www.devguru.com/Technologies/vbscript/quickref/ubound....

Håll reda på hur många värden som ska skrivas ut innan en ny rad kommer genom att sätta en variabel i loopen som plussa på tills en ny rad ska komma och sedan nollställs igen.

Nu har du nått att börja böka med.

Visa signatur
Permalänk
Medlem

Jag ska läsa in varje värde i en databas, sen köra lite urval berodende på vad man vill få fram.

Visa signatur

mAngAn_

Permalänk
Medlem

Då spelar ingen roll egentligen fast du kanske vill strunta i första raden om det ska in i en databas då.

Visa signatur
Permalänk
Medlem

Jo det vore ju smidigt att hoppa över första raden, så att inte den kommer upp sen när man gör urval och visar infon :). Om ni har lust får ni gärna skriva ner lite mer som kan vara nyttigt att veta för nu står det helt stilla i huvudet, kan förhoppningvis börja tänka efter kafferasten.

Visa signatur

mAngAn_

Permalänk
Medlem

Att hoppa över en rad är ganska simpelt bara att anropa .SkipLine en gång innan man kör loopen med .ReadLine eller det kanske går att köra .ReadAll och skippa loopen helt.

Edit: Om du inte vet vart du ska börja så sätt dig ner och försök att komma igång med FSO så du får scriptet att öppna filen och läsa innehållet till en början så kan du gå vidare därifrån.

Visa signatur
Permalänk
Medlem

Nu har jag fått till den enkla biten, att hämta all data från filen och visa plus att jag lyckades få till så att scriptet hoppar över första raden, bara det svåra kvar nu då :p. Men det går ju framåt alltid något

Visa signatur

mAngAn_

Permalänk
Medlem

Varför importerar du inte filen direkt till databasen?

Visa signatur

Visionär bakom Sveriges största publika spelsatsning. Säger jag mer så blir jag förmodligen bannad igen.

Ställ krav! Involvera er! Tänk utanför sandlådan.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av weird
Varför importerar du inte filen direkt till databasen?

Då måste jag ändra alla kolumnnamn och peta, och det håller inte sen nästa gång man ska importera datan som ligger i filen för då stämmer ingenting. Och det är tänkt att man ska behöva göra så lite som möjligt för att uppdatera. Annars så hade jag lätt kört på den lösningen.

Edit:

Nu har jag fått till så att scriptet tar bort semicolonen mellan varje objekt, men jag får in i huvudet hur jag ska kunna få till loop funktionen så att den tar bort semikolonen på varje rad.
Så här ser koden ut för tillfället.

<%
dim filesys, readfile, content, bort
set filesys = CreateObject("Scripting.FileSystemObject")
set readfile = filesys.OpenTextFile("C:\Inetpub\wwwroot\skv\lagerlista.txt", 1, false)
readfile.SkipLine
content = readfile.ReadAll
readfile.close
bort = split(content, ";", 32)
%>

<% =bort(0)%>  
<% =bort(1)%>  
<% =bort(2)%>  
<% =bort(3)%>  
<% =bort(4)%>  
<% =bort(5)%>  
<% =bort(6)%>  
<% =bort(7)%>  
<% =bort(8)%>  
<% =bort(9)%>  
<% =bort(10)%>  
<% =bort(11)%>  
<% =bort(12)%>  
<% =bort(13)%>  
<% =bort(14)%>  
<% =bort(15)%>  
<% =bort(16)%>  
<% =bort(17)%>  
<% =bort(18)%>  
<% =bort(19)%>  
<% =bort(20)%>  
<% =bort(21)%>  
<% =bort(22)%>  
<% =bort(23)%>  
<% =bort(24)%>  
<% =bort(25)%>  
<% =bort(26)%>  
<% =bort(27)%>  
<% =bort(28)%>  
<% =bort(29)%>  
<% =bort(30)%>  
<% =bort(31)%>  

Visa signatur

mAngAn_

Permalänk
Medlem

Testa med det här:

<% dim filesys, readfile, content, bort set filesys = CreateObject("Scripting.FileSystemObject") set readfile = filesys.OpenTextFile("C:\Inetpub\wwwroot\skv\lagerlista.txt", 1, false) readfile.SkipLine content = readfile.ReadAll readfile.close bort = split(content, ";", 32) %> <% Dim i For i = 0 to uBound(bort) Response.Write bort(i) Next %>

Visa signatur
Permalänk
Medlem

Jag får det här felmedelandet när jag lägger till den kodsnutten, men det kan ju vara jag som inte hänger med riktigt innan morgonkaffet.
Feltyp:
Kompileringsfel i Microsoft VBScript (0x800A0401)
Slut på programsats förväntas.
/skv/indata.asp, line 13, column 6
Dim i as interger

Visa signatur

mAngAn_

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av mAngAn_
Jag får det här felmedelandet när jag lägger till den kodsnutten, men det kan ju vara jag som inte hänger med riktigt innan morgonkaffet.
Feltyp:
Kompileringsfel i Microsoft VBScript (0x800A0401)
Slut på programsats förväntas.
/skv/indata.asp, line 13, column 6
Dim i as interger

Han råkade smyga in ett 'r' för mycket. Jag misstänker att det där ska stå integer (heltal på engelska) och inte interger.

Visa signatur

We shall never cease from exploration And the end of all our exploring Will be to arrive where we started And know the place for the first time.
- T. S. Eliot

Permalänk
Medlem

Där ser man, men det blir samma felmedelande ändå.

Visa signatur

mAngAn_

Permalänk
Medlem

Sorry skit i as integer helt jag var inne på "riktiga" vb och inte vbs

Visa signatur
Permalänk
Medlem

Nu så fungerar det, men nu försvinner mellanslagen på första raden, och resten av raderna är oförändrade. Någon som vet en bra tutorial sida för Loop funktioner, den på http://www.devguru.com verkade vara mest för grunderna, iofs så kanske man inte behöver mer, men det skulle vara fint med lite mer avancerade exempel så jag kanske kan börja förstå hur jag ska göra :).

Edit:
Borde man inte kunna använda det här på något sätt?
Do While f.AtEndOfStream <> True

Visa signatur

mAngAn_

Permalänk
Medlem

<% dim filesys, readfile, content, bort set filesys = CreateObject("Scripting.FileSystemObject") set readfile = filesys.OpenTextFile("C:\Inetpub\wwwroot\skv\lagerlista.txt", 1, false) 'Skit i .SkipLine den verkar inte funka när man kör .ReadAll utan då måste du nog 'köra med .AtEndOfStream men vi tar bort första raden i vår for loop istället content = readfile.ReadAll readfile.close bort = split(content, ";") %> <% Dim i, radslut 'Nu finns första raden med men om du sätter i = 32 borde den försvinna For i = 0 to uBound(bort) Response.Write bort(i) & " " 'Kontrollera om det är dags att byta rad if radslut = 32 then 'Det är det! Skriv ut en radbrytning och nollställ radslut. Response.Write "<br/>" radslut = 0 Else 'Om inte plussa på radslut variabeln radslut = radslut +1 End if Next %>

Har inte testat så radslut raden kanske ska vara if radslut = 31 eller alt. 33 för att det ska funka. Samma sak om du vill ha bort första raden så kanske det ska vara For i = 31 eller = 33. Hinner inte tänka och räkna just nu

Visa signatur
Permalänk
Medlem

Det där fungerade klockrent, nu är det bara lite småtrix så jag får bort första raden utan att ta bort något värde i datan jag vill ha ut :).

Edit:
Det fungerar med readfile.SkipLine åt mig fast det är en liten förskutning på några värden en bit ner på sidan, jag ska kika så jag har räknat rätt på antalet semi-kolon

Scriptet du trixade till tar det bort mellanslag? För vissa värden är ingenting i skv filen.

Tack till dom som hjälper trögtänkta mig :).

Edit:
Tro om det kan strula ur lite efter ett tag eftersom början på varje rad inte börjar med ;. Det sista värdet slutar inte med; heller.

Edit igen:
Kan det vara lättare att hämta data från en excel fil via asp?

Visa signatur

mAngAn_

Permalänk
Medlem

Ja just det. Det blir problem om du inte har något värde alls ja. Du kan inte få skvfilen att innehålla t ex. NULL där det inte finns något värde så kan man bara göra en enkel if sats som kollar det i loopen.

Jo det går att köra med excelfiler direkt mot asp. Lite krångel man använder ADO precis som mot databaser för att komma åt excelfilens innehåll. Dock måste man definera namn för varje kolummn i excelfilen om jag inte minns fel. Har du pysslat med ADO tidigare kanske det kan vara en idé.

Edit: Det här kanske kan lösa mellanslags problemen

<% dim filesys, readfile, content, bort set filesys = CreateObject("Scripting.FileSystemObject") set readfile = filesys.OpenTextFile("C:\Inetpub\wwwroot\skv\lagerlista.txt", 1, false) 'Skit i .SkipLine den verkar inte funka när man kör .ReadAll utan då måste du nog 'köra med .AtEndOfStream men vi tar bort första raden i vår for loop istället content = readfile.ReadAll readfile.close 'Lägg till mellanslag före och efter varje ; så vi alltid får med ett värde i arrayen content = replace(content, ";", " ; ") bort = split(content, ";") %> <% Dim i, radslut, varde 'Nu finns första raden med men om du sätter i = 32 borde den försvinna For i = 0 to uBound(bort) 'Ta bort extra mellanslag före och efter vårt värde varde = trim(bort(i)) Response.Write varde & " " 'Kontrollera om det är dags att byta rad if radslut = 32 then 'Det är det! Skriv ut en radbrytning och nollställ radslut. Response.Write "<br/>" radslut = 0 Else 'Om inte plussa på radslut variabeln radslut = radslut +1 End if Next %>

Nästan klassat som ett fulhack men ändå inte tycker jag

Visa signatur
Permalänk
Medlem

Det hjälpte lite, men efter några rader extra så blir det kaos igen. Det är den skumma skv filen som skriver ut två st ; för lite efter några rader, och jag förstår inte varför, det borde ju bli samma på alla tycker jag. I alla fall på dom som jag har kikat på dom ser i princip likadana ut.
Jag kanske borde kika på hur man hämtar datan från en excel fil. Fast jag hittar inga bra exempel :/.

Visa signatur

mAngAn_

Permalänk
Medlem

Som sagt om du skulle kunna fylla dina tomma fält innan du exporterar filen till skv skulle nog hjälpa så du får med dina ; på rätt ställe.

ADO, excel och ASP exempel hittar du här:
http://support.microsoft.com/kb/q195951/

Visa signatur
Permalänk
Medlem

Nu fick jag tag på en skv fil som stämmer :). Men då ser den ut så här.

"Reg. nummer";"Årsmodell";"Vagnspecifikation";"Färg";"Inbyt. Säljare";...

Så hur gör jag om jag vill använda varde = trim(bort(i)) för att ta bort " tecknen, när jag pillar runt med trim funktionen så får jag bara felmedelanden med "

Edit:
Citat tecknen kan nog vara kvar, nu ska jag bara komma på hur man namnger varje "kolumn" så man kan säga åt scriptet var allt ska landa.

Edit:

Eller dom kanske måste bort ändå, om dom inte ska följa med in till databasen.

Visa signatur

mAngAn_

Permalänk
Medlem

Du ska strunta i trim() helt och hållet den tar bara bort mellanslag före och efter strängar.

Testa

<% dim filesys, readfile, content, bort set filesys = CreateObject("Scripting.FileSystemObject") set readfile = filesys.OpenTextFile("C:\Inetpub\wwwroot\skv\lagerlista.txt", 1, false) 'Skit i .SkipLine den verkar inte funka när man kör .ReadAll utan då måste du nog 'köra med .AtEndOfStream men vi tar bort första raden i vår for loop istället content = readfile.ReadAll readfile.close bort = split(content, ";") %> <% Dim i, radslut, varde 'Nu finns första raden med men om du sätter i = 32 borde den försvinna For i = 0 to uBound(bort) 'Bort med dubbelfnutts varde = replace(bort(i), """", "") Response.Write varde & " " 'Kontrollera om det är dags att byta rad if radslut = 32 then 'Det är det! Skriv ut en radbrytning och nollställ radslut. Response.Write "<br/>" radslut = 0 Else 'Om inte plussa på radslut variabeln radslut = radslut +1 End if Next %>

Visa signatur
Permalänk
Medlem

Om jag nu vill lägga in datan jag hämtar från skv filen, då måste jag väl namnge varje "kolumn" för att kunna skicka in vald data på rätt ställe i databasen. Och i så fall kan man använda radslut 0-30?

Ni ska ha ett stort tack för all hjälp speciellt xtermin8 som verkar ha offrat en hel del tid åt mig :).

Visa signatur

mAngAn_

Permalänk
Medlem

Lättast kanske det är om du ser till att varje kolumn i databasen är på samma ställe som i skv filen då kan du skapa ett recordset och använda i för att sätta Recordset.Fields.Item(i) = varde istället för raden där du kör response.write varde & " "

Kul att kunna hjälpa till

Visa signatur
Permalänk
Medlem

Nu har jag kört fast i geggan igen. Jag lyckas inte få till databaskopplingen m.m Så här ser koden ut nu. Det var alldeles för längesen jag höll på med asp :/.

Det här felmedelandet får jag nu.

Feltyp:
Provider (0x80020005)
Det gick inte att hitta parametern.
/skv/indata2.asp, line 27

<!-- #include virtual="/skv/adovbs.inc" -->
<%
dim filesys, readfile, content, bort
set filesys = CreateObject("Scripting.FileSystemObject")
set readfile = filesys.OpenTextFile("C:\Inetpub\wwwroot\skv\lager2.txt", 1, false)
readfile.Skipline
content = readfile.ReadAll
readfile.close
bort = split(content, ";")

dim addera
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Driver={Microsoft Access Driver (*.mdb)};dbq=c:\inetpub\wwwroot\skv\lager.mdb"
Set RecordSet = Server.CreateObject("ADODB.Recordset")
Addera = "SELECT * FROM tblBil"
RecordSet.Open addera, Connect, 3, 3

RecordSet.AddNew
%>

<%

Dim i, radslut, varde
'Nu finns första raden med men om du sätter i = 32 borde den försvinna
For i = 0 to uBound(bort)
'Bort med dubbelfnutts
varde = replace(bort(i), """", "")
RecordSet.Fields.Item(i) = varde
'Kontrollera om det är dags att byta rad
if radslut = 30 then
'Det är det! Skriv ut en radbrytning och nollställ radslut.
radslut = 0
Else
'Om inte plussa på radslut variabeln
radslut = radslut +1
End if
Next

%>

<%
RecordSet.Update
RecordSet.Close
Connect.Close
%>

Edit:
Nu helt plötsligt får jag det här felmedelandet.

Feltyp:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E21)
En OLE DB-åtgärd i flera steg genererade fel. Kontrollera alla OLE DB-statusvärden som finns tillgängliga. Inget arbete utfördes.
/skv/indata2.asp, line 29

Visa signatur

mAngAn_

Permalänk
Medlem

Byt ut din

Set Connect = Server.CreateObject("ADODB.Connection") Connect.Open "Driver={Microsoft Access Driver (*.mdb)};dbq=c:\inetpub\wwwroot\skv\lager.mdb"

mot

Set Connect = Server.CreateObject("ADODB.Connection") connect.provider = "Microsoft.jet.oledb.4.0" connect.Open "data source=" & server.mapPath("lager.mdb")

Så börjar vi felsöka därifrån.

Visa signatur
Permalänk
Medlem

Då får jag upp det här felet, har jag låst databasen med någon "växel"?

Feltyp:
Microsoft JET Database Engine (0x80040E09)
Det går inte att uppdatera. Databasen eller objektet är skrivskyddat.
/skv/indata2.asp, line 20

Eller använder jag "RecordSet.AddNew" på fel ställe?

Visa signatur

mAngAn_