Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Muuttujasta pelkät numerot ulos?

Sivun loppuun

AleksiR [16.03.2006 07:32:49]

#

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!

Antti Laaksonen [16.03.2006 08:09:57]

#

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ä.

BadSource [16.03.2006 08:40:09]

#

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

AleksiR [16.03.2006 09:41:40]

#

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.

BadSource [16.03.2006 09:49:01]

#

'joko
If merkki >= "0" And merkki <= "9" And merkki <> vbCrLf Then
    uusi = uusi + merkki
End If
'tai
uusi = Replace(uusi, vbCrLf, "")

AleksiR [16.03.2006 09:57:25]

#

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?

Gaxx [16.03.2006 10:04:48]

#

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.

AleksiR [16.03.2006 10:07:47]

#

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?

Gaxx [16.03.2006 10:09:27]

#

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).

setä [16.03.2006 10:09:46]

#

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ä ;

AleksiR [16.03.2006 10:35:32]

#

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

setä [16.03.2006 11:01:42]

#

En tunne tuon FSO:n saloja. Kokeile perinteistä tapaa:

Open tiedosto For Output As 1
Print #1, numeroteksti;
Close

AleksiR [16.03.2006 11:16:30]

#

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

Grey [16.03.2006 11:38:02]

#

AleksiR kirjoitti:

Open tallennus For Output As #2
Put #2, , korjattu

Vaikuttaa vähän omituiselta riviltä. Kenties kannattaa vaihtaa outputin tilalle binary..

-Grey-

AleksiR [16.03.2006 11:41:41]

#

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.

BadSource [16.03.2006 12:21:10]

#

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

AleksiR [16.03.2006 12:34:33]

#

Todella paljon kiitoksia kaikille! BadSourcen vinkin avulla sain homman vietyä loppuun. Ei näy rivinvaihtoa notepadissa eikä dossissa debugilla. :)

AleksiR [17.03.2006 07:36:44]

#

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

BadSource [17.03.2006 07:53:17]

#

Mihin riviin ohjelman suoritus pysähtyy, kun tuo virheilmoitus tulee?

AleksiR [17.03.2006 07:56:38]

#

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.

setä [17.03.2006 08:59:50]

#

Avaa se Input-moodissa eikä Binääri-moodissa kun käytät Line Inputtia.

BadSource [17.03.2006 09:01:53]

#

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

AleksiR [17.03.2006 09:34:23]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta