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