Avatar billede martin_dalgaard Nybegynder
21. juli 2006 - 04:31 Der er 28 kommentarer og
1 løsning

Søge tekst file for specifikt info, og tage data derefter.

hej alle sammen, jeg henter en masse navne fra en database, som jeg  godt kunne tænke mig at søge efter i et specifikt tekst dokument,  og efter hvert navn kommer der et komma hvor så asp skal tage det der kommer lige efter kommaet,  og gå til næste navn som blev hentet fra databasen.

Håber virkelig det her er muligt, mange tak.
Avatar billede tofte Juniormester
21. juli 2006 - 07:48 #1
Kan du komme med et eksempel. Jeg forstår ikke ret meget af problemet :-)
Avatar billede fennec Nybegynder
21. juli 2006 - 08:16 #2
Vi skal have et udsnit af tekstfilen. Afhængig af hvordan den ser ud skal det nemlig laves forskelligt.
Avatar billede martin_dalgaard Nybegynder
21. juli 2006 - 19:38 #3
Ok prøver igen,  tekst filen ser sådan her ud.

Navn,Et tidspunkt
Navn,Et tidspunkt
Navn,Et tidspunkt
Navn,Et tidspunkt
Navn,Et tidspunkt
Navn,Et tidspunkt
osv.
Jeg vil godt have at man søger efter navnet, og tager tidspunktet , og går til næste navn.
Avatar billede nielle Nybegynder
21. juli 2006 - 19:52 #4
Ok, det er nemt nok at læse teksten og udskrive tidspunkterne.

Mens, hvad mener du præcist med:

1) "... søge efter i et specifikt ..."

Er det sådan at du har et bestemt navn som du skal finde? Eller:

2) Skal du bare have udskrevet alle tidspunkterne i filen?
Avatar billede martin_dalgaard Nybegynder
22. juli 2006 - 15:53 #5
Ok prøver at gå mere i detaljer.

Først har jeg et program som udskriver nogle dataer i et tekst dokument.
Jeg kender navnet på dokumentet.
.txt dokumentet ser sådan her ud :
Navn,Et tidspunkt
Navn,Et tidspunkt
Navn,Et tidspunkt
Navn,Et tidspunkt
Navn,Et tidspunkt
Navn,Et tidspunkt

Kommer an på hvor mange personer der var med den dag.

Nu har jeg en .asp  fil, som henter en masse navne fra en database, (Fra her af skal jeg have hjælp): Jeg vil så gerne have at asp tager et navn af gangen som jeg hentede fra databasen, og søger efter det i .txt dokumentet og hvis den finder dette navn skal den tager Tidspunktet efter kommaet og opdatered databasen med dette tidspunkt. Også gå til næste navn i databasen og søge efter det og..........

Man kan nærmest sige at jeg vil  flytte dataen fra .txt til min database.

Hjalp det?
Avatar billede nielle Nybegynder
22. juli 2006 - 16:13 #6
Rent faktisk behøver du ikke at hente navnene ud fra databasen først. Du kan simpelthen løbe txt-filen igennem, finde oplysningerne for hvert navn, og så lave en UPDATE for hver af dem. Hvis der er et navn i txt-filen, som ikke er i datbasen, resultere dette blot i en UPDATE hvor der ikke sker noget.

Noget i denne stil:

<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile(Server.MapPath("dinTextFil.txt"), 1)
Response.Write(f.ReadLine)

Dim linjeArr
Do While f.AtEndOfStream = False
    linje = f.ReadLine

    linjeArr = Split(linje, ",")

    navn = linjeArr(0)
    tdispunkt = linjeArr(1)

    strUpdate = "UPDATE dinTabel SET ditTidsFelt = " & tidspunkt & " WHERE ditNavneFelt = '" & navn & "'"
    Conn.Execute(strUpdate)
Loop

f.Close

Set f = Nothing
Set fs = Nothing
%>


UPDATE-sætningen skal tilpasses efter den database du bruger. F.eks. bruger Access #-tegn rundt om datoer:

strUpdate = "UPDATE dinTabel SET ditTidsFelt = #" & tidspunkt & "# WHERE ditNavneFelt = '" & navn & "'"
Avatar billede nielle Nybegynder
22. juli 2006 - 16:13 #7
Ret til:

tidspunkt = linjeArr(1)
Avatar billede martin_dalgaard Nybegynder
23. juli 2006 - 01:52 #8
denne fejl repport kom:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement.

/**/*****/******/***.asp, line 23

Har prøvet med både #    #  og uden dem, intet dur, har access så # burde virke.

