/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Rette linie midt i en fil
Fra : FreAKAzoid


Dato : 22-07-01 17:04

Jeg vil høre om der er nogen der kan hjælpe mig med hvordan jeg kan ændre en
linie midt i en fil, kun udfra at linien starter med "name"?

MVH
Hans-Henrik Ravn



 
 
Bjarke Walling Peter~ (22-07-2001)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 22-07-01 17:17

FreAKAzoid skrev:
> Jeg vil høre om der er nogen der kan hjælpe mig med hvordan jeg kan ændre
en
> linie midt i en fil, kun udfra at linien starter med "name"?
>
> MVH
> Hans-Henrik Ravn

At du skriver spørgsmålet herind må jo betyde at du ikke fik mit svar til
den e-mail du sendte... eller kunne du bare ikke bruge det til noget?
Jeg poster den i hvert fald lige igen:

Hans-Henrik Ravn skrev:
> Kan man på en eller anden måde ændre koden, så man f.eks kan erstatte en
linie midt i filen, der feks starter med "open"??
>
> MVH
> Hans-Henrik Ravn

Ja - det vil jeg da mene man kan!
Meen, det er lidt mere kompliceret en den sub-rutine du skulle bruge før...
Førhen lavede den bare altid første linie om, men nu søger den efter noget
og derved er det ikke sikkert at den finder det... derfor har jeg lavet det
til en function, der giver True hvis linien blev udskiftet - og False hvis
den ikke gjorde. Foresten så er den kun lavet, så det er den først fundne
linie der bliver udskiftet... ikke andre!
Foresten så har jeg lavet den sådan at selvom man søger efter "open" finder
den også linier med "OPEN" i...
Sådan her bruges den (f.eks.):

Private Sub Form_Load()
If ChangeLine("C:\fil.txt", "OPEN=PRG.EXE", "Open=Program.exe") Then
MsgBox "Juhuu! Det virkede..."
Else
MsgBox "Øv... ""OPEN=PRG.EXE"" blev ikke fundet..."
End If
End Sub

En fil der indeholder følgende:
[autorun]
Icon=ikon.ico
open=prg.exe
.... vil komme til at indeholde:
[autorun]
Icon=ikon.ico
Open=Program.exe

Foresten så vil jeg lige give en lille "advarsel"... jeg har ikke testet
den, så der er en lille risiko for der fejl i...
.... du kan jo selv teste den, hvis du gider.

Nå ja: En lille ekstra-"smart"-funktion er at du kan bestemme du vil søge
efter en hel linie (ikke kun starten) ved at kalde den sådan her:
ChangeLine("C:\fil.txt", "OPEN=PRG.EXE" & vbCrLf, "Open=Program.exe")
.... der er kædet et linieskift efter "OPEN=PRG.EXE".
Dvs. nu finder den ikke linier som f.eks. "open=prg.exe2" men kun
"open=prg.exe".

Og så vil jeg lige spørge: Var det disse funktioner den skulle have?

Nå, men nu har du vist læst længe nok (selvom jeg kunne skrive en masse
mere)... så her er koden:

Private Function ChangeLine(Filename As String, SearchFor As String,
ChangeLineTo As String) As Boolean
Dim File As String
Dim Pos1 As Long
Dim Pos2 As Long
Open Filename For Input As #1
File = Input(LOF(1), #1)
Close #1
Pos1 = InStr(File & vbCrLf, vbCrLf & SearchFor, vbTextCompare)
If Pos1 = 0 Then
ChangeLine = False
Else
Pos2 = InStr(Pos1 + 1, File, vbCrLf, vbBinaryCompare)
If Pos2 = 0 Then
File = Left(File, Pos1 - 1) & ChangeLineTo & vbCrLf
Else
File = Left(File, Pos1 - 1) & ChangeLineTo & Mid(File, Pos2)
End If
Open Filename For Output As #1
Print #1, File;
Close #1
ChangeLine = True
End If
End Function

Du må foresten meget undskylde at jeg ikke udkommenterede koden, men hvis du
gerne vil have den udkommenteret - så skriv bare en mail til mig!

- Bjarke Walling Petersen



Bjarke Walling Peter~ (22-07-2001)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 22-07-01 22:22

Det skal da siges at der var to fejl i koden... en jeg havde lavet og en som
jeg vil give VB skylden for.
Man kan skrive InStr(strA, strB) ... men åbenbart ikke InStr(strA, strB,
vbTextCompare) ... hvis man ønsker at bruge den sidst-nævnte funktion skal
man åbenbart skrive InStr(1, strA, strB, vbTextCompare).
Det er da en fejl, da den første parameter er optional!

Min fejl var at jeg havde glemt linien: ChangeLineTo = vbCrLf & ChangeLineTo

Men her er koden i hvert fald (som virker):

Private Function ChangeLine(Filename As String, SearchFor As String,
ChangeLineTo As String) As Boolean
Dim File As String
Dim Pos1 As Long
Dim Pos2 As Long
Open Filename For Input As #1
File = Input(LOF(1), #1)
Close #1
Pos1 = InStr(1, File & vbCrLf, vbCrLf & SearchFor, vbTextCompare)
ChangeLineTo = vbCrLf & ChangeLineTo
If Pos1 = 0 Then
ChangeLine = False
Else
Pos2 = InStr(Pos1 + 1, File, vbCrLf, vbBinaryCompare)
If Pos2 = 0 Then
File = Left(File, Pos1 - 1) & ChangeLineTo & vbCrLf
Else
File = Left(File, Pos1 - 1) & ChangeLineTo & Mid(File, Pos2)
End If
Open Filename For Output As #1
Print #1, File;
Close #1
ChangeLine = True
End If
End Function


- Bjarke Walling Petersen



Tomas Christiansen (23-07-2001)
Kommentar
Fra : Tomas Christiansen


Dato : 23-07-01 22:13

Bjarke Walling Petersen skrev:
> Det skal da siges at der var to fejl i koden...

Nogle ville måske mene at der var tre fejl

Din kode virker nemlig ikke hvis indeholder i filen benytter Unicode tegnsættet.

Input# fil nemlig opdage dette, og forsøge at læse LOF(1) antal bogstaver fra filen, som har længden LOF(1) bytes.
Problemet er blot at en Unicode fil indeholdende X bogstaver vil fylde 2*X+2 bytes.

-------
Tomas


Bjarke Walling Peter~ (23-07-2001)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 23-07-01 22:33

Tomas Christiansen skrev:
> Nogle ville måske mene at der var tre fejl
>
> Din kode virker nemlig ikke hvis indeholder i filen benytter Unicode
tegnsættet.
>
> Input# fil nemlig opdage dette, og forsøge at læse LOF(1) antal bogstaver
fra filen, som har længden LOF(1) bytes.
> Problemet er blot at en Unicode fil indeholdende X bogstaver vil fylde
2*X+2 bytes.

Hmmm... jeg har ikke fået at vide den også skulle læse unicode-filer...

Jeg er ikke heelt med...
Dvs. længden er (LOF(1) - 2) \ 2 ?
Men man kan stadigvæk godt læse filen med Input$(x,y) eller hvad?
Og hvordan finder man ud af at det er en fil i unicode-format?
(Jeg har aldrig arbejdet med unicode før)

- Bjarke Walling Petersen



Tomas Christiansen (24-07-2001)
Kommentar
Fra : Tomas Christiansen


Dato : 24-07-01 21:39

Bjarke Walling Petersen skrev:
> Hmmm... jeg har ikke fået at vide den også skulle læse unicode-filer...

Nej, det ved jeg heller ikke om det skal. Men sandsynligheden taler for at nogen får brug for det, og så ville jeg blot gøre
opmærksom på problemet.

Grunden til at jeg ikke også samtidig leverer en løsning på det, er såmænd at jeg ikke umiddelbart kan se en enkelt (god) løsning.
Hjælpen til funktionen Input(X,Y) beskriver faktisk et lignende problem og dets løsning: Brug InputB(X,Y) i stedet. Det er dog ikke
lykkedes mig at få InputB(X,Y) til at virke efter hensigten!

Det er muligt at at åbne filen som Binary i stedet for som Input, men det gør så at det bliver en del sværere at behandle Unicode
filer, idet de ved indlæsningen ikke automatisk bliver konverteret til VB-forståelige tegn. Dette kan dog gøres "manuelt" med
StrConv funktionen.


> Jeg er ikke heelt med...
> Dvs. længden er (LOF(1) - 2) \ 2 ?
> Men man kan stadigvæk godt læse filen med Input$(x,y) eller hvad?
> Og hvordan finder man ud af at det er en fil i unicode-format?

En typisk Unicode-fil består af to bytes som fortæller at det drejer sig om Unicode, og derefter fylder hver tegn to bytes.
Derfor: X tegn giver en fil med længden X*2 + 2 bytes.


> (Jeg har aldrig arbejdet med unicode før)

Det har jeg i og for sig heller ikke, men man støder oftere og oftere på Unicode filer. Især med Windows 2000.

Det interessante er at VB jo rent faktisk internt bruger Unicode til strenge, så i princippet skal VB jo slet ikke konvertere
indholdet af en Unicode-fil, men derimod skal det gøres med en ANSI-fil.

-------
Tomas


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste