Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB6] Tiedoston merkkijonon manipulointi (VBA)

Sivun loppuun

rautamiekka [01.09.2009 20:43:45]

#

Tiedän ettette millään kirveellä opettaisi laistani joka ei itse oppinut asioita, joten en pyydä sitä. Tarvitsen ohjelman joka lukee ini-tiedoston tietoonsa, etsii tiettyä tietoa ja muuttaa sen.

Itse tekisin graafisen puolen niin helposti että
1) valitaan luettava tiedosto valintaikkunalla
2) kysytään inputboxilla mitä haetaan
3) kysytään inputboxilla mihin muutetaan
4) kirjoitetaan kaikki takaisin luettavaan tiedostoon

Grez [01.09.2009 21:43:01]

#

Kyllä ainakin itse mieluummin opetan kuin annan valmista ohjelmaa.

Metabolix [01.09.2009 21:43:45]

#

Oppimisessa pitäisi olla enemmän kyse sinusta itsestäsi kuin meistä muista. Valmista opiskelumateriaalia on netti pullollaan.

neau33 [01.09.2009 23:27:53]

#

MORO rautamiekka!

tässä sulle simppeliä valmispaskaa...

Sub Form_Load()
   NaytaTaiPiilota_Kontrollit
End Sub

Private Sub Command1_Click()

   If Command1.Caption = "TIEDOT?" Then
      NaytaTaiPiilota_Kontrollit
      Command1.Caption = "PÄIVITÄ"
      Command1.Enabled = False
      Exit Sub
   End If

   With CommonDialog1
      .CancelError = True
      .Action = 1
      .DialogTitle = "Avaa tiedosto"
      .FileName = ""
      .Filter = "Asetustiedostot (*.ini)|*.ini"
      .InitDir = App.Path
      .ShowOpen
      If Dir(.Filename) = "" Then
         NaytaTaiPiilota_Kontrollit: Exit Sub
      End If
   End With

   Dim filuStr As String
   On Error Resume Next
   Open CommonDialog1.FileName For Input As #1
   filuStr = Input$(LOF(1),1): Close #1

   If InStr(filuStr, Text1.Text) = 0 Then
      xmsg& = MsgBox(Tiedosto:" & CommonDialog1.FileName _
      & " ei sisällä tälaista tietoa!", vbYesNo, "Tahdotko jatkaa?")

      Select Case xmsg&
         Case 1
            Text1.Text = "": Text2.Text = ""
         Case Else
            filuStr = "": apuStr = ""
            NaytaTaiPiilota_Kontrollit
      End Select

      Exit Sub

   End If

   Dim alku As integer, apuStr As String, i As Integer
   alku = InStr(filuStr, Text1.Text)

   For i = alku To Len(filuStr)
      If Mid(filuStr, i, 1) = Chr(13) Then Exit For
      apuStr = apuStr & Mid(filuStr, i, 1)
   Next i

   filuStr = Replace(filuStr, apuStr, Text2.Text)
   Open CommonDialog1.FileName For Output AS #1
   Print #1, filuStr: Close #1
   MsgBox " Tiedosto " & _
   CommonDialog1.FileName & " on päivitetty"
   filuStr = "": apuStr = ""
   NaytaTaiPiilota_Kontrollit

End Sub

Private Sub Text1_Change()
   TsekkaaBoxienTila
End Sub

Private Sub Text2_Change()
   TsekkaaBoxienTila
End Sub

Private Sub TsekkaaBoxienTila()

   If Text1.Text = "" Or Text2.Text = "" Then
       Command1.Enabled = False
   ElseIf Text1.Text <> "" And Text2.Text <> "" Then
       Command1.Enabled = True
   End If

End Sub

Private Sub NaytaTaiPiilota_Kontrollit()

   Dim i As Integer

   For i = 1 To 2
      With Me.Controls("Text" & CStr(i))
        .Text = ""
        .Enabled = Not .Enabled
        .Visible = Not .Visible
      End With
   Next i

   If Command1.Caption <> "TIEDOT?" Then
      Command1.Caption = "TIEDOT?"
      Command1.Enabled = True
   End If

End Sub

rautamiekka [02.09.2009 11:42:52]

#

Kiitokset koodista Nea :) Siinä kuitenkin on monta virhettä, enkä tiedä pitäisikö listata ne vai jättää listaamatta.

neau33 [02.09.2009 12:15:44]

#

MORO rautamiekka!

Olen poistanut VB6:n koneeltani, joten en voinut testata...tässä kuitenkin testattu VBA-versio
(vain malli tiedoston merkkijonon manipuloimisesta)

testi.ini:

asetus1 = 12345
asetus2 = 67890
asetus3 = "jotain tekstiä"
asetus4 = "jotain muuta tekstiä"
asetus5 = "jotain muuta tekstiä"
asetus6 = &H0C
asetus7 = #FFFFFF#

VBA Projekti
UserForm1:

Sub UserForm_Activate()

   Static loaded As Boolean
   If Not loaded Then
      loaded = True
      NaytaTaiPiilota_Kontrollit
   End If

End Sub

Private Sub CommandButton1_Click()

   If CommandButton1.Caption = "TIEDOT?" Then
      NaytaTaiPiilota_Kontrollit
      CommandButton1.Caption = "TIEDOSTO"
      CommandButton1.Enabled = False
      Exit Sub
   End If

   Dim FileName As String

   With Application.FileDialog(msoFileDialogOpen)

      .Title = "Avaa tiedosto"
      .AllowMultiSelect = False
      .Filters.Clear
      .Filters.Add "Asetustiedostot (*.ini)", "*.ini"
      .FilterIndex = 1
      .Show

      If .SelectedItems.Count = 0 Then
         NaytaTaiPiilota_Kontrollit
         Exit Sub
      End If

      FileName = .SelectedItems(1)

   End With

   Dim filuStr As String
   Dim apuStr As String
   On Error Resume Next
   Open FileName For Input As #1
   filuStr = Input$(LOF(1), 1): Close #1

   If InStr(filuStr, TextBox1.Text) = 0 Then

      xmsg& = MsgBox("Tiedosto:" & _
      CommonDialog1.FileName _
      & " ei sisällä tälaista tietoa!", _
      vbYesNo, "Tahdotko jatkaa?")

      Select Case xmsg&
         Case 1
            TextBox1.Text = "": TextBox2.Text = ""
         Case Else
            filuStr = "": apuStr = ""
            NaytaTaiPiilota_Kontrollit
      End Select

      Exit Sub

   End If

   Dim alku As Integer, i As Integer
   alku = InStr(filuStr, TextBox1.Text)

   For i = alku To Len(filuStr)
      If Mid(filuStr, i, 1) = Chr(13) Then Exit For
      apuStr = apuStr & Mid(filuStr, i, 1)
   Next i
   MsgBox apuStr
   filuStr = Replace(filuStr, apuStr, TextBox2.Text)
   Open FileName For Output As #1
   Print #1, filuStr: Close #1
   MsgBox " Tiedosto " & _
   FileName & " on päivitetty"
   filuStr = "": apuStr = ""
   NaytaTaiPiilota_Kontrollit

End Sub

Private Sub TextBox1_Change()
   TsekkaaBoxienTila
End Sub

Private Sub TextBox2_Change()
   TsekkaaBoxienTila
End Sub

Private Sub TsekkaaBoxienTila()

   If TextBox1.Text = "" Or TextBox2.Text = "" Then
      CommandButton1.Enabled = False
   ElseIf TextBox1.Text <> "" And TextBox2.Text <> "" Then
      CommandButton1.Enabled = True
   End If

End Sub

Private Sub NaytaTaiPiilota_Kontrollit()

   Dim i As Integer

   For i = 1 To 2
     With Me.Controls("TextBox" & CStr(i))
      .Text = ""
      .Enabled = Not .Enabled
      .Visible = Not .Visible
     End With
   Next i

   If CommandButton1.Caption <> "TIEDOT?" Then
     CommandButton1.Caption = "TIEDOT?"
     CommandButton1.Enabled = True
   End If

End Sub

Testaus:

1 copy/pasteta testi-matsku muistioon ja tallenna esim. nimellä:
testi.ini

2 klikkaa Komentopainiketta

3 kirjoita TextBox1:een esim.
asetus2

4 kirjoita TextBox2:een
asetus2 = 100001

5 klikkaa uudestaan Komentopainiketta

6 etsi ja valitse dialogilla tallentamasi .ini-tiedosto...

7 avaa .ini tiedosto muistiolla ja tsekkaa tapahtuiko mitään...

jalski [02.09.2009 12:33:28]

#

Jos ei ole pakottavaa tarvetta omalle ohjelmalle tai graafiselle käyttöliittymälle, niin tuollaisiin on näppärä käyttää AWK:ta.

neau33 [02.09.2009 18:45:28]

#

MORJENS taas rautamiekka!

tässä hieman edellistä edistyneempi härpäke .ini tiedoston käpistelyyn...

Testi asetustiedosto: (test.ini)

[settings1]
setting1 = 00000
setting2 = 67890
[settings2]
setting1 = "ABCDE"
setting2 = "EFGHI"
[settings3]
setting1 = &H0C
setting2 = &FF
[settings4]
setting1 = #111111#
setting2 = #222222#

VBA projekti (INI_EDIT.xls)
UserForm1:

' Formille:
' 1 tekstiloota - (TextBox1)
' 2 nappia      - (CommndButton1 & CommndButton2)
' 2 comboboxia  - (ComboBox1 & ComboBox2)

Dim FileStr As String
Dim FileStrArray() As String
Dim CboStrArray() As String
Dim cbo1Index As Integer
Dim cbo2Index As Integer
Dim FileName As String

Private Sub UserForm_Activate()

   Static loaded As Boolean

   If Not loaded Then

      loaded = True
      ComboBox1.Style = fmStyleDropDownList
      ComboBox2.Style = fmStyleDropDownList
      ComboBox1.Visible = False
      ComboBox2.Visible = False
      TextBox1.Visible = False
      CommandButton2.Visible = False

   End If

End Sub

Private Sub ComboBox1_Change()

   TextBox1.Text = ""
   ComboBox2.ListIndex = -1

   If ComboBox1.ListIndex > -1 Then
      cbo1Index = ComboBox1.ListIndex
      ComboBox2.Visible = True
      Dim list() As String
      list = Split(CboStrArray(cbo1Index), "|")
      ComboBox2.list = list
   Else
      TextBox1.Visible = False
      ComboBox2.Clear
      ComboBox2.Visible = Flase
   End If

End Sub

Private Sub ComboBox2_Change()

   TextBox1.Text = ""
   If ComboBox2.ListIndex > -1 Then
      cbo2Index = ComboBox2.ListIndex
      TextBox1.Visible = True
   Else
      TextBox1.Visible = False
   End If

End Sub

Private Sub CommandButton1_Click()

   FileName = ""

   With Application.FileDialog(msoFileDialogOpen)

      .Title = "Avaa tiedosto"
      .AllowMultiSelect = False
      .Filters.Clear
      .Filters.Add "Asetustiedostot (*.ini)", "*.ini"
      .FilterIndex = 1
      .Show

      If .SelectedItems.count = 0 Then
         Exit Sub
      End If

      FileName = .SelectedItems(1)

   End With

   Open FileName For Input As #1
   FileStr = Input$(LOF(1), 1): Close #1

   Erase CboStrArray

   If InStr(FileStr, "]") = 0 Then
      FileStr = ""
      MsgBox "Asetustiedoston muoto on viheellinen", _
      vbExclamation, "Error Message"
      Exit Sub
   End If

   FileStr = Replace(FileStr, vbCrl & vbCrLf, vbCrLf)

   If Left(FileStr, 2) = vbCrLf Then
      FileStr = Right(FileStr, Len(FileStr) - 2)
   End If

   FileStrArray = Split(FileStr, vbCrLf)
   FileStr = ""

   Dim arrayLen As Long
   arrayLen = UBound(FileStrArray)
   ComboBox1.Clear
   ComboBox2.Clear
   ComboBox1.Visible = True

   For i = LBound(FileStrArray) To arrayLen

      If InStr(FileStrArray(i), "[") > 0 Then

         ComboBox1.AddItem Replace(Replace( _
         FileStrArray(i), "[", ""), "]", "")

         Dim ChkArray As Long
         On Error Resume Next
         ChkArray = UBound(CboStrArray)
         If Err <> 0 Then
            Err.Clear
            On Error GoTo 0
            ReDim CboStrArray(0)
         Else
            ReDim Preserve CboStrArray(UBound(CboStrArray) + 1)
         End If

         For j = i + 1 To arrayLen
            If InStr(FileStrArray(j), "[") > 0 Then Exit For
            If CboStrArray(UBound(CboStrArray)) <> "" Then
               CboStrArray(UBound(CboStrArray)) = _
               CboStrArray(UBound(CboStrArray)) & "|"
            End If
            CboStrArray(UBound(CboStrArray)) = _
            CboStrArray(UBound(CboStrArray)) & FileStrArray(j)
         Next j

      End If

   Next i

   Erase FileStrArray

End Sub

Private Sub TextBox1_Change()

   If TextBox1.Text <> "" Then
      CommandButton2.Visible = True
   Else
      CommandButton2.Visible = False
   End If

End Sub

Private Sub CommandButton2_Click()

   If TextBox1.Text <> "" Then

      CboStrArray(cbo1Index) = _
      Replace(CboStrArray(cbo1Index), _
      ComboBox2.list(cbo2Index), TextBox1.Text)
      Dim i As Long

      For i = 0 To ComboBox1.ListCount - 1
         FileStr = FileStr & _
         "[" & ComboBox1.list(i) & "]" & _
         vbCrLf & Replace( _
         CboStrArray(i), "|", vbCrLf) _
         & vbCrLf
      Next i

      Open FileName For Output As #1
      Print #1, FileStr
      Close #1: FileStr = "": TextBox1.Text = ""
      ComboBox2.Clear: ComboBox1.ListIndex = -1
      cbo1Index = -1: cbo2Index = -1

   End If

End Sub

jalski [02.09.2009 21:00:20]

#

Edelliseen postiini viitaten, AWK:n avulla esim. näin helposti:

testi.ini

arvo1 = true
arvo2 = false
arvo3 = true

Jos haluaisin muuttaa arvo2:n false arvosta true:
komentoriviltä:

cat testi.ini | awk '/arvo2/ { gsub(/false/, "true") }; { print }' >muokattu.ini

Sivun alkuun

Vastaus

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

Tietoa sivustosta