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 uusi
Tä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 & " -> " & korvattu
Antin 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 #1
Ja 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 If
AleksiR 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 Sub
Mihin 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 Sub
Kiitos 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.