Terve, minulla olisi pieni ongelma Visual Basic 6:n kanssa.
Eli olisiko kenelläkään vihjeitä kuinka saan suodatettua pelkät numerot ulos muuttujasta, johon on tallennettu kirjaimia ja numeroita? Tai jollain tapaa tyhjennettyä kirjaimet muuttujasta?
Kiitos jo etukäteen!
Yksinkertainen tapa on käydä kaikki merkit läpi ja valita uuteen merkkijonoon vain numerot.
Dim teksti As String, uusi As String
Dim merkki As String, i As Integer
teksti = "12k56k23231lköd98434j12"
For i = 1 To Len(teksti)
merkki = Mid(teksti, i, 1)
If merkki >= "0" And merkki <= "9" Then
uusi = uusi + merkki
End If
Next
MsgBox uusiTämän jälkeen muuttujan voi tietysti muuttaa myös luvuksi Val-funktiolla, jos luku ei ole liian pitkä.
Toinen vaihtoehto on käyttää Replace-funktiota, jolla korvataan merkkijonosta tietty merkki/-jono merkillä/merkkijonolla. Antin tapa on tehokkaampi, jos tarkistettava merkkijono on lyhyempi kuin mahdollisten poistettavien merkkien määrä (esim. tarkistettavia merkkejä on kaikki aakkoset). Jos taas tarkistettavassa merkkijonossa on vain muutama mahdollinen ei numeerinen merkki, niin replace on tehokkaampi, sillä silloin selvitään vähemmillä toistoilla For-silmukassa.
Dim teksti As String: teksti = "12k56k23231lköd98434j12"
Dim korvattu As String: korvattu = teksti
Dim poistettavat As String: poistettavat = "dijklmåäö"
Dim i As Integer
For i = 1 To Len(poistettavat)
'Replace korvaa kaikki haetut merkit kerralla. Vrt. k-kirjain tekstissä.
'Replace([mistä etsitään],[mitä haetaan],[millä korvataan])
korvattu = Replace(korvattu, Mid(poistettavat, i, 1), "")
Next i
MsgBox teksti & " -> " & korvattuAntin ratkaisu toimi, mutta miten ihmeessä saisin pois vielä jäljelle jäävästä luvusta rivinvaihdon pois? Se jää sinne luvun jälkeen vielä, ja sotkee hieman erästä tiedostoa mihin luku tulee.
'joko
If merkki >= "0" And merkki <= "9" And merkki <> vbCrLf Then
uusi = uusi + merkki
End If
'tai
uusi = Replace(uusi, vbCrLf, "")BadSource kirjoitti:
'joko If merkki >= "0" And merkki <= "9" And merkki <> vbCrLf Then uusi = uusi + merkki End If 'tai uusi = Replace(uusi, vbCrLf, "")
Ei auttanut tuokaan, katsoin dossissa debuggerilla ja sen rivinvaihdon kohdalla oli 0D 0A. Tämän kun saisi ratkaistua niin homma olisi selvä.
Edit. Siis kun muuttujan tiedot tallennetaan .txt tiedostoon. .Txt tiedostoa debuggerilla katsottaessa tulee nuo 0D ja 0A rivinvaihdon kohdalla. Tuli mieleen ettei tuo tiedosto.writeline tee lopuksi jotain rivinvaihtoa?
Veikkaisin ongelman olevan siinä, miten tallennat tiedoston. Output lisää muistaakseni rivinvaihdon tallennettavan datan perään sinne tiedostoon, joten tiedosto täytyy avata binary muodossa ja sitten put:lla kirjottaa, jos et halua niitä rivinvaihtoja.
Gaxx kirjoitti:
Veikkaisin ongelman olevan siinä, miten tallennat tiedoston. Output lisää muistaakseni rivinvaihdon tallennettavan datan perään sinne tiedostoon, joten tiedosto täytyy avata binary muodossa ja sitten put:lla kirjottaa, jos et halua niitä rivinvaihtoja.
Voi olla, vielä jos voisitte antaa vinkkiä miten se avataan binary muodossa?
Open "tiedosto.txt" For Binary As #1
Put #1, , data
Close #1Ja lisätietoa: https://www.ohjelmointiputka.net/hak/?kieli=Visual Basic
Edit: Ja olinhan onnistunut lykkäämään koodiini virheen. Nyt toimii(testasin jopa :P).
vbCrLf on kahden tavun mittainen merkki joten yllä oleva koodi ei sitä voi huomata. Laita vbCrLf:n tilalle chr$(13) ja chr$(10) (muistaakseni). Siis kumpikin tsekattava erikseen.
Tallennuksessa rivinvaihdon voi välttää puolipisteellä ;
Mihin tuo puolipiste lykätään? Anteeksi, olen vasta parisen viikkoa väkertänyt tämän vb:n kanssa. :D
Sitten valittaa tuolla Binääriin kirjotettaessa File Access erroria. Luon tekstitiedoston johon kirjoitetaan FSO:lla.
edit. Minä varmaan teen tuon tiedoston luonnin jotenkin väärin. Hommahan menee näin: on c++ header tiedosto josta hommataan eräs rivi jossa on vaihteleva luku. Luen tiedoston muuttujaan, etsin oikean rivin InStr-funktiolla. Putsaan rivin puhtaaksi luvuksi. Sitten luon objFSO.CreateTextFile:llä tekstitiedoston johon kirjoitetaan luku.
Toivottavasti tuosta saa selvää mitä haetaan. :P
En tunne tuon FSO:n saloja. Kokeile perinteistä tapaa:
Open tiedosto For Output As 1 Print #1, numeroteksti; Close
Tuossa on kokonaisuudessaan se koodi mitä olen tehnyt, luultavasti se ei ole mitenkään kovin viisasta koodia mutta kyllä se toimii siihen asti kunnes se lykkää sen rivinvaihdon siihen tekstitiedostoon. Tämä versio ei tosin toimi edes, koska en osaa noita Open as Binary juttuja tehdä.
Sub Main()
Dim Polku
Polku = App.Path & "\PartProductInfo.h"
LuetaanTiedot CStr(Polku)
End Sub
Public Sub LuetaanTiedot(Polku As String)
Dim PartProInfo As String
Dim objFSO
Dim objFile
Dim i As Integer
Dim teksti As String
Dim korjattu As String
Dim tallennus As String
Dim Tila
Tila = False
Open Polku For Binary As #1
Do While Not EOF(1)
Get #1, , PartProInfo
If InStr(1, PartProInfo, "Etsittävä teksti") <> 0 Then
For i = 1 To Len(PartProInfo)
teksti = Mid(PartProInfo, i, 1)
If teksti >= "0" And teksti <= "9" Then
korjattu = korjattu + teksti
korjattu = Replace(korjattu, vbCrLf, "")
End If
Next
tallennus = App.Path & "\PartProTxt.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile(tallennus)
Tila = True
Else
End If
Loop
If Tila = True Then
Open tallennus For Output As #2
Put #2, , korjattu
End IfAleksiR kirjoitti:
Open tallennus For Output As #2 Put #2, , korjattu
Vaikuttaa vähän omituiselta riviltä. Kenties kannattaa vaihtaa outputin tilalle binary..
-Grey-
Huomasin saman, mutta valittaa edelleen Path/File access erroria. Vinkkejä otetaan vastaan.
Edit.
Homma siis tyssää tällä hetkellä tuohon vaiheeseen kun yritän kirjoittaa tuolla Putilla siihen tiedostoon joka luodaan.
Sulla jää tuo objFile auki varaamaan tuota luomaasi tiedostoa käyttöönsä, jolloin muilla ei ole siihen asiaa. Eli sulje se ennen kuin yrität kirjoittaa tiedostoon.
objFile.Close
Todella paljon kiitoksia kaikille! BadSourcen vinkin avulla sain homman vietyä loppuun. Ei näy rivinvaihtoa notepadissa eikä dossissa debugilla. :)
Vielä tarvitsen eräässä jutussa apua. Ohjelma kyllä toimii niinkuin pitää, mutta heittää "Run-time error '62': Input past end of file". Mikäköhän tässä mättää nyt? Laitan vielä koko koodin tuohon:
Edit: Googlella sain selville että tämä voisi johtua tuosta kun sitä rivinvaihtoa ei ole rivin lopussa, mutta kun sen on oltava pois sieltä että homma toimii niinkuin pitää.
Sub Main()
Dim Polku
Polku = App.Path & "\PartProductInfo.h"
LuetaanTiedot CStr(Polku)
End Sub
Public Sub LuetaanTiedot(Polku As String)
Dim PartProInfo As String
Dim objFSO
Dim objFile
Dim i As Integer
Dim teksti As String
Dim korjattu As String
Dim tallennus As String
Dim Tila
Tila = False
Open Polku For Binary As #1
Do While Not EOF(1)
Line Input #1, PartProInfo
If InStr(1, PartProInfo, "Etsittävä teksti") <> 0 Then
For i = 1 To Len(PartProInfo)
teksti = Mid(PartProInfo, i, 1)
If teksti >= "0" And teksti <= "9" Then
korjattu = korjattu + teksti
korjattu = Replace(korjattu, vbCrLf, "")
End If
Next
tallennus = App.Path & "\PartProTxt.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile(tallennus)
objFile.Close
Open tallennus For Binary As #2
Put #2, , korjattu
Else
End If
Loop
Close #1
End SubMihin riviin ohjelman suoritus pysähtyy, kun tuo virheilmoitus tulee?
BadSource kirjoitti:
Mihin riviin ohjelman suoritus pysähtyy, kun tuo virheilmoitus tulee?
Pysähtyy Line Inputtiin.
Edit: msdn:stä luin että tämä errori tulee kun käytetään EOF-funktiota binäärinä avattuun tiedostoon. Kun ohjelman kääntää exe-muotoon, se toimii kyllä mutta tuo errori vaan häiritsee. Saisiko sen jotenkin blokattua?
Edit2: yritin GETillä lukea tiedoston muuttujaan, mutta ei toimi.
Avaa se Input-moodissa eikä Binääri-moodissa kun käytät Line Inputtia.
Polkua ei tarvitse avata binäärinä, jos sieltä kerran luetaan tietoaja. Vasta tallennuksessa avataan binäärinä. Ilmeisesti tänään on hyvä päivä, sillä korjasin samaan hintaan tuon koko LuetaanTiedot sub:n.
Public Sub LuetaanTiedot(Polku As String)
Dim PartProInfo As String
Dim objFSO As Variant
Dim objFile As Variant
Dim i As Integer
Dim teksti As String
Dim korjattu As String
Dim tallennus As String
Open Polku For Input As #1
Do While Not EOF(1)
Line Input #1, PartProInfo
If InStr(1, PartProInfo, "Etsittävä teksti") <> 0 Then
For i = 1 To Len(PartProInfo)
teksti = Mid(PartProInfo, i, 1)
If teksti >= "0" And teksti <= "9" Then
korjattu = korjattu + teksti
End If
Next
'korjattu = Replace(korjattu, vbCrLf, "") <-turha, sillä korjattu sisältää vain numeroita
tallennus = App.Path & "\PartProTxt.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile(tallennus)
objFile.Close
Open tallennus For Binary As #2
Put #2, , korjattu
Close #2
'voisiko tässä olla Exit Do, jos Etsittävä teksti kerran jo löytyi
'ja tiedon tallennus binäärinä korvaa aikeisemmin löydetyn?
End If
Loop
Close #1
End SubKiitos taas BadSource ja muut. Itseasiassa minä tässä jo itsekseni korjasin tuon lukemisen takaisin Inputiksi, mutta se valitti tuota erroria silti, sitten kokeilin käynnistää vb:n uusiks niin nyt toimii. :)
Kiitos taas kerran.
Aihe on jo aika vanha, joten et voi enää vastata siihen.