Så problemet må være et andet sted, ider?
Avatar billede martin_dalgaard Nybegynder
23. juli 2006 - 02:15 #9
ok kiggede lige dybere i det, og kan se at først læser den linje 1, prøver at updatere, men opdatere ik, så går den til linje 2, prøver at opdatere og crash går scriptet i stå,  så det må være en database fejl ik?

dette var efter en runde kun med navne i databasen.
Avatar billede nielle Nybegynder
23. juli 2006 - 09:12 #10
Det giver ikke nogen mening at udføre SQL-sætningerne uden at der også er datore efter navnene...

Men prøv da - som et led i debug-processen - at udskrive SQL'erne før at du førsøger at udføre dem:

<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile(Server.MapPath("dinTextFil.txt"), 1)
Response.Write(f.ReadLine)

Dim linjeArr
Do While f.AtEndOfStream = False
    linje = f.ReadLine

    linjeArr = Split(linje, ",")

    navn = linjeArr(0)
    tdispunkt = linjeArr(1)

    strUpdate = "UPDATE dinTabel SET ditTidsFelt = #" & tidspunkt & "# WHERE ditNavneFelt = '" & navn & "'"
    Response.Write "DEBUG: " & strUpdate & "<br>"
    Conn.Execute(strUpdate)
Loop

f.Close

Set f = Nothing
Set fs = Nothing
%>
Avatar billede nielle Nybegynder
23. juli 2006 - 09:13 #11
... og ja, det er en database fejl. I følge denne fejlbesked:

[Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement.

- er der en fejl i hvordan UPDATE sætningen ser ud.
Avatar billede martin_dalgaard Nybegynder
23. juli 2006 - 17:33 #12
Ok jeg for selvfølgelig samme fejl meddelse, og jeg for denne debug:

DEBUG: UPDATE raid SET join = #07/19/06 18:54:30# WHERE name = 'Monoii'.

Monoii er nummer 2 i txt filen.

Vi er enige om at jeg skal lave en database forbindelse før
"Set fs = Server.CreateObject("Scripting.FileSystemObject")"

Og lukker den efter
"Set fs = Nothing"

ik?
Avatar billede nielle Nybegynder
23. juli 2006 - 17:47 #13
> Vi er enige om ...

Rækkefølgen er ikke så vigtig, den skal bare være åben under kaldene til Conn.Execute ... men, ja, det lyder fornuftigt at gøre det i den beskrevne rækkefølge.
Avatar billede nielle Nybegynder
23. juli 2006 - 17:50 #14
Det er uheldigt at du har kaldt dit felt got "join" - det er et reserveret ord i SQL og det må derfor ikke bruges uden videre. Hvis du *skal* bruge "join" så skal du (i Access) omklamer det med []-parenteser:

strUpdate = "UPDATE raid SET [join] = #" & tidspunkt & "# WHERE name = '" & navn & "'"


Hvilken datatype er dit join-felt i øvrigt derfineret til at være?
Avatar billede martin_dalgaard Nybegynder
24. juli 2006 - 13:23 #15
Jomen jeg kan da bare ændre join til noget andet, havde ingen anelse om at det var reseveret :D

Men øø først satte jeg  join til "Tid / dato" da indholdet nok var tid og dato, men efter der var fejl satte jeg den til standard som er "Tekst"
Avatar billede nielle Nybegynder
24. juli 2006 - 13:32 #16
Hvis du sidenhen har brug for at kunne behandle oplysningeren i databasen som om at de er datoer:

(o) F.eks. hvis du bar brug for at sortere dem i datoorden, eller:
(o) hvis du har brug for at kunne udtraække alle poterne for en bestemt dato,

ja, så bør du have feltet som et datofelt. Hvis du derimod ikke har brug for dette, ja så er det fint nok at gemme som tekst.

Men, hvis du gemmer som tekst, så skal SQL'en også tilrettes derefter. #-tegn bruges netop hvis der er tale om en dato/et tidspunkt. Hvis der derimod er tale om en tekst, skal der bruges '-tegn:

strUpdate = "UPDATE raid SET [join] = '" & tidspunkt & "' WHERE name = '" & navn & "'"

Hvis du derimod (kan forudset at du) har behov for at kunne behandle dem som dato/tid, ja så skal du hellere bruge noget energi på at finde fejlen i stedet for at ændre felttypen. :^)
Avatar billede martin_dalgaard Nybegynder
24. juli 2006 - 13:36 #17
Nå men, nu kommer der ikke nogle fejl repporter, og det virker da også fint nok, bortset fra:
Den opdatere alle linjer til databasen, undtagen linie 1.
Avatar billede nielle Nybegynder
24. juli 2006 - 13:37 #18
Bliver der udskrevet en "DEBUG: UPDATE ..." for den første linje?
Avatar billede martin_dalgaard Nybegynder
24. juli 2006 - 14:04 #19
Nej der bliver kun skrevet Debug fra  linie 2 af og frem efter.

Men dit "Response.Write(f.readline)"  indholder linie 1.
Avatar billede nielle Nybegynder
24. juli 2006 - 14:09 #20
Det er meget mysteisk hvis den bliver "væk" under vejs!

Hvordan ser 1. linje egentlig ud?
Avatar billede martin_dalgaard Nybegynder
24. juli 2006 - 14:13 #21
Gør heller ik så meget hvis det bare er linie 1 som ik bliver opdateret.

Men sad og tænkte på om det er muligt, hvis det navn man opdatere ikke er i databasen om man så ik kunne tilføje det navn til databasen, f.eks. sådan her:


*******************************
    tidspunkt = linjeArr(1)

    strSQL = "Insert into raid ("
    strSQL = strSQL & "name) "
   
    strSQL = strSQL & "values( "
    strSQL = strSQL & "'" & navn & "')"
   
    strole = "Select * From raid where name = '" & navn & "' "
    ole = Conn.Execute(strole)

    If ole("name") = navn then do nothing else Conn.Execute("strSQL") end if

strUpda..........................
********************************

Men problemet der er jo bare at man kan ik sige ' where name = '" & navn & "' "  '  hvis navnet ik er i databsen :P hehe
Avatar billede nielle Nybegynder
24. juli 2006 - 14:15 #22
Det er jo bare en dum fejl for min side - har pået flyttet en ReadLine udenfor løkken:

<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile(Server.MapPath("dinTextFil.txt"), 1)
--- Response.Write(f.ReadLine) --- Fjern denne linje!

Dim linjeArr
Do While f.AtEndOfStream = False
    linje = f.ReadLine

    linjeArr = Split(linje, ",")
Avatar billede martin_dalgaard Nybegynder
24. juli 2006 - 14:16 #23
Øø linie 1 ser ud som de andre, kan give dig et udsnit fra linie 1 til 4:
Heltinde,07/19/06 18:54:30
Monoii,07/19/06 18:54:30
Tappi,07/19/06 18:57:52
False,07/19/06 19:17:43
Avatar billede nielle Nybegynder
24. juli 2006 - 14:18 #24
Se lige 24/07-2006 14:15:02 ... det var en rigtig doh!
Avatar billede martin_dalgaard Nybegynder
24. juli 2006 - 14:21 #25
Men jo da jeg fjernede Response.Write(f.ReadLine) hjalp det, du må selv bestemme om du gider at svare på mit side spørgsmål, ellers smid et svar :D
Avatar billede nielle Nybegynder
24. juli 2006 - 14:23 #26
24/07-2006 14:13:22> F.eks. som nedenfor:

du må selv bestemme om du gider at svare på mit side spørgsmål> Skulle lige kode færdig:

<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile(Server.MapPath("dinTextFil.txt"), 1)

Dim linjeArr
Do While f.AtEndOfStream = False
    linje = f.ReadLine

    linjeArr = Split(linje, ",")

    navn = linjeArr(0)
    tdispunkt = linjeArr(1)

    sql = "SELECT count(*) AS antal FROM raid WHERE name = '" & navn & "'"
    Set rs = Conn.Execute(sql)

    If rs("antal") > 0 Then
        sql = "UPDATE raid SET [join] = '" & tidspunkt & "' WHERE name = '" & navn & "'"
    Else
        sql = "INSERT INTO raid (name, [join]) VALUES ('" & navn & "', '" & tidspunkt & "')"
    End If

    Response.Write "DEBUG: " & sql & "<br>"
    Conn.Execute(sql)
Loop

f.Close

Set f = Nothing
Set fs = Nothing
%>



Venter lige med et svar til at du har sagt god for at det virker :^)
Avatar billede martin_dalgaard Nybegynder
24. juli 2006 - 14:31 #27
NICE du styrer!  tak skal du have smid et svar. Tror også lige jeg vil lave en kommentar i din karma :D
Avatar billede nielle Nybegynder
24. juli 2006 - 14:32 #28
Svar :^)

Husk lige at dine SQL-sætninger også bør tage højde for om man kommer til at skrive med store eller små bogstaver - Nielle og nielle er to forskellige navne.

Jeg ved ikke om dette er en risiko i dit tilfækde?
Avatar billede martin_dalgaard Nybegynder
24. juli 2006 - 14:34 #29
aye? når men ihverfald titusinden tak, troed slet ik det var muligt at gøre alt det der ;P
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester