PDA

Visualizza la versione completa : [VBS] Sostituire stringa utilizzando RegEx in un file di testo


[trodat]
28-03-2020, 19:35
Ciao a tutti.

Il file di testo expiration.txt contiene 197.015 righe.

Per ciascuna riga ho la necessit di sostituire :


2020-03-01 13:33 >>> 2020-03-01
2020-02-01 08:45 >>> 2020-02-01
2020-01-01 11:30 >>> 2020-01-01
...
...
2018-01-01 12:40 >>> 2018-01-01 (questa l'ultima riga numero 197.015 )


Questo il codice che sto provando, che per non funziona.

Non d errori, ma la sostituzione non avviene, il file rimane nel formato iniziale.

Come posso risolvere.

Grazie.


Const ForReading = 1
Const ForWriting = 2
intCount = 0
intIndex = 1
Set oFSO = CreateObject("Scripting.FileSystemObject")
str_input = ""
Set oInFile = oFSO.OpenTextFile("expiration.txt", 1)
str_input = oInFile.ReadAll()
Set oRegEx = CreateObject("VBScript.RegExp")
With oRegEx
.Multiline = True
.Global = True
.Pattern = "(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+);"
End With
Do Until oInFile.AtEndOfStream
str_input = oInFile.ReadLine
If (intCount = 0) Then
str_input = oRegEx.Replace(str_input, "$1-$2-$3;")
Set oInFile = oFSO.OpenTextFile("expiration.txt", 2)
oInFile.Write str_input
oInFile.Close
End If
intCount = intCount + 1
If (intCount = 200) Then
intCount = 0
intIndex = intIndex + 1
oInFile.Close
End If
Loop
oInFile.Close
set oFSO = nothing WScript.echo "ok"

oregon
28-03-2020, 21:15
Il codice illeggibile

Comunque la data/ora si trova sempre all'inizio della riga?

[trodat]
28-03-2020, 21:24
Quando provo ad accedere con Chorme, mi d questo errore e non mi fa andare avanti :


Messaggio vBulletinUn campo obbligatorio chiamato ip mancante o ha un valore non valido.



L'unico modo stato cambiare browser (Edge) e inserire una risposta al topic.

Questo il codice :


Const ForReading = 1
Const ForWriting = 2
intCount = 0
intIndex = 1
Set oFSO = CreateObject("Scripting.FileSystemObject")
str_input = ""
Set oInFile = oFSO.OpenTextFile("expiration.txt", 1)
str_input = oInFile.ReadAll()
Set oRegEx = CreateObject("VBScript.RegExp")
With oRegEx
.Multiline = True
.Global = True
.Pattern = "(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+);"
End With
Do Until oInFile.AtEndOfStream
str_input = oInFile.ReadLine
If (intCount = 0) Then
str_input = oRegEx.Replace(str_input, "$1-$2-$3;")
Set oInFile = oFSO.OpenTextFile("expiration.txt", 2)
oInFile.Write str_input
oInFile.Close
End If
intCount = intCount + 1
If (intCount = 200) Then
intCount = 0
intIndex = intIndex + 1
oInFile.Close
End If
Loop
oInFile.Close
set oFSO = nothing
WScript.echo "ok"

KillerWorm
28-03-2020, 23:12
Quando provo ad accedere con Chorme, mi d questo errore e non mi fa andare avanti :
Grazie per la segnalazione, la riferisco all'amministrazione

[trodat]
28-03-2020, 23:21
Il codice illeggibile

Comunque la data/ora si trova sempre all'inizio della riga?

Grazie

Riesco ad accedere correttamente solo dallo Smartphone.
Dal pc praticamente impossibile con qualsiasi browser.

La risposta alla tua domanda no.
La data non mai all'inizio della riga.

Purtroppo dallo Smartphone non posso postare il tracciato record.

[trodat]
28-03-2020, 23:33
Il codice illeggibile

Comunque la data/ora si trova sempre all'inizio della riga?

Tracciato record :




foo1; 2020-03-01 13:33;
foo2; 2020-02-01 08:45;
foo3; 2020-01-01 11:30;
...
...
...

oregon
29-03-2020, 00:19
Ok, non all'inizio, ma sempre il secondo campo come hai mostrato?

Se cos, puoi usare questa versione di codice (la tua tenta di scrivere nel file di input ...)



Const ForReading = 1
str_input = ""
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oInFile = oFSO.OpenTextFile("test.txt", ForReading)
Set oOutFile = oFSO.CreateTextFile("test2.txt", True)
Do Until oInFile.AtEndOfStream
str_input = oInFile.ReadLine
flds = Split(str_input, ";")
flds(1) = Trim(Left(flds(1), len(flds(1))-5))
for each f in flds
oOutFile.Write f & ";"
next
oOutFile.WriteLine
Loop
oInFile.Close
oOutFile.Close
set oFSO = nothing
WScript.echo "ok"

[trodat]
29-03-2020, 09:30
Ok, non all'inizio, ma sempre il secondo campo come hai mostrato?

Se cos, puoi usare questa versione di codice (la tua tenta di scrivere nel file di input ...)



Const ForReading = 1
str_input = ""
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oInFile = oFSO.OpenTextFile("test.txt", ForReading)
Set oOutFile = oFSO.CreateTextFile("test2.txt", True)
Do Until oInFile.AtEndOfStream
str_input = oInFile.ReadLine
flds = Split(str_input, ";")
flds(1) = Trim(Left(flds(1), len(flds(1))-5))
for each f in flds
oOutFile.Write f & ";"
next
oOutFile.WriteLine
Loop
oInFile.Close
oOutFile.Close
set oFSO = nothing
WScript.echo "ok"


Grazie

Errore ;
Indice non incluso nell intervallo
Alla riga flds(1) = ....

Scusa ma ti rispondo dallo Smartphone
Dal pc non riesco ad accedere al forum

oregon
29-03-2020, 09:45
Hai detto che la riga tipo

foo1; 2020-03-01 13:33;

ma dall'errore si capisce che esistono righe fatte diversamente.

Devi dirci se ci sono eccezioni a questo formato record

[trodat]
29-03-2020, 10:20
Sempre da smartphone
Le righe sono quelle che ho postato nel primo msg
Ho provato a ridurre il numero delle righe ma da lo stesso errore

Loading