Se Windows genera un errore, hai un problema di virus o vuoi discutere/segnalare l'uscita della nuova versione di un software per la piattaforma Microsoft, questa è la sezione giusta.
Ho bisogno di estrarre da grossi file txt la seguente sequenza : "parola:parola"; praticamente le voci unite fra loro dai due punti.
Sapete se è possibile e come si fa ? Possibilmente se fosse possibile anche modificando la sequenza.
Al3x ha scritto:presumo che con vbscript sia possibile realizzare facilmente uno script che svolga questa operazione. Vediamo se qualcuno sa come procedere
ESPRESSIONEREGOLARE = "[a-z]+:[a-z]+"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TF = FSO.OpenTextFile("input.txt", 1)
TESTOIN = TF.ReadAll
TF.Close
Set RE = CreateObject("VBScript.RegExp")
RE.Global = True
RE.IgnoreCase = True
RE.Pattern = ESPRESSIONEREGOLARE
Set RISULTATI = RE.Execute(TESTOIN)
If RISULTATI.Count > 0 Then
Set TF = FSO.OpenTextFile("output.txt", 2, True)
For Each RISULTATO in RISULTATI
TF.WriteLine(RISULTATO.Value)
Next
TF.Close
Wscript.Echo "Operazione completata."
Else
Wscript.Echo "Espressione non trovata."
End If
Per semplicità il file di testo in ingresso deve chiamarsi input.txt e si deve trovare nella stessa cartella dello script VBS che, al termine dell'estrazione, scriverà il file output.txt contenente i risultati.
Il cuore del programma è tutto nella espressione regolare definita nella prima riga: modificandola opportunamente, si potrà usare lo stesso codice per altri scopi. Ad esempio: se le parole da cercare contengono anche caratteri numerici, basterà sostituire la prima riga con: ESPRESSIONEREGOLARE = "[a-z0-9]+:[a-z0-9]+"
Molte grazie, mi sembra che funzioni. Desideravo sapere come posso inserire, oltre a lettere e numeri, eventuali caratteri particolari tipo "!;@./"nell'espressioneregolare al fine di raffinare la ricerca.
senzasoldi ha scritto:Desideravo sapere come posso inserire, oltre a lettere e numeri, eventuali caratteri particolari tipo "!;@./"nell'espressioneregolare al fine di raffinare la ricerca.
Vanno aggiunti, uno per uno, nelle espressioni comprese tra parentesi quadre. Usando come esempio i 5 caratteri "!;@./" che hai indicato diventerebbe: ESPRESSIONEREGOLARE = "[a-z0-9!;@./]+:[a-z0-9!;@./]+"
Tieni presente che i caratteri "\", "^" e "-" hanno un significato speciale nelle espressioni regolari e, pertanto, vanno preceduti dal carattere di escape: "\\", "\^" e "\-": ESPRESSIONEREGOLARE = "[a-z0-9\\\^\-]+:[a-z0-9\\\^\-]+"
A questo punto, se le coppie di parole sono separate solo da spazi, forse diventa più semplice usare un approccio "inverso": ESPRESSIONEREGOLARE = "[^ \r\n]+:[^ \r\n]+"
che, in pratica, rileva qualsiasi carattere a parte gli spazi e gli "a capo".
Ho fatto come hai indicato, ma non ho ottenuto quanto speravo, perchè scrivendo " "[a-z0-9!]+:[a-z0-9!]+" pensavo di selezionare solo ed unicamente tutte le espressioni contenenti anche il punto esclamativo. Invece mi estrae tutte le espressioni con lettere, tutte le espressioni con lettere e numero e tutte le espressioni con lettere,numeri, e punto esclamativo.
Cosa devo scrivere per ottenere il risultato che interessa?
senzasoldi ha scritto:Ho fatto come hai indicato, ma non ho ottenuto quanto speravo, perchè scrivendo " "[a-z0-9!]+:[a-z0-9!]+" pensavo di selezionare solo ed unicamente tutte le espressioni contenenti anche il punto esclamativo. Invece mi estrae tutte le espressioni con lettere, tutte le espressioni con lettere e numero e tutte le espressioni con lettere,numeri, e punto esclamativo.
Cosa devo scrivere per ottenere il risultato che interessa?
Oops... sorry: avevo interpretato male la tua richiesta. La faccenda si complica un po'...
Per estrarre le espressioni che contengono "!" in entrambe le parole ai lati dei ":": ESPRESSIONEREGOLARE = "[^\s]*!+[^\s]*:[^\s]*!+[^\s]*"
Per estrarre le espressioni che contengono "!" anche solo in una delle due parole ai lati dei ":": ESPRESSIONEREGOLARE = "[^\s]*!+[^\s]*:[^\s]+|[^\s]+:[^\s]*!+[^\s]*"
N.B: non mandarmi a quel paese!!!
Certo che no... però adesso mi serve qualcosa che faccia passare il mal di testa.
Rispolvero una vecchia discussione : alle espressioni sopra indicate è possibile aggiungere la condizione: se nella riga sotto compare la parola "IT" ?
senzasoldi ha scritto:se nella riga sotto compare la parola "IT" ?
Per essere sicuro di capire bene cosa ti serve, potresti inserire qualche riga come esempio del testo in ingresso in un tag "Code" e il corrispondente output che ti aspetti di ottenere (sempre in un altro tag "Code")?
C'è però un accorgimento: visto che l'espressione deve trovare corrispondenza su più di una riga, è necessario aggiungere: RE.MultiLine = True
...al codice VBS visto sopra (è questo che ha determinato un certo ritardo nella risposta ).
ESPRESSIONEREGOLARE = ".*\n.*\|US"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TF = FSO.OpenTextFile("input.txt", 1)
TESTOIN = TF.ReadAll
TF.Close
Set RE = CreateObject("VBScript.RegExp")
RE.Global = True
RE.IgnoreCase = True
RE.MultiLine = True
RE.Pattern = ESPRESSIONEREGOLARE
Set RISULTATI = RE.Execute(TESTOIN)
If RISULTATI.Count > 0 Then
Set TF = FSO.OpenTextFile("output.txt", 2, True)
For Each RISULTATO in RISULTATI
TF.WriteLine(RISULTATO.Value)
Next
TF.Close
Wscript.Echo "Operazione completata."
Else
Wscript.Echo "Espressione non trovata."
End If
Inserendo un messaggio, dichiari di aver letto e accettato il regolamento di partecipazione.
Nello specifico, sei consapevole che ti stai assumendo personalmente la totale responsabilità delle tue affermazioni, anche in sede civile e/o penale,
manlevando i gestori di questo sito da ogni coinvolgimento e/o pretesa di rivalsa.
Dichiari inoltre di essere consapevole che il messaggio sarà visibile pubblicamente, accetti di diffonderlo con licenza
CC BY-NC-SA 3.0 (con attribuzione a "TurboLab.it") e rinunci ad ogni forma di compensazione (economica o altro).
Rinunci inoltre esplicitamente a qualsiasi pretesa di cancellazione del messaggio.