Newsgroup: it.comp.lang.visual-basic
Titolo: aiuto per ricerca stringhe





Un saluto a tutti, questa è la prima volta che 
scrivo sul newsgroup.


Dalla richiesta si capirà subito che sono un 
principiante ma "nessuno è nato imparato come dicono a Napoli",  ho 
iniziato da poco con VB, ci sto perdendo qualche notte ma la cosa, visto che non 
lo faccio per lavoro,  mi diverte.


Il mio problema è il seguente: utilizzo un 
programma che genera un file log ed ho la necessità di estrarre da questo file 
dei dati, il file è .txt perciò ho provato con tutto quello che conosco ma l' 
unica cosa che riesco a trovare ed ad estrarre è l' inizio della prima stringa. 
Copio e incollo alcune righe del file per rendere l' idea di cosa devo estrarre 
-


 


 2003-01-28 11:36:22 START 
UTC
@281144z5124.54N/00545.09E_280/012g021t045r000p000P000b10142h62/ 
{UIV32}
2003-01-28 11:37:50 

IW2GUR,6,33,22,9,45
'+6)n*,>/]"5:}
!4733.30N/01859.91E#PHG4730/APRS 
UIDIGI 1.8b6 - Budapest/HA (3)
2003-01-28 11:37:50 

IW2GUR,8,5,77,56,22
!3818.82NN00118.15W#PHG0000/PERLA3 CIEZA 
S.ASCOY EXPERIMENTAL 1
2003-01-28 11:37:51 KC7BWK>APRS,TCPXX*,qAX,KC7BWK 
<UI>:
@281138z4400.00N/12408.00W_357/004g005t046r000p000P000h98b10248v8
2003-01-28 
11:37:51 
IW2GUR,8,11,6,78,44


 


Le stringhe in grassetto sono quelle che 
devo trovare, naturalmente all'interno del file completo ce ne sono molte altre 
ad orari diversi, purtroppo riesco a trovare la prima stringa ma solo la 
parte riguardante le lettere che non cambia mai (IW2GUR) la parte con i 
numeri invece cambia in continuazione perciò non la posso usare per la ricerca, 
in più avrei bisogno di poter leggere tutte le stringhe all' interno del file 
che iniziano con (IW2GUR) e copiarle su un file dal quale poi estrarle per 
elaborarle oppure in una text box, sempre per poterle poi leggere ed 
elaborare. I "numeri"  opportunamente convertiti corrispondono a 
valori di corrente, tensione e temperatura presenti su alcune apparecchiature 
remote. I dati vengono inviati via radio ed in futuro,


non so quanto remoto,  vorrei prelevare i dati 
direttamente dalla seriale del PC ma questo è un altro argomento.


Cosa vi posso dire, mi date una mano a dormire 
qualche ora in più ?


Ciao.


 Fausto



 file è .txt perciò ho provato con tutto quello che conosco.....
Vedere la guida per aprire un file in modalità "input"
(suggerimento: istruzione "open")
Vedere la guida per la lettura dei file di testo
(suggerimento: istruzione "Input line")
Vedere la guida per la ricerca di sottostringhe
(suggerimento: istruzione "instr")
Ti sei garantito qualche altra notte in bianco :-)
Salutoni
Sergio

 ha scritto nel messaggio
news:b1qlkd$15i2mj$1...@ID-173193.news.dfncis.de...


 non riesco a leggere le successive.
Nell'ordine:
fn = FreeFile
Open ... For Input As #fn
Do Until EOF(fn)
    Line Input #fn, aLine
    'Elabora linea
Loop
Close #fn
hth,
Lokar
P.S. Attenzione al quoting per favore!
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

 P.S. Attenzione al quoting per favore!
Forse non mi sono spiegato bene, posso postare il listato del codice che sto
sperimentando per chiarezza?
Ciao
Fausto

 che sto sperimentando per chiarezza?
Se non sono chilometri....
Siamo in ansiosa attesa :-)
--
Salutoni
Sergio

Speriamo che nell' attesa l' ansia non ti provochi problemi cosi te lo mando
subito.
Sul form ci sono due TextBox e due CommandButton.
Una parte del  file è quello che ho postato.
Quello che vorrei è che nella TextBox 2  venissero scritte le stringhe
compresi i numeri che ci sono dopo il nome e che le stringhe siano quelle
presenti realmente nel file.
Con questo listato riesco a leggere in TextBox 2  la prima stringa "monca"
ma non le successive.
Se clicco su Command1 mi aggiunge una stringa ma è sempre la prima, non
legge le successive.
Ho provato con vari modi utilizzando i cicli Do e For ma non ci ho cavato un
ragno dal buco.
Ciao
Fausto
----------------------------------------------------------------
Private Sub Command1_Click()
 Dim Search, Where   ' Dichiara le variabili.
    Dim Riga As String
    file1 = FreeFile
    Open "C:\Temp\iw2gur.txt" For Input As #1   ' Apre il file per l'input.
    Text1.Text = Clear
    Do Until EOF(1)
    Line Input #1, Riga
    Text1.Text = Text1.Text & Riga & vbCrLf
    Loop
    Close #1
    Search = "IW2GUR"     ' Cerca la stringa IW2GUR
    Where = InStr(Text1.Text, Search) ' Trova la stringa nel testo.
    If Where Then   ' Se la trova, imposta
    Text1.SelStart = Where - 1 + Len(Search)
    Text1.SetFocus
    Text2.Text = Text2.Text & Now & " > " & (Search) & vbCrLf  '&
Len(Search)
    Else
    MsgBox "Stringa non trovata."  ' Avvisa l'utente.
    End If
End Sub
----------------------------------------------------------------------------
----------------


 (snip)
uhm... visto così sembra corretto (a parte quel file1 non dimensionato e poi non
utilizzato :-) )
Possibili problemi:
1) Il file non è esattamente in formato testo, contiene caratteri riconosciuti
come "fine del file", e quindi l'eof diventa vero prima del dovuto
2) il file contiene caratteri di ritorno a capo diversi da quanto riconosciuto
da Line Input, per cui ti carica tutto il file in una sola stringa.
Se il text1 ha il multiline a true, questa sseconda ipotesi è abbastanza
improbabile, comunque, perchè te ne accorgeresti.
Dovresti aprire il file in modalità binaria, e vedere quale carattere c'è dopo
l'ultimo che vedi con il line input.
hth
Salutoni
Sergio

 legge le successive.
Il tuo codice è corretto, mancava solo di specificare la posizione iniziale
per la ricerca, se imposti Where come intero static, prova a sostiruire la
riga della ricerca con:
Where = InStr(Where+1,Text1.Text, Search) ' Trova la stringa nel testo.

Non funge, mi da un messaggio di errore.
Mi sa che dovrò perdere ancora qualche nottata.
Il problema è che dovrei leggere tutte le stringhe presenti nel file che
iniziano con IW2GUR e con i numeri che ci sono dopo la virgola. Purtroppo
non riesco a far leggere in textbox2 le stringhe, come dicevo ne legge una
senza numeri poi si ferma. Ho provato con DO-UNTIL ma niente, il ciclo non
va.
Boh !!!! Le prove continuano.
Ciao e grazie
Fausto


 va.
Si in effetti il mio post era incompleto, richiedeva una piccola
elaborazione.
Il punto che volevo sottolineare è che il where accetta come parametro un
numero che specifica la posizione di partenza per le ricerche, per cui per
ricerche moltiple devi utilizzarlo.
Sotto ti includo il listato, con il codice spezzato in 3 sub diverse.
8<-------
dim Search as string
dim Where as long
Private sub LoadFromFile()
    dim file1 as integer
    dim riga as string
    file1 = FreeFile
    Open "C:\Temp\iw2gur.txt" For Input As file1   ' Apre il file per
l'input.
    Text1.Text = Clear
    Do Until EOF(file1)
        Line Input file1, Riga
        Text1.Text = Text1.Text & Riga & vbCrLf
    Loop
    Close file1
End Sub
private sub SearchFirst()
    'Cerca la stringa IW2GUR
    Search = "IW2GUR"
    where=0
    searchnext
end sub
private sub SearchNext()
    Dim WhereEOF As Long
    Where = InStr(Where + 1, Text1.Text, Search) ' Trova la stringa nel
testo.
    If Where > 0 Then ' Se la trova, imposta
        WhereEOF = InStr(Where + 1, Text1.Text, vbCrLf)
        If whereEOF = 0 Then whereEOF = Len(Text1.Text)
        Text1.SelStart = Where - 1 + Len(Search)
        Text1.SelLength = whereeof - Where + 1 - Len(Search)
        Text1.SetFocus
        Text2.Text = Text2.Text & Now & " > " & Search & vbCrLf  '&
Len(Search)
    Else
        MsgBox "Stringa non trovata."  ' Avvisa l'utente.
    End If
End sub
8<-------

Non avevo assegnato un valore iniziale a where è per questo che mi dava
errore.
Cosi com'è il codice che mi hai mandato non rileva la stringa ma riporta
quello che c'è nella variabile search, ho provato in molti modi ( altra
notte persa) ma purtroppo la ricerca si ferma alla prima stringa trovata e
non riporta i numeri dopo la stringa. Con l' istruzione  Text1.SelLength si
evidenziano i numeri dopo la stringa ricercata e potrei usare i comandi per
clipboard ma il problema è che la ricerca si ferma alla prima stringa.
Ciao.
Fausto


 Fausto
Per verifica ho copiato il codice in VB cosi' com'e' e trova TUTTE le
occorrenze della stringa, selezionando i caratteri da dopo la stringa fino a
crlf, quindi se ho ben capito quallo che dicevi, funziona. Prima utilizzi la
sub "load", poi la "FindFirst" e poi "FindNext" finchč non ne trovi piů.


Ok, risolto. Il problema stava nello 0 assegnato a where, questo non
incrementava la ricerca.
Adesso devo fare in modo che in text2 le stringhe le legga tutte senza dover
cliccare su command per ogni stringa che trova. Ho provato con un ciclo DO
ma non sono riuscito a farlo funzionare, farò un  po' di prove, mi dispiace
solo di dover continuare per tentativi ma, senza una conoscenza approfondita
di tutte le istruzioni di VB, è tutto quello che posso fare.  Resta sempre
il problema di leggere i numeri dopo la stringa che sono poi quelli che mi
servono per ricavare i valori di corrente, tensione e temperatura. Grazie di
tutto. Vorrei dirti a buon rendere ma non mi sembra il caso.
Ciao.
Fausto

 ha scritto nel messaggio
news:LYw0a.16261$%p6.13...@news.edisontel.com...

Puoi variare la sub FindNext trasformandola in un function che ritorna un
boolean, che significa che se ritorna false non ha trovato nulla, se ritorna
true ha trovato qualcosa, a questo punto puoi fare:
private Function SearchNext() as boolean
    Dim WhereEOF As Long
    Where = InStr(Where + 1, Text1.Text, Search)
    If Where > 0 Then ' Se la trova, imposta
        WhereEOF = InStr(Where + 1, Text1.Text, vbCrLf)
        If whereEOF = 0 Then whereEOF = Len(Text1.Text)
        Text1.SelStart = Where - 1 + Len(Search)
        Text1.SelLength = whereeof - Where + 1 - Len(Search)
        Text1.SetFocus
        Text2.Text = Text2.Text & Now & " > " & Search & vbCrLf  '&
Len(Search)
        SearchNext=true
    Else
        SearchNext=false
    End If
End sub
E per trovare tutte le occorrenze:
do
    Ret=FindNext
    if ret then
        'Fai qualcosa con text1.seltext
    endif
loop while Ret
Spero di essere stato chiaro...
Ciao

 crlf, quindi se ho ben capito quallo che dicevi, funziona. Prima utilizzi
la
