Newsgroup: it.comp.lang.visual-basic
Titolo: Piccola app o script per sostituire il nome di un file.txt con una parola contenuta all'interno del file

Debbo creare uno script che all'esecuzione sostituisca il nome del file.txt con quanto contenuto tra parentesi nella seconda stringa contenuta al suo interno. 
 
Es. Filename.txt 
-------------------------- 
% 
O0028(CANNULA 100 MM) 
#908=50(GREZZO) 
G28V0 
M500Z203 
T101(FERMO CON UTENSILE) 
G4X0.5 
G0X0Y-30Z-1.5 
M00 
G0Z100 
X150Y0 
G28V0 
-------------------------- 
...etc 
-------------------------- 
 
Rinominare "Filename.txt" con la parola letta tra parentesi nella seconda riga del file (CANNULA 100 MM) in "CANNULA 100 MM.txt" 
 
Sapete darmi una mano? 
Grazie a tutti. 
Gra 

 riga del file (CANNULA 100 MM) in "CANNULA 100 MM.txt" 
 
E' sempre e solo nella 2nda riga ?
E' sempre e solo tra parentesi ?
C'e' il rischio che il file contenga caratteri speciali
non consentiti nel nome del file ? (esempio: ? * \ / )

GraVer68 ha scritto...

on error resume next
ff=freefile
open Filename.txt for binary as #ff
    i=split(input(lof(ff),#ff),vbcrlf)(1)
close #ff
if i<>"" then
    n=replace(split(i,"(")(1),")","")
    if n<>"" then name Filename.txt as n & ".txt"
end if 
 


Questo, se i file sono grossi, consuma un boato di memoria per niente, caricandoli per intero
 
Se è un file di testo, basta aprirlo normale e fare due semplici
 
Line Input
 
invece di un Input(lof) solo per fare lo split...

invece di un Input(lof) solo per fare lo split...
 
Hai detto bene ... "Se sono grossi"
Siccome sono file CNC che generalmente non superano i 100 Kb va benissimo!
Comunque la routine è solo un punto di partenza... uno spunto!
 

PS: Il Line Input non sempre va a buon fine!

 PS: Il Line Input non sempre va a buon fine!
 
Negli ultimi 18 e passa anni non mi è mai successo che Line Input non sia andato a buon fine in un file di testo... oltretutto risolve da solo sia la terminazione di linea CR che CRLF, cosa che con lo Split() va tenuta in considerazione

considerazione
 
Negli ultimi 33 (0 34 non ricordo bene, dev'essere l'età avanzata)...
...comunque da sempre utilizzo queste tecniche collaudate per operare sui 
files.
Ognuno utilizza le tecniche che più preferisce.
Comunque adesso sai indirettamente che può capitare... hai imparato una cosa 
nuova! ;)
L'esempio che ho buttato giù l'ho scritto a braccio, è la prima cosa che mi 
è venuta in mente.
Potresti buttare giù qualcosa anche tu, piuttosto che criticare l'operato 
altrui senza muovere un dito? 
 


Minchia, la sagra del guru :p
 
-- 
GbC
www.gbc.uno


Ragazzi! un sincero grazie a tutti... sempre splendidi i Gruppi...
Federico mi sembra abbia colto nel segno appieno.
Il problema e' che io programmavo fino a una 10na d'anni fa' in elementare BASIC o batch DOS e in linguaggi script non meglio noti.
 
Questo codice che mi scrivi Federico, scusa l'ignoranza, richiede un compilatore o e' gia' eseguibile? Riesco a crearlo in VB senza dover comperare licenze costose da programmatori?
 
Scusate tanto davvero, ma rientrando in un settore da tanto tempo uscito, sto cercando prima le informazioni basilari per improntare il progettino, che a mio avviso non deve essere difficilissimo da realizzare.
 
Grazie a tutti comunque.
Gra

 comperare licenze costose da programmatori?
 
Visual Basic, in quanto ambiente di sviluppo e compilatore, richiede una licenza commerciale... non è più supportato nè commercializzato, per cui potrebbe non essere scontato riuscire a trovare una licenza valida di VB6 (ultima versione disponibile)
 
Visual Basic.NET è l'erede in ambiente .NET, ed è disponibile in versione 'Express', utilizzabile gratuitamente anche a scopi commerciali; hai tutto quello che serve ma il linguaggio è piuttosto diverso, e il codice di esempio non compatibile così com'è
 
Se hai a disposizione Office, allora Visual basic For Application, integrato nei vari moduli, è per la stragrande maggioranza compatibile con codice Visual Basic "liscio"... l'esempio in questione dovrebbe andare al 100%, ma devi distribuire lo script come parte di un documento Office di qualche tipo, e chi lo usa deve avere a sua volta licenza Office; mi pare esistesse, un tempo, una sorta di  SDK per poter fare pacchetti autosufficenti, ma non ho idea se sia ancora supportato e come funzioni.
 
L'interprete VBScript integrato nel S.O. è un'altra alternativa, e non richiede nemmeno compilazione, basta creare un file .VBS con codice opportuno... la sintassi è molto più vicina a quella di VB originale ma ha parecchi limiti sulle funzionalità, specie se ti serve un'interfaccia utente.
Nello specifico, per quanto riguarda le funzioni di I/O su file, la sintassi non del tutto compatibile, per cui di nuovo l'esempio non è utilizzabile senza adattamenti. 
 
Infine, ci sono alternative non Microsoft, sia a pagamento che gratuite, per ambienti di sviluppo basati su BASIC, con sintassi più o meno vicine a VB, secondo i casi.
 
Tu, esattamente che devi fare? se ti è sufficente uno script "estemporaneo" per il lavoro che chiedi, allora probabilmente la cosa più pratica è farlo in VBS... crea un file con estensione .VBS col tuo editor di testo predefinito e prova con un codice tipo questo:
 
Dim fso, f, i, myLine
Dim startPos, endPos
 
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("C:\test.txt", 1)
i=0
Do While Not f.AtEndOfStream
	myLine = f.ReadLine
	i = i + 1
	if i = 2 Then Exit Do 
Loop
f.close
 
If Len(myLine) > 0 Then
	startPos=Instr(myLine, "(")
	endPos=InstrRev(myLine, ")")
End If
If endPos > startPos Then
	fso.MoveFile "c:\test.txt", "c:\" & Mid(myLine, startPos+1, endPos-startPos-1) & ".txt"
	MsgBox "OK"
Else
	MsgBox "Formato file non corretto."
End if


Secondo me così non funziona per via
della presenza di:
O0028
 
Sarà necessaria qualche modifica per
determinare il testo tra parentesi.
 
Saluti
Sauro 
 
 

 
Al di là dei vari "sanity checks" che chiaramente vanno aggiunti a qualsiasi esempio, per funzionare, funziona... lui fa Split con delimitatore "(" della stringa
 
O0028(CANNULA 100 MM)
 
con cui ottiene l'array
 
(0) = "O0028"
(1) = "CANNULA 100 MM)"
 
Prende il secondo elemento, indice 1, e con Replace toglie la parentesi in fondo
 
quindi, purchè la riga sia sempre in un formato congruente a quello (non ci siano altre parentesi, non ci sia niente dopo la parentesi chiusa ecc...) qualunque cosa ci sia prima della parentesi aperta è ininfluente


Ragazzi per dovere di cronaca, annuncio di avere completato il progettino con l'ausilio di AutoIt, funziona perfettamente!
Grazie molto per il supporto e l'attenzione dimostrata, siete grandi! ;)
Saluti,
Graziano