VBscript szöveg feldolg.

VBscript szöveg feldolg.
2006-11-27T10:41:06+01:00
2006-11-28T10:20:52+01:00
2022-11-02T10:25:44+01:00
Csharpy
Sziasztok!
Van egy szöveges fileom. Igazából MHT file, de ez lehet mellékes.
Ki szeretnék törölni belőle sorokat úgy, hogy az nem mindig ugyanaz lehet. Példa.
Van egy sor benne, ami biztosan így kezdődik pl hogy:
User neve: XXYY
Úgy szeretném kitörölni ezt a sort, hogy nem tudom mi a lesz a user neve. Az alábbi kód meg sajna csak azt tudja, hogy pontosan egy adott sort ki töröl a fileból, vagy megváltoztatja.
tud valaki segíteni? Csak VBscript megoldás lenne a jó, tudom PEARL-ben egyszerűbb.
Tehát van egy sorom, van benne fix rész, de utána olyanis ami változhat.




option explicit
On Error Resume Next
'Since this was written for Windows Scri
' pting Host,
'it uses VBScript which doesn't use type
' s.
'To use this with VB, as types to the de
' clarations
Dim objFSO 'as FileSystemObject
Dim fle1 'as file
Dim fle2 'as file
Dim strPath 'as String
Dim strFldr 'as String
Dim strLine 'as String
strPath = "C:FirstFile.txt" 'Put In the file you want To edit
strFldr = "C:TempFile.txt"
Main 'This Calls the Main Sub
Sub Main()
Dim rtn 'as Integer
rtn = CopyStuff() 'This calls and runs the CopyStuff function
if rtn = 1 Then
MsgBox "Copy is complete"
else
MsgBox "An Error was found and the process was aborted. " & Cstr(rtn)
'The & Cstr(rtn) will display the number returned by CopyStuff
'After you've got your script running, you may want To remove this feature
End if
'Cleanup
if Not fle1 is nothing Then Set fle1 = nothing
if Not fle2 is nothing Then Set fle2 = nothing
if Not objFSO is nothing Then Set objFSO = nothing
End Sub
function CopyStuff()
Set objFSO = CreateObject("Scripting.FileSystemObject") 'This creates the FSO
'I've included Error handling after Each step
if err.number <> 0 Then
MsgBox "Error In Creating Object: " & err.number & "; " & err.description
CopyStuff = 0 'Returns this number
Exit function 'Stop processing, go back to Main
End if
if Not objFSO.FileExists(strPath) Then 'The file To copy is not present
MsgBox "The " & strPath & " file was Not found On this computer"
CopyStuff = 2
Exit function
End if
if objFSO.FileExists(strFldr) Then
objFSO.DeleteFile(strFldr) 'If the temp file is found, delete it
End if
Set fle1 = objFSO.OpenTextFile(strPath) 'Open
if err.number <> 0 Then
MsgBox "Error opening " & strPath & ": " & err.number & "; " & err.description
CopyStuff = 3
Exit function
End if
Set fle2 = objFSO.CreateTextFile(strFldr) 'Create the temp file
if err.number <> 0 Then
MsgBox "Error creating temp ini: " & err.number & "; " & err.description
CopyStuff = 4
Exit function
End if
'Here's the work horse that does the copying
Do While Not fle1.AtEndofStream 'Change this line, Change this one too
strLine = fle1.ReadLine
Select Case strLine
Case "Change this line"
'When the above line is found, it is replaced With the line below
fle2.WriteLine "Changed"
Case "Change this one too"
fle2.WriteLine "This line is changed"
Case Else
'This copies whatever was read In fle1
fle2.WriteLine strLine
End Select
Loop
if err.number <> 0 Then
MsgBox "Error transfering data: " & err.number & "; " & err.description
CopyStuff = 5
fle1.close
fle2.close
Exit function
End if

fle1.close
Set fle1 = nothing
fle2.close
Set fle2 = nothing

objFSO.DeleteFile strPath, True 'This deletes the original file

objFSO.MoveFile strFldr, strPath 'This moves and renames the temp file, replacing the original
if err.number <> 0 Then
MsgBox "Error replacing " & strPath & " With new file: " & err.number & "; " & err.description
CopyStuff = 6
Else
CopyStuff = 1 'Remember that In Main, a 1 means successful
End if
End function
Mutasd a teljes hozzászólást!
ne foglalkozz vele. Csak egy változó, amibe gyűjtöd soronként az adatokat. (csak példának írta Árnyék)
Neked ez kell helyette:

Do While Not fle1.AtEndofStream strLine = fle1.ReadLine If Left(strLine, 6) = "<TABLE" Then fle2.WriteLine strLine LOOP

(legközelebb használd a forráskód gombot a hozzászólásablakban. -de főleg: topicnyitás előtt inkább gondolkodj egy picit, mert ez ovis szint, és ettől sokan kiborulnak.)
Mutasd a teljes hozzászólást!

  • Nos, ha a fix rész ismert, akkor az alapján már törölheted is a sort!

    Alapvetően 2 lehetőséged van:

    1. ReadLine segítségével soronként olvasod be a file-t egy sztringbe. Ha a beolvasott sztring eleje megegyezik a fix résszel, akkor a sztringet nem írod ki a kimeneti file-ba, hanem eldobod.

    2. Egy lépésben beolvasod a file tartalmát egy sztringbe, majd létrehozol egy RegExp ojjektumot, és egy kifejezés segítségével szépen kicseréled a sztringben a nem kívánatos részeket egy üres sztringre.
    Mutasd a teljes hozzászólást!
  • hali! Értem.
    Az 1. -es tetszik igazából. Csak azt nem értem, hogyan döntöm el, hogy a beolvasott sztring eleje megegyezik a fix résszel. nekem csak az egész sor beolvasása és módosítása sikerült... Vannak ilyen joker karakterek amiket be lehet írni, mondjuk * vagy ? jel?
    Mutasd a teljes hozzászólást!
  • If Left(sor, 10) = "User neve:" Then
    Mutasd a teljes hozzászólást!
  • Ó, köszi!

    Megpróbáltam ide jutottam:

    Do While Not fle1.AtEndofStream
    strLine = fle1.ReadLine
    'ezzel beolvasok egy sort ciklusban ugye? egyébként soha nem írtam VB scriptet, de most muszály!

    If Left(strLine, 8) = "Így kezd" Then 'ide nem tudom mit írjak. de ahol ez van azt a sort ki kéne törölni valami ilyesmi:

    fle1.WriteLine ""


    LOOP




    'de ez nem sikerült, mit rontok el?
    Mutasd a teljes hozzászólást!
  • Az is lehet, hogy ugyanabban a fileban nem lehet dolgozni! Akkor még gondolkodom!
    Mutasd a teljes hozzászólást!
  • Do While Not fle1.AtEndofStream 'Change this line, Change this one too
    strLine = fle1.ReadLine


    If Left(strLine, 4) = "kezd" Then fle2.WriteLine ""



    ' Select Case strLine

    ' Case "Change this line"
    ' fle2.WriteLine "Changed"
    '
    ' Case Else
    ' fle2.WriteLine strLine
    ' End Select


    Loop


    Ez miért nem jó szerinted?
    Mutasd a teljes hozzászólást!
  • Nem lehet egy file-t egyszerre írásra és olvasásra megnyitni, szal a megoldásod biztosan nem jó!

    Vagy egy másik file-ba írod vissza az eredményt WriteLine-nal (kivéve, ha egyezés van), vagy pedig egy másik sztringhez adod hozzá a kiolvasott sort (kivéve, ha egyezés van), majd a file feldolgozása után lezárod az olvasásra megnyitott TextStream-et és újra megnyitod az írásra. Az újra megnyitott TextStream tartalmát aztán a 2. sztringgel felül lehet írni.

    pl.

    strLine=fle1.ReadLine
    If strLine<>... (itt jön a feltétel, hogy mit tegyünk, ha nincs egyezés) Then strFile=strFile & strLine & vbCrLf

    A vbCrLf megegyezik a Chr(13) & Chr(10), azaz a windows-os új sor karakterével.
    Mutasd a teljes hozzászólást!
  • Arról volt szó, hogy törölni kell a sort. A sor akkor törlődik, ha nem kerül bele a 2. file-ba, tehát egyezéskor nem lehet ottan egy lf2.WriteLine "" Arról nem beszélve, ha nincs egyezés, akkor nem csinál semmit a kódod, magyaránt a kimeneti file max üres sorokat fog tartalmazni.

    szerk: Nameg a szkript elején található útvonalakat is szerkeszteni kell, remélem erről nem feledkeztél meg!
    Mutasd a teljes hozzászólást!
  • Igen. Tökéletesen igazad van, törölni kell és nem kell belekerülnie a 2. fileba!
    De úgy szeretném, ha valahogy kezdődik a sor akkor azt ne tegye bele a 2. file ba.

    PL.

    If Left(strLine, 11) = "Így kezdődik" Then 'AKKOR ezt ne tgye bele a 2. fileba minden mást igen... mert akkor ezt tudnám bővíteni, ha utána mást szeretnék kiszűrni az is menne, tehát valahogy így kezdődne, csak ezt nem tom folytatni:

    Do While Not fle1.AtEndofStream
    strLine = fle1.ReadLine
    If Left(strLine, 6) = "<TABLE" Then ?????

    LOOP
    Mutasd a teljes hozzászólást!
  • Bakker, ezt nem hiszem el!

    1. Használni kéne a józan paraszti eszedet!
    2. Esetleg megnézni, hogy a segítségedre sietők mit írtak korábbi hozzászólásaikban, hátha az segít!

    Nem gondolod, hogy a feltételt másképp is meg lehet fogalmazni? Mondjuk úgy, hogy mit csináljon, ha NINCS egyezés?
    Mutasd a teljes hozzászólást!
  • Na megkaptam a lecseszést. Tényleg igazad van, bocsánat.
    Már minden világos, meg is írnám, csak nem tudom mit akar ez jelenteni:

    strFile=strFile & strLine & vbCrLf

    Az strFile micsoda?
    Kipróbáltam de egyelőre nem sikerül sajnos.
    Vagy azt meg tudnád mondani, hogy az első levelemben ez a strFile minek felel meg?
    Mutasd a teljes hozzászólást!
  • ne foglalkozz vele. Csak egy változó, amibe gyűjtöd soronként az adatokat. (csak példának írta Árnyék)
    Neked ez kell helyette:

    Do While Not fle1.AtEndofStream strLine = fle1.ReadLine If Left(strLine, 6) = "<TABLE" Then fle2.WriteLine strLine LOOP

    (legközelebb használd a forráskód gombot a hozzászólásablakban. -de főleg: topicnyitás előtt inkább gondolkodj egy picit, mert ez ovis szint, és ettől sokan kiborulnak.)
    Mutasd a teljes hozzászólást!
  • elég lett volna ennyit betenni a forráskódodból:

    Function CopyStuff() Set objFSO = CreateObject("Scripting.FileSystemObject") Set fle1 = objFSO.OpenTextFile(strCelFajl) 'cél-fájl Set fle2 = objFSO.CreateTextFile(strTempFajl) 'temp-fájl Do While Not fle1.AtEndofStream strLine = fle1.ReadLine Select Case strLine Case "Change this line" fle2.WriteLine "Changed" Case "Change this one too" fle2.WriteLine "This line is changed" Case Else fle2.WriteLine strLine End Select Loop fle1.Close Set fle1 = Nothing fle2.Close Set fle2 = Nothing objFSO.DeleteFile strCelFajl, True objFSO.MoveFile strTempFajl, strCelFajl ' CopyStuff = 1 End Function


    ugyanis az angol magyarázó szöveg senkit nem érdekel, valamit a hülye a Error kezelések sem. ... meg a teljesen egyértelmű deklarációk sem. Persze ehhez nem ártana tisztában lenni azzal, hogy mi micsoda egy programban.
    Mutasd a teljes hozzászólást!
  • Köszi!
    legközelebb használok forráskód gombot, meg gondolkodni is fogok, végre nagy nehezen sikerült a megfelelő helyre betennem a kódot. Mégegyszer köszi mindenkinek aki segíteni próbált, még ha ovis szinten is volt a kód.
    Mutasd a teljes hozzászólást!
  • Úgy látom, csak a kész megoldást tudod te is díjazni, ha vki rá akar vezetni, azt már nem! Minek is strapálom magam akkor?
    Mutasd a teljes hozzászólást!
  • Most nekem az volt a fontos, hogy gyorsan meg legyen, még pár nap és többé soha nem fogok VB scriptet írni, tehát nem nagyon akartam megérteni, meg rávezetődni sem, mikor alapvető ismereteim sincsenek meg a nyelvvel kapcsolatban, csak találgatok össze-vissza.
    Mutasd a teljes hozzászólást!
  • Csak gondoltam megírom, hogyan is néz ki amit összehoztatok nekem. Már csak finomítanom kell.
    Ime a tökéletesen működő kód:


    option explicit On Error Resume Next 'Since this was written for Windows Scri ' pting Host, 'it uses VBScript which doesn't use type ' s. 'To use this with VB, as types to the de ' clarations Dim objFSO 'as FileSystemObject Dim fle1 'as file Dim fle2 'as file Dim strPath 'as String Dim strFldr 'as String Dim strLine 'as String strPath = "C:COPMPUTER_NEVE.mht" 'Put In the file you want To edit strFldr = "C:TempFile.mht" Main 'This Calls the Main Sub Sub Main() Dim rtn 'as Integer rtn = CopyStuff() 'This calls and runs the CopyStuff function if rtn = 1 Then MsgBox "Copy is complete" else MsgBox "An Error was found and the process was aborted. " & Cstr(rtn) 'The & Cstr(rtn) will display the number returned by CopyStuff 'After you've got your script running, you may want To remove this feature End if 'Cleanup if Not fle1 is nothing Then Set fle1 = nothing if Not fle2 is nothing Then Set fle2 = nothing if Not objFSO is nothing Then Set objFSO = nothing End Sub function CopyStuff() Set objFSO = CreateObject("Scripting.FileSystemObject") 'This creates the FSO 'I've included Error handling after Each step if err.number <> 0 Then MsgBox "Error In Creating Object: " & err.number & "; " & err.description CopyStuff = 0 'Returns this number Exit function 'Stop processing, go back to Main End if if Not objFSO.FileExists(strPath) Then 'The file To copy is not present MsgBox "The " & strPath & " file was Not found On this computer" CopyStuff = 2 Exit function End if if objFSO.FileExists(strFldr) Then objFSO.DeleteFile(strFldr) 'If the temp file is found, delete it End if Set fle1 = objFSO.OpenTextFile(strPath) 'Open if err.number <> 0 Then MsgBox "Error opening " & strPath & ": " & err.number & "; " & err.description CopyStuff = 3 Exit function End if Set fle2 = objFSO.CreateTextFile(strFldr) 'Create the temp file if err.number <> 0 Then MsgBox "Error creating temp ini: " & err.number & "; " & err.description CopyStuff = 4 Exit function End if 'Here's the work horse that does the copying Do While Not fle1.AtEndofStream strLine = fle1.ReadLine If ( Left(strLine, 6) <> "<TABLE" ) and ( Left(strLine, 6) <> "</TABL" ) Then fle2.WriteLine strLine LOOP if err.number <> 0 Then MsgBox "Error transfering data: " & err.number & "; " & err.description CopyStuff = 5 fle1.close fle2.close Exit function End if fle1.close Set fle1 = nothing fle2.close Set fle2 = nothing objFSO.DeleteFile strPath, True 'This deletes the original file objFSO.MoveFile strFldr, strPath 'This moves and renames the temp file, replacing the original if err.number <> 0 Then MsgBox "Error replacing " & strPath & " With new file: " & err.number & "; " & err.description CopyStuff = 6 Else CopyStuff = 1 'Remember that In Main, a 1 means successful End if End function
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd