Avatar billede systemnissen Nybegynder
11. november 2003 - 12:20 Der er 16 kommentarer og
1 løsning

Søge efter flere værdier i en ini fil??

Hejsa

Jeg håber I kan hjælpe med denne...

Jeg har en ini fil som indeholder en masse punkter. Jeg vil gerne trække 5 "nøgler" ud af denne fil. Det skal foregå i "ren" VBScript og jeg kan altså ikke benytte asp eller Visual Basic til det.

Inifilen ser (nogenlunde) således ud:

Section begin
Name = "ABC"
Value = "123"
Section end

Section begin
Name = "ABCD"
Value = "123.ABC"
Section end

...

Der er mellem 20 og 50 sektioner i filen.

Nu er spørgsmålet... Jeg vil gerne kunne søge efter et "Name" og trække "Value" ud. Altså søge på ABC og hive "123" ud. Hvordan gøres dette i VBScript?

Jeg håber meget I kan hjælpe.

Mvh
Systemnissen
Avatar billede systemnissen Nybegynder
11. november 2003 - 12:28 #1
åh ja... lige en tilføjelse. Fejlhåndtering er ikke min stærke side i VBScript. Hvis value ikke findes skal den blot "hoppe" videre i scriptet.
Avatar billede adam_christensen Nybegynder
11. november 2003 - 13:24 #2
sINIFileName = "test.ini"

sSearchString = InputBox("Enter name to search for")
If sSearchString = "" Then
  WScript.Quit(1)
End If

Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextfile(sINIFileName, 1)

sRes = ""

Do
  sCurLine = f.ReadLine
  If InStr(sCurLine, "Name = """ & sSearchString & """") > 0 Then
      sCurLine = f.ReadLine
      aValue = Split(sCurLine, "=")
      sRes = Trim(Replace(aValue(1), """", ""))
      Exit Do
  End If
Loop Until f.AtEndOfStream

f.Close
Set f = Nothing
Set fso = Nothing

If sRes <> "" Then
  MsgBox "Value of '" & sSearchString & "': " & sRes
Else
  MsgBox "'" & sSearchString & "' not found!"
End If
Avatar billede adam_christensen Nybegynder
11. november 2003 - 13:24 #3
Erstat "test.ini" med din INI-fil ;-)
Avatar billede adam_christensen Nybegynder
11. november 2003 - 13:27 #4
Ups, glemte lige at tjekke om Value eksisterer... Det kommer om lidt...
Avatar billede adam_christensen Nybegynder
11. november 2003 - 13:28 #5
Sådan:

sINIFileName = "test.ini"

sSearchString = InputBox("Enter name to search for")
If sSearchString = "" Then
  WScript.Quit(1)
End If

Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextfile(sINIFileName, 1)

sRes = ""

Do
  sCurLine = f.ReadLine
  If InStr(sCurLine, "Name = """ & sSearchString & """") > 0 Then
      sCurLine = f.ReadLine
      If InStr(sCurLine, "Value") = 1 Then
        aValue = Split(sCurLine, "=")
        sRes = Trim(Replace(aValue(1), """", ""))
        Exit Do
      End If
  End If
Loop Until f.AtEndOfStream

f.Close
Set f = Nothing
Set fso = Nothing

If sRes <> "" Then
  MsgBox "Value of '" & sSearchString & "': " & sRes
Else
  MsgBox "No value for '" & sSearchString & "'!"
End If
Avatar billede nmh Nybegynder
11. november 2003 - 13:30 #6
Mon ikke du kan bruge dette:

Option Explicit
dim Filsystem, stream,tekst, navn, fundet
Set FilSystem=CreateObject("Scripting.FileSystemObject")
Set stream=filsystem.openTextFile("Testfil.txt")
navn=InputBox("Indlæs navn: ")
while not stream.AtEndOfStream
  tekst=stream.readline()
  If Instr(tekst,"""" & navn & """")>0 then
    tekst=stream.readline
    MsgBox tekst
    fundet=true
  end if
wend
if not fundet then
  MsgBox "Navnet findes ikke"
end if
stream.close
set stream=nothing
Avatar billede systemnissen Nybegynder
11. november 2003 - 13:57 #7
nmh>> Mange tak - det var lige det jeg skulle bruge. Der skal ske lidt mere med det fundne, men det vil jeg kaste mig over...

Adam>> Jeg kunne desværre ikke få din løsning til at finde noget. Jeg har prøvet på alle måder, men den kan ikke finde værdierne. Virker det hos dig?
Avatar billede adam_christensen Nybegynder
11. november 2003 - 14:09 #8
Ja, det virker fint. Den er dog case-sensitiv, så hvis du søger efter ABC finder den ikke value for abc, etc.

Vær opmærksom på at nmh's svar ikke tager højde for hvis der ikke findes en value-line efter name-linien, så hvis din INI-fil fx ser således ud:

Section begin
Name = "ABC"
Section end

Section begin
Name = "ABCD"
Value = "123.ABC"
Section end

Vil nmh's script returnere "Section end"...
Avatar billede systemnissen Nybegynder
11. november 2003 - 14:22 #9
Det har du ret i... men jeg kan stadig få dit svar til at virke... og jeg ER opmærksom på case-sensitive... :-(
Avatar billede systemnissen Nybegynder
11. november 2003 - 14:23 #10
Jeg har endda prøvet at kopiere en linie fra ini filen til inputboxen uden held...
Avatar billede adam_christensen Nybegynder
11. november 2003 - 14:52 #11
Du skal kun skrive det efter =-tegnet og uden "

fx: ABC
Avatar billede systemnissen Nybegynder
11. november 2003 - 15:22 #12
ok... fejlen er fundet.

Det er flg. det er galt med.

If InStr(sCurLine, "Value") = 1 Then

Hvis den laver det check så finder den ikke noget. Men hvis jeg fjerner linien, virker det...?
Avatar billede systemnissen Nybegynder
11. november 2003 - 15:35 #13
Skal linien ikke hedde:

If InStr(sCurLine, "Value") > 0 Then

Så virker det i hvert fald... :-)
Avatar billede nmh Nybegynder
11. november 2003 - 16:00 #14
Takker for point. :o)
Hvad skal der ske med det fundne?
Jeg valgte jo blot at udskrive hele linien value="...
Avatar billede systemnissen Nybegynder
11. november 2003 - 16:16 #15
nmh>> Ja, det er klart. Jeg bad jo også bare om værdien. Den skal såmænd bare renses og bruges senere i scriptet. Men det er klaret. Jeg har dog vlagt at bruge adams løsning i stedet, så han skulle egentlig have haft dine point :-) Men det finder jeg selv ud af med ham. Tak for din hurtige hjælp i dag. Jeg håber jeg kan trække lidt på dig en anden god gang.
Avatar billede nmh Nybegynder
11. november 2003 - 16:34 #16
Du er velkommen.
Avatar billede adam_christensen Nybegynder
12. november 2003 - 09:57 #17
InStr(sCurLine, "Value") = 1 tjekker om næste linie (efter Name = "...) er en tilhørende Value-line (dvs. om linien _starter_ med 'Value'). Det kræver dog at Name, Value parret står præcis som du skrev i dit spm. Gør de det i din INI-fil? (dvs. uden foranstående mellemrum og med stort V)

InStr(sCurLine, "Value") > 0 vil virke i de fleste tilfælde, men fejle hvis en section fejlagtigt er defineret fx med en kommentar således:

Section begin
Name = "ABC"
'remember to write the Value on this line...
Section end

Hvis du kan stole på at INI-filen ikke har sådanne sections kan du godt nøjes med InStr .... > 0

Ellers prøv dette i stedet:
If InStr(Trim(LCase(sCurLine), "value")) = 1 Then
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