Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-08 09:34:56 - Mats Adolphsson, i forum visual basic - allmänt, Tråden har 27 Kommentarer och lästs av 1146 personer

Hej!

Jag håller på med ett projekt där jag bl.a. vill filtrera en textfil genom att ange en kombination och se om den finns med. Textfilen är en "databas" och består av 8 kolumner med ett mellanslag mellan varje.

Jag har kommit fram till en kodbit som jag skulle behöva lite förslag och åsikter på.

För det första, verkar detta vara ett fungerande och bra upplägg för att få ut de olika kolumnernas värden i 'SPNNumber', 'PGNNumber' etc?
För det andra, hur lyckas jag få dessa 8 värden att skrivas ut i en listview (som jag kallar 'lvResults'), gärna i 8 kolumner med olika kolumnnamn?

MVH
/M

'The actual sub that will search the file for the combinations in strCombos().
Private Sub FindCombo(FilePath As String)

    Dim intFF As Integer
    Dim strLine As String
    Dim lonSpacePos As Long
    Dim strLineFull As String
    Dim strArray() As String
    Dim PGNPos As Integer
    Dim Resolution As Integer
    Dim Offset As Integer
    Dim PGNNumber As String
    Dim lonLineCounter As Long
    Dim intI As Integer
    Dim SPNNumber As String
    Dim DataLength As Integer
    Dim Unit As String
    Dim Description As String

    With lvResults
        .ListItems.Clear
        'Get available file handle.
        intFF = FreeFile
        'Open file.
        Open FilePath For Input As #intFF
            'Clear any previous items.
            .ListItems.Clear
            'Keep looping until we get to End Of File (EOF).
            Do While Not EOF(intFF)
                'Get the current line from file and put it into strLine.
                Line Input #intFF, strLine
                strLineFull = strLine


                If Len(strLine) > 0 Then 'Make sure it isn't an empty line.
                    'Get text from start to before the first space
                    'This will give us the combination.
                    lonSpacePos = InStr(1, strLine, " ")
                    If lonSpacePos > 0 Then
                        strLine = Mid$(strLine, 1, lonSpacePos - 1)
                        'We now have the combination in strLine.
                        'Check if it is in the list.
                        If ComboInList(strLine) Then   'ComboInList is a function
                             strArray = Split(strLineFull, " ")
                             If UBound(strArray) > 7 Then
                                 For intI = 8 To UBound(strArray)
                                     strArray(7) = strArray(7) & " " & strArray(intI)
                                     Next intI
                             End If
                        SPNNumber = Right(strArray(0), 4)
                        PGNNumber = Right(strArray(1), 4)
                        PGNPos = CInt(strArray(2))
                        DataLength = CInt(strArray(3))
                        Resolution = CInt(strArray(4))
                        Offset = CInt(strArray(5))
                        Unit = CInt(strArray(6))
                        Description = CInt(strArray(7))
                        .ListItems.Add , , PGNNumber
                        
                        
                        End If
                    End If
                 End If
            Loop
        Close #intFF
    End With
End Sub


'Checks if a combination exists in the array.
Private Function ComboInList(Combination As String) As Boolean
    Dim lonLoop As Long, lonUB As Long
    Dim strToComp As String

    strToComp = LCase$(Mid$(Combination, 3, 4))
    lonUB = SafeUBString(strCombos())

    For lonLoop = 0 To lonUB
        If LCase$(strCombos(lonLoop)) = strToComp Then
            ComboInList = True
            Exit For
        End If
    Next lonLoop

End Function


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-08 12:40:35 - Sven Åke Persson

Gör detta i design läge
Sätt din lvResultat i <b> View = 3- lvwReport</b> (Rapportmod)
Clicka med högerknappen i lvResultat och Properties.

Tab ColumnHeader:
Editera dina kolumner <b> Insert Column</b> justera deras Width.
<b>
1 SPNNumber
2 PGNNumber
3 PGNPos
4 DataLength
5 Resolution
6 Offset
7 Unit
8 Description</b>

Sedan läger du in denna kod i loopen på lämpligt ställe.
<code>
Dim mItem As Variant
Set mItem = .ListItems.Add()
mItem.Text = Right$(strArray(0), 4)
mItem.SubItems(1) = Right$(strArray(1), 4)
mItem.SubItems(2) = strArray(2)
mItem.SubItems(3) = strArray(3)
mItem.SubItems(4) = strArray(4)
mItem.SubItems(5) = strArray(5)
mItem.SubItems(6) = strArray(6)
mItem.SubItems(7) = strArray(7)
</code>


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-08 13:08:43 - Sven Åke Persson

Det bör vara här: Alla Integer skall vara Long
I VB6 använder Vi inte Integer (16 bit) längre, använd Long (32 bit)
I alla moderna språk är numera Integer det Vi kallar Long
<code>
Private Sub FindCombo(FilePath As String)
Dim intFF As Long
Dim strLine As String
Dim lonSpacePos As Long
Dim strLineFull As String
Dim strArray() As String
Dim PGNPos As Long
Dim Resolution As Long
Dim Offset As Long
Dim PGNNumber As String
Dim lonLineCounter As Long
Dim intI As Long
Dim SPNNumber As String
Dim DataLength As Long
Dim Unit As String
Dim Description As String
Dim mItem As Variant 'tillhör lvResultat
'**********************************************
If ComboInList(strLine) Then 'ComboInList is a function
strArray = Split(strLineFull, " ")
If UBound(strArray) > 7 Then
For intI = 8 To UBound(strArray)
strArray(7) = strArray(7) & " " & strArray(intI)
Next 'intI
End If ' UBound
Set mItem = .ListItems.Add()
mItem.Text = Right$(strArray(0), 4)
mItem.SubItems(1) = Right$(strArray(1), 4)
mItem.SubItems(2) = strArray(2)
mItem.SubItems(3) = strArray(3)
mItem.SubItems(4) = strArray(4)
mItem.SubItems(5) = strArray(5)
mItem.SubItems(6) = strArray(6)
mItem.SubItems(7) = strArray(7)
</code>


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-08 14:24:14 - Mats Adolphsson

Hej, och ett stort TACK Sven Åke!

Det var till stor hjälp för mig! Man lär sig något nytt varje dag!

MVH
/M


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-08 16:53:51 - Sven Åke Persson

Braaaaaaa kul att mina förslag faller i god jord.

För att vara riktigt proffsig,
glöm inte att sätta <b>Aligment</b> Left och Right justify på ett snyggt värde.

Ang Integer gäller bara program som du själv skriver.
Du får inte ändra i API argument om dom vill ha Integer.


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-10 08:55:49 - Mats Adolphsson

Hej igen!

Du har återigen hjälpt mig förstå saker och ting på ett bra sätt, TACK! Kolumnerna blev jättebra! Men jag har tyvärr gjort något mer fel, och jag blir tokig efterson jag inte lyckas komma på vad det är....så om någon vänlig har lust att ta en titt och se om ni kan klura ut vad som är galet skulle jag bli otroligt tacksam!

Jag har en ListBox med en kombination (t.ex. SPN190) som jag vill "filtrera" en textfil med.
Jag klickar på en sökknapp 'cmdFind' för att öppna och filtrera en textfil, för att sedan skriva ut hela den aktuella raden i en ListView 'lvResults'. Problemet är att inget kommer upp i lvResults...!

MVH
/M

<CODE>Private Sub cmdFind_Click()

On Error GoTo ErrorHandler

If lstCombo.ListCount = 0 Then
MsgBox "Please enter some combinations to search for", vbExclamation
Exit Sub
End If

With objCD
.CancelError = True
.DialogTitle = "Open File"
.Filter = "Text Files (*.txt)|*.txt"
.ShowOpen

InitCombos

If Len(.Filename) > 0 Then
FindCombo .Filename
End If

End With
Exit Sub
ErrorHandler:
End Sub
'-------------------------------------------------------
'ListBox to strCombos() array.
Private Sub InitCombos()

Dim intLoop As Long

ReDim strCombos(0 To lstCombo.ListCount - 1) As String

For intLoop = 0 To lstCombo.ListCount - 1
strCombos(intLoop) = lstCombo.List(intLoop)
Next intLoop

End Sub
'--------------------------------------------------------------
'Checks if a combination exists in the array.
Private Function ComboInList(Combination As String) As Boolean
Dim lonLoop As Long, lonUB As Long
Dim strToComp As String

strToComp = LCase$(Left$(Combination, 6))
lonUB = SafeUBString(strCombos())

For lonLoop = 0 To lonUB
If LCase$(strCombos(lonLoop)) = strToComp Then
ComboInList = True
Exit For
End If
Next lonLoop

End Function
'------------------------------------------------------------------------
'The actual sub that will search the file for the combinations in strCombos().
Private Sub FindCombo(FilePath As String)

Dim intFF As Long
Dim strLine As String
Dim lonSpacePos As Long
Dim strLineFull As String
Dim strArray() As String
Dim PGNPos As Long
Dim Resolution As Long
Dim Offset As Long
Dim PGNNumber As String
Dim lonLineCounter As Long
Dim intI As Long
Dim SPNNumber As String
Dim DataLength As Long
Dim Unit As String
Dim Description As String
Dim mItem As Variant 'belongs to lvResults

With lvResults
.ListItems.Clear
'Get available file handle.
intFF = FreeFile
'Open file.
Open FilePath For Input As #intFF
'Clear any previous items.
.ListItems.Clear
'Keep looping until we get to End Of File (EOF).
Do While Not EOF(intFF)
'Get the current line from file and put it into strLine.
Line Input #intFF, strLine
strLineFull = strLine


If Len(strLine) > 0 Then 'Make sure it isn't an empty line.
'Get text from start to before the first space
'This will give us the combination.
lonSpacePos = InStr(1, strLine, " ")
If lonSpacePos > 0 Then
strLine = Mid$(strLine, 1, lonSpacePos - 1)
'We now have the combination in strLine.
'Check if it is in the list.
If ComboInList(strLine) Then 'ComboInList is a function
strArray = Split(strLineFull, " ")
If UBound(strArray) > 7 Then
For intI = 8 To UBound(strArray)
strArray(7) = strArray(7) & " " & strArray(intI)
Next intI
End If

SPNNumber = Right(strArray(0), 4)
PGNNumber = Right(strArray(1), 4)
PGNPos = CInt(strArray(2))
DataLength = CInt(strArray(3))
Resolution = CInt(strArray(4))
Offset = CInt(strArray(5))
Unit = CInt(strArray(6))
Description = CInt(strArray(7))

'Get the result in the ListView lvResults
Set mItem = .ListItems.Add()
'mItem.Text = Right$(strArray(0), 4)
mItem.Text = strArray(0)
'mItem.SubItems(1) = Right$(strArray(1), 4)
mItem.SubItems(1) = strArray(1)
mItem.SubItems(2) = strArray(2)
mItem.SubItems(3) = strArray(3)
mItem.SubItems(4) = strArray(4)
mItem.SubItems(5) = strArray(5)
mItem.SubItems(6) = strArray(6)
mItem.SubItems(7) = strArray(7)


End If
End If
End If
Loop
Close #intFF
End With
End Sub</CODE>


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-10 17:58:07 - Sven Åke Persson

Ok skall kolla noga.

1. Detta skall inte vara med i den nya lösningen.
Har du aldrig fått ut något i lstResultat ? Obs View Rapportmode (3)
Förstår inte riktigt varför du måste gå över ListBoxen ?
eller så är det den som är grundursprunget från en databas eller ?

Edit: Ahaaaaaaa du vill välja alla rader i TextBoxen som har ex. SPN190 i sig (står först ?)

<code>
SPNNumber = Right(strArray(0), 4)
PGNNumber = Right(strArray(1), 4)
PGNPos = CInt(strArray(2))
DataLength = CInt(strArray(3))
Resolution = CInt(strArray(4))
Offset = CInt(strArray(5))
Unit = CInt(strArray(6))
Description = CInt(strArray(7))
</code>


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-10 18:42:07 - Mats Adolphsson

Hej,

Med detta förslag på lösning har jag tyvärr aldrig fått ut något resultat i lvResults. Rapportmode är OK!

Varför jag går över Listboxen är följande: Med en annan knapp kan jag välja det SPN-nummer som jag är intresserad av och lägga in det i just denna ListBox. Varje SPN-nummer representerar en nod (eller pryl, t.ex. bränslemätare, oljetryck etc.) i en motor. Textfilen som jag vill filtrera efter sökt SPN-nummer är en slags databas med mer information om just detta SPN-nummer som jag vill ha ut i lvResults. Varje SPN-nummer finns bara med en gång.

Påverkar koden du pratar om ovan utskriften? Jag trodde jag kunde plocka ut värdena här för att kunna använda dom i ett nästa och senare steg!?

MVH
/M


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-10 19:32:53 - Andreas Hillqvist

Lägg din data i ett databas eller åtminstonde i ett recordset.
Där har du inbygda funktionen för att fliterar och sortera.

Du behöver då bara då läsa textfilen en gång, då du importerar den till databasen, eller öppnar programmet. Du behöver då inte läsa filen vid varje sökning.

Detta gör att koden blir lättar att underhålla.


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-10 20:41:13 - Andreas Hillqvist

Här visa hur du fyller ett recordset:

Option Explicit

Public Function OpenFile(FilePath As String) As ADODB.Recordset
Dim F As ADODB.Field
Dim rs As ADODB.Recordset
Dim I As Long
Dim FileNo As Long
Dim strLine As String
Dim strArray() As String

    Set rs = New ADODB.Recordset
    With rs.Fields
        .Append "SPN-number", adVarChar, 10
        .Append "PGN-number", adVarChar, 10
        .Append "PGN-position", adInteger
        .Append "Data Length", adInteger
        .Append "Resolution", adDouble
        .Append "Offset", adInteger
        .Append "Unit", adVarChar, 10
        .Append "Description", adVarChar, 50
    End With
    rs.Open
    
    'Get available file handle.
    FileNo = FreeFile()
    
    'Open file.
    Open FilePath For Input As #FileNo
    
    'Keep looping until we get to End Of File (EOF).
    Do While Not EOF(FileNo)
        'Get the current line from file and put it into strLine.
        Line Input #FileNo, strLine
        
        If Len(strLine) > 0 Then 'Make sure it isn't an empty line.
            strArray = Split(strLine, " ", 8)
            rs.AddNew
            For I = 0 To 7
                rs(I) = strArray(I)
            Next
            rs.Update
        End If
    Loop
    Close #FileNo
        
    Set OpenFile = rs
End Function


Följande kod är genrell för att ladda kolumnheaders från ett recordset:
Public Sub LoadColumnHeaders(ColumnHeaders As ColumnHeaders, Fields As ADODB.Fields)
Dim F As ADODB.Field
Dim Header As ColumnHeader
    For Each F In Fields
        Set Header = ColumnHeaders.Add(, , F.Name)
    Next
End Sub


Följande kod är genrell för att ladda items från ett recordset:
Public Sub LoadListItems(ListItems As ListItems, rs As ADODB.Recordset, TextField As ADODB.Field)
Dim F As ADODB.Field
Dim Item As ListItem
    If rs.EOF And rs.BOF Then
    Else
        rs.MoveFirst
        Do
            Set Item = Nothing
            For Each F In rs.Fields
                If Item Is Nothing Then
                    Set Item = ListItems.Add(, , TextField.Value)
                Else
                    Item.ListSubItems.Add , , F.Value
                End If
            Next
            rs.MoveNext
        Loop Until rs.EOF
    End If
End Sub


Eftersom denna kod inte är knyten till någon kontroll kan du lägga den i en modul. På så sätt anropa den från fler än ett formulär.

Tillsamans med den tidigare koden har jag gjort ett litet "Serch while you type" exempel:
Private rs As ADODB.Recordset

Private Sub Form_Load()
    Set rs = OpenFile(App.Path & "\PGN-nummers.txt")
    LoadColumnHeaders ListView1.ColumnHeaders, rs.Fields
End Sub

Private Sub Text1_Change()
    If Len(Text1.Text) Then
        rs.Filter = "[SPN-Number] Like '" & Replace(Text1.Text, "'", "''") & "*'"
    Else
        rs.Filter = adFilterNone
    End If
    
    ListView1.ListItems.Clear
    LoadListItems ListView1.ListItems, rs, rs("SPN-number")
End Sub

Exemplet förutsätter att filen ligger i aktuell katalog som exefilen och heter PGN-nummers.txt. Men detta kan ändras.

Du kan oxå mycket lätt lägga in sortering vid kolumn klick:
<code>
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
If rs.Sort = ColumnHeader.Text Then
rs.Sort = ColumnHeader.Text & " DESC"
Else
rs.Sort = ColumnHeader.Text
End If

ListView1.ListItems.Clear
LoadListItems ListView1.ListItems, rs, rs("SPN-number")
End Sub
</code>
Detta kan kompleteras med en imagelist kopplad till kolumnheaders för att visa vilken kolumn den sorterar på och om det är fallande eller stigande ordning.


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-11 08:28:50 - Sven Åke Persson

Andreas förslag är helt Ok men "overkill" för detta projekt.
Vi håller fast vid din grundlösning den är helt Ok.

Behåll din första lösning , den jag ville ta bort,så gör Vi en koll på detta.
Nu bör lvResultat absolut fyllas upp med värde.

Om inte MsgBox kommer upp nu med 3 värde får Vi söka felet längre upp
Felet är inte så stort Vi fixar det idag.
Efter som du säger att tex SPN190 bara kan komma 1 gg så verkar loopen onödig.
Men Ok Vi tar steg för steg.
<code>
SPNNumber = Right$(strArray(0), 4)
PGNNumber = Right$(strArray(1), 4)
PGNPos = CInt(strArray(2))
DataLength = CInt(strArray(3))
Resolution = CInt(strArray(4))
Offset = CInt(strArray(5))
Unit = CInt(strArray(6))
Description = CInt(strArray(7))
MsgBox SPNNumber & " " & PGNNumber & " " & PGNPos

'Get the result in the ListView lvResults
Set mItem = lvResultat.ListItems.Add()
mItem.Text = SPNNumber
mItem.SubItems(1) = PGNNumber
mItem.SubItems(2) = strArray(2)
mItem.SubItems(3) = strArray(3)
mItem.SubItems(4) = strArray(4)
mItem.SubItems(5) = strArray(5)
mItem.SubItems(6) = strArray(6)
mItem.SubItems(7) = strArray(7)
</code>


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-11 09:27:37 - Sven Åke Persson

Jag skulle vilja skriva om hela <b>Private Sub FindCombo(FilePath As String)</b>

Men då måste jag kolla att jag förstått rätt.
Du har en Textfil som innehåller rader med data (8 st med " " som avskiljare)
Du har en ComboBox som innehåller en enkel kod tex "SPN190"

Om du klickar på den i Comboboxen skall Vi göra sökning i Textfilen efter "SPN190"
och presentera det i lvResultat.
Fråga: om SPN190 finns står den då först på den textraden ?
Den kan bara förekomma 1 gg ?

Sulle vilja se några rader ur textfilen. Är det alltid 8 data.


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-11 12:39:50 - Mats Adolphsson

Hej!

Jag tog bort det du tidigare föreslog Sven Åke och YES, nu får jag upp mitt fina resultat i lvResults! Grymt TACK! Enkelt, men jag hade aldrig fixat det själv.
Nu kan jag äntligen gå vidare till steg två (det sista) i mitt projekt.

Jag ska göra ett försök att förklara mitt projekt:
Jag har en textfil (SPN_db.txt) som ska fungera som en "databas" och ser ut enligt nedan:
---------------------------------------------------------------------------------
SPN190 PGNF004 4 2 0,125 0 rpm/bit Engine Speed
SPN513 PGNF004 3 1 1 -125 % Actual Engine - Percent Torque
SPN512 PGNF004 2 1 1 -125 % Driver's Demand Engine - Percent Torque
SPN1138 PGN65187 3 2 0,03125 -273 C Exhaust Gas Port 2 Temperature
---------------------------------------------------------------------------------
SPN kombinationen står alltid först och finns bara med en gång. Varje kolumn avskiljs med " ", förutom den sista som kan innehålla " ".

Jag har alltså en ListBox som innehåller en enkel kod tex "SPN190", jag vill ändra denna beroende på vad jag är intresserad av.
När jag klickar på en knapp så görs sökningen i SPN_db.txt och resultatet presenteras i lvResults. Detta fungerar numer efter din hjälp.


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-11 12:55:20 - Mats Adolphsson

För att förstå varför jag vill göra ovan nämnda del, så kan det kanske vara bra att veta nästa steg.

Jag har nu nämligen en andra textfil som är genererad från CAN-King, ett program som lyssnar av CAN-bussen på en motor. Denna ser ut enl. nedan:
-----------------------------------------------------------------------
0CF00400 X 8 F8 7D 7D 00 00 FF FF FF 2218.401 R
00EFD100 X 8 3D 3D 3D 3D 3D 3D 3D 3D 2218.400 R
00EFD200 X 8 3D 3D 3D 3D 3D 3D 3D 3D 2218.399 R
0CFF5800 X 8 07 00 00 01 67 01 06 00 2218.399 R
0C000011 X 8 00 00 00 FA 00 00 00 00 2218.397 R
0CF00400 X 8 F8 7D 7D 00 00 FF FF FF 2218.391 R
00EFD200 X 8 3D 3D 3D 3D 3D 3D 3D 3D 2218.390 R
0CFF4800 X 8 F8 7C 30 FF FF FF FF 00 2218.389 R
-----------------------------------------------------------------------

Ur mitt tidigare resultat vill jag ta värdet i kolumn 2, PGN-number, och köra mot denna textfil. Den 4 tecken långa PGN-koden (i ovan nämnda fall F004) matchas mot de 4 mittersta tecknen i den första kombinationen ovan. Här blir alltså träff på rad 1 & 6.
När jag får träff vill jag göra en uträkning med hjälp av "datan" som är de 8 hexadecimala två-kombinationerna, och informationen i den första, tidigare filtreringen.
I och med detta kan man få fram ett värde för t.ex. vilket oljetryck motorn har, vilket gaspådrag, bränsleförbrukning....ja helt enkelt det som man är intresserad av att "lyssna" efter (SPN-numret).

Uträkningen kommer att vara enl. följande:
Vi har från första filtreringen efter SPN190:
--------------------------------------------------------------
SPN190 PGNF004 4 2 0,125 0 rpm/bit Engine Speed (1)
--------------------------------------------------------------

Söker i andra textfilen efter PGN-numret F004 och får till att börja med träff på rad 1, nämligen:
-----------------------------------------------------------------------
0CF00400 X 8 F8 7D 7D 00 00 FF FF FF 2218.401 R (2)
-----------------------------------------------------------------------

I (1) säger 4an i kolumn tre att vi är intresserade av det fjärde hexadecimala datavärdet, här '00'.
Detta görs om till decimalt, som givetvis också blir 0. Detta gångras med kolumn 5 i (1) som är 0,125.
Vi adderar värdet i kolumn 6 i (1), som är '0'. Och vi har vårt resultat med enheten i kolumn 7 i (1) och beskrivningen på vad det är står i kolumn 8 i (1).
Med andra ord var 'Engine speed' vid lyssningstillfället '0 rpm/bit'.


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-11 14:12:35 - Sven Åke Persson

Intressant projekt,jag hjälper gärna till med råd och dåd.

<b>SPN kombinationen står alltid först och finns bara med en gång.
Varje kolumn avskiljs med " ", förutom den sista som kan innehålla " ".</b>

För säkerhets skull ta Vi bort ev. space före och efter
<code>
Do While Not EOF(intFF)
'Get the current line from file and put it into strLine.
Line Input #intFF, strLine
strLineFull = Trim$(strLine)
</code>
Hur vet du att <b>SPN190 = med raden 0CF00400</b> ?
<b>I (1) säger 4an i kolumn tre att vi är intresserade av det fjärde hexadecimala datavärdet, här '00'.</b>

Detta får jag inte att stämma "00" fjärde ur 2:an eller ?
Menar du 7:an om man räknar strikt från vänster ur 0CF00400 X 8 F8 7D 7D 00..........................
eller menar du 4:n i 0C F0 04 <b>00</b>

När jag tänker till ett tag till så verkar du bara intresserad av 0CF00400 är det rätt.


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-11 14:38:54 - Mats Adolphsson

Visst är det intressant...och rätt komplext har jag märkt när jag kommit en bit.

Tanken är att:
* Från början har jag min databas och min avlyssning från CAN-bussen.
* Jag är intresserad av att t.ex. se hur 'Engine Speed' är, och denna vet jag från lista motsvaras av SPN190.
* Efter min första sökning i SPN_db.txt så får jag resultatet:
--------------------------------------------------------------
SPN190 PGNF004 *4* 2 0,125 0 rpm/bit Engine Speed (1)
--------------------------------------------------------------
Här kan jag utläsa ur kolumn 2 att SPN190 tillhör PGNF004. PGN är en grupp som innehåller upp till 8 SPN.

Jag väljer nu detta PGN-nummer 'F004' och söker i CAN-avlyssningen och får till att börja med.
-----------------------------------------------------------------------
0C*F004*00 X 8 F8 7D 7D 00 00 FF FF FF 2218.401 R (2)
-----------------------------------------------------------------------

4an i kolumn 3 i (1) säger att datavärdet vi är ute efter är det fjärde datavärdet i (2), vilket är den 7de kolumnen i (2).
-----------------------------------------------------------------------
0CF00400 X 8 F8 7D 7D *00* 00 FF FF FF 2218.401 R (2)
-----------------------------------------------------------------------

Det är "mycket" men förhoppningsvis förståligt!


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-12 09:49:55 - Sven Åke Persson

Helt Ok nu förstår jag allt och har allt underlag. Fixar du det själv ?
Stöt på om du vill ha hjälp med något
Tog du till dig att det är lämpligt att lägga till Trim$(strLine) enl ovan ?


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-12 12:11:26 - Mats Adolphsson

Hej och tack för tipset. Jag lade till trim$(strLine) direkt vid ditt tips. Bra tanke att "säkra" på detta sätt!

Jag lär mig mer och mer under detta projekt, mycket tack vare din/er hjälp. Känns mycket inspirerande att försöka få bättre koll på det här med VB. Riktigt kul!

För tillfället spånar jag på förslag för nästa steg. Har inte kommit så lång än dock. Jag lär återkomma med frågor gissar jag, det är (för mig) ett stort projekt, men mycket intressant. Skulle vara kul om man fick det att funka bra!
Trevlig helg!
/M


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-15 15:19:40 - Mats Adolphsson

Hej!

Nu har jag kommit en bit längre, men tyvärr kört fast och skulle behöva ett par goda råd för att komma vidare!

Mitt projekt består ju av två sökningar i två olika textfiler.
'Private Sub FindCombo' söker först i den ena textfilen och skriver ut resultatet i ListView'en 'lvResults'. Jag får här värden till t.ex. PGNPos, Resolution & Offset.

'Private Sub FindCombo2' söker sedan som ett andra steg i den andra textfilen och ska presentera det vi söker i lvResults2.
Jag får ut en del i lvResults2 men problemet kommer när jag ska göra den slutliga uträkningen. Jag behöver här använda värden från första sökningen (PGNPos, Resolution & Offset) men dessa kommer jag inte åt här.
Finns det något bra sätt att få till detta sista?

MVH
/M

<CODE>'The actual sub that will search the file for the combinations in strCombos().
Private Sub FindCombo(FilePath As String)

Dim intFF As Long
Dim strLine As String
Dim lonSpacePos As Long
Dim strLineFull As String
Dim strArray() As String
Dim lonLineCounter As Long
Dim intI As Long
Dim SPNNumber As String
Dim PGNNumber As String
Dim PGNPos As Long
Dim DataLength As Long
Dim Resolution As Long
Dim Offset As Long
Dim Unit As String
Dim Description As String
Dim mItem As Variant 'Belongs to lvResults

With lvResults
.ListItems.Clear
'Get available file handle.
intFF = FreeFile
'Open file.
Open FilePath For Input As #intFF
'Clear any previous items.
.ListItems.Clear
'Keep looping until we get to End Of File (EOF).
Do While Not EOF(intFF)
'Get the current line from file and put it into strLine.
Line Input #intFF, strLine

strLineFull = Trim$(strLine) 'To be sure there are no extra " "

If Len(strLine) > 0 Then 'Make sure it isn't an empty line.
'Get text from start to before the first space
'This will give us the combination.
lonSpacePos = InStr(1, strLine, " ")
If lonSpacePos > 0 Then
strLine = Mid$(strLine, 1, lonSpacePos - 1)
'We now have the combination in strLine.
'Check if it is in the list.
If ComboInList(strLine) Then 'ComboInList is a function
strArray = Split(strLineFull, " ")
If UBound(strArray) > 7 Then
For intI = 8 To UBound(strArray)
strArray(7) = strArray(7) & " " & strArray(intI)
Next intI
End If

'Get the result in the ListView lvResults
Set mItem = .ListItems.Add()
'mItem.Text = Right$(strArray(0), 4)
mItem.Text = strArray(0)
'mItem.SubItems(1) = Right$(strArray(1), 4)
mItem.SubItems(1) = strArray(1)
mItem.SubItems(2) = strArray(2)
mItem.SubItems(3) = strArray(3)
mItem.SubItems(4) = strArray(4)
mItem.SubItems(5) = strArray(5)
mItem.SubItems(6) = strArray(6)
mItem.SubItems(7) = strArray(7)

PGNNumber = Mid(strArray(1), 4, 4)
PGNPos = strArray(2)
Resolution = strArray(4)
Offset = strArray(5)
Unit = strArray(6)
Description = strArray(7)

If Len(PGNNumber) > 3 And Not ListItemExsist2(PGNNumber) Then
lstCombo2.AddItem PGNNumber
End If

End If
End If
End If
Loop
Close #intFF
End With
End Sub
'The actual sub that will search the file for the combinations in strCombos().
Private Sub FindCombo2(FilePath As String)
Dim lonLoop As Long, intFF As Integer
Dim strLine As String, lonSpacePos As Long
Dim strLineFull As String
Dim lonLineCounter As Long
Dim strArray2() As String
Dim mItem2 As Variant 'Belongs to lvResults2

With lvResults2
.ListItems.Clear

'Get available file handle.
intFF = FreeFile

'Open file.
Open FilePath For Input As #intFF
'Clear any previous items.
.ListItems.Clear

'Keep looping until we get to End Of File (EOF).
Do While Not EOF(intFF)
'Get the current line from file and put it into strLine.
Line Input #intFF, strLine
lonLineCounter = lonLineCounter + 1

'Check 4 middle characters to (3,4,5,6) and compare.
If Len(strLine) > 0 Then 'Make sure it isn't an empty line.
strLine = LTrim$(strLine) 'Trim spaces off left part.
strLineFull = strLine
'Get text from start to before the first space (X).
'This will give us the combination.
lonSpacePos = InStr(1, strLine, " ")

If lonSpacePos > 0 Then
strLine = Mid$(strLine, 1, lonSpacePos - 1)
'MsgBox strLine

'We now have the combination in strLine.
'Check if it is in the list.
If ComboInList2(strLine) Then
strArray2 = Split(strLineFull, " ")

Set mItem2 = .ListItems.Add()
mItem2.Text = Mid$(strArray2(0), 3, 4)
mItem2.SubItems(1) = Str$(lonLineCounter)
'mItem2.SubItems(2) = ????????????????????????

'***1. PGNPos från 'FindCombo' ovan bestämmer vilket datavärde som skall
' användas: data = strArray2(PGNPos+3) men PGNPos kommer jag inte åt här???
'***2. Datavärdet skall konverteras från HEX till DEC: data(HEX)->data(DEC)
'***3. Uträkning: (Data(DEC) * 'Resolution') + 'Offset'

End If
End If
End If
Loop
Close #intFF
End With
End Sub</CODE>


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-15 15:36:34 - Sven Åke Persson

Utan ha analyserat så noga så gäller att dom värde du skall använda i både Find1 och 2
Måste du deklarera Public dvs redan i början på ditt prog enl nedan.

Analysera vilka variabler som skall användas av två eller fler Sub:ar
ta bort dom Lokalt och lägg dom här.
<code>
Option Explicit
Dim PGNPos As Long
Dim Resolution As Long
Dim Offset As Long

Private Sub Form_Load()

End Sub
</code>


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-15 16:29:57 - Rolf Sundvik

Andreas lösning är inte så dum trots allt, man kan dessutom skjuta sqlfrågor direkt mot en textfil, bara den har en headerrad samt är separerad med komma, tab eller något annat konsekvent!

<code>
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & FilePath & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""

strSql = "SELECT fält1, fält2 " & _
"FROM " & FilePath & " " & _
"WHERE fältx = 'vilkor'"

rs.Open strSql, Conn, adOpenStatic, adLockOptimistic, adCmdText
</code>

Man har då endast den data man behöver i ett recordset direkt. Detta kan sedan kopplas till valfri kontroll. Detta borde bli betydligt mindre kod och lättare att överblicka.


Mvh. Roffe


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-15 17:27:47 - Mats Adolphsson

Hej!

Först svar till dig Rolf!
Tyvärr så kan jag inte bearbeta textfilen (då denna genereras från ett externt program) så jag kommer inte att kunna få in vare sig headerrad eller separera med komma, tab eller något annat konsekvent.
Återigen så tycker jag detta verkar intressant att titta vidare på till ett annat projekt framöver, så jag tackar och bockar!

Sedan svar till dig Sven Åke!
Givetvis så fungerade ditt förslag, och jag förstår logiken, givetvis skall den ligga i början...TACK!

Nu börjar jag verkligen komma nära mitt mål, men återigen är det krångligheter.

För det första så tror jag att min split (strArray2 = Split(strLineFull, " ")) får lite problem med min andra textfil, eftersom denna har lite blandat antal " " som avskiljare mellan kolumnerna. Den innehåller både 1, 2 & 3 mellanslag som avskiljare tyvärr. Detta resulterar i att jag får fler kolumner än jag ska ha (med de "tomma" som skapas). Löser man detta på något smidigt sätt?

För det andra så undrar jag hur man kan göra min slutliga uträkning?
Jag har ju först "PGNPos = strArray(2)" som väl här är av typen "string"!? Denna vill jag konvertera från HEX till DEC, vilket jag inte har en aning om hur man löser.
Sedan skall denna multipliceras med 'Resolution' som också fås enl. "Resolution = strArray(4)". Sedan skall "Offset = strArray(5)" adderas.

Finns det något smidigt och bra sätt att lösa detta?

MVH
/M


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-15 18:51:10 - Andreas Hillqvist

Hej Mats.
Du har kämpat med dit program fram och tillbak ett tag nu.

Jet's textdrivrutin är mycket konfigurerbar. Genom att använda en shema.ini fil kan du ange om texfilen innehåller huvud, hur kolumner är sparerade: fast bred, eller med separator och i så fall vilken separator.
Du kan få den att konvertera text till olika datatyper som tal.
Samt ställa SQL frågor mot dina textfiler.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcjetschema_ini_file.asp

Jag tror den bästa lösningen är att använda en Databas, importera in textfilerna i den och köra SLQ frågor mot den.


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-15 23:52:08 - Sven Åke Persson

Delfråga 1 . ta bort ev. 2 o 3 space seperatorer i FindCombo2 kan du göra så här.
<code>
Do While Not EOF(intFF)
'Get the current line from file and put it into strLine.
Line Input #intFF, strLine
'om du tror att det kan förekomma 4 space får du lägga till även denna.
'strLine = Replace(strLine, " ", " ") 'byter ut ev fyra space mot ett
strLine = Replace(strLine, " ", " ") 'byter ut ev tre space mot ett
strLine = Replace(strLine, " ", " ") 'byter ut ev två space mot ett
lonLineCounter = lonLineCounter + 1
'......
'......
</code>


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-16 10:38:10 - Mats Adolphsson

Hej igen!

Svar till Andreas:
Ja, jag har kämpat med detta ett rejält tag nu, och jag har fått lära mig den hårda vägen (med STOR hjälp från er), men alla sätt är bra utom de dåliga...
Jag är så väldigt nära slutet nu med mitt projekt så jag kommer att köra på inslagen väg för att få ett fungerande projekt. Det enda jag har kvar är denna konvertering och uträkning.
Jag var ganksa "grön" på VB-programmering när jag startade men detta/ni har inspirerat mig och jag skall nog senare försöka mig på samma projekt och se på er allternativa lösning för att lära mig ännu en dimension av detta språk.

Svar till Sven Åke:
Tack för ditt tips, mycket smart och enkelt sätt att tackla problemet!
Jag har också lyckats läsa mig till att jag nog kan använda: "&h" & strArray(*) för att läsa in hex tal till min konvertering. Jag ska se om jag kan få till detta på något bra sätt i eftermiddag!

MVH
/M


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-16 14:53:12 - Sven Åke Persson

Det blev lite rörigt för mig , men du har ju koll på läget.
Lägg in denna Function sist i ditt program och skicka rätt strArray2 och strArray värde.
Lika bra att du också gör strArray() och strArray2() Public så blir det lättare att kalla på rätt värde.
Ta bort dom från FindCombo och FindCombo2 lägg dom Public
<code>
Option Explicit
Dim PGNPos As Long
Dim Resolution As Long
Dim Offset As Long
Dim strArray() As String
Dim strArray2() As String
</code>
<code>
'Du skickar 3 värde,det första är ett Hex värde String dom andra 2 är Dec String
'Alla tre skall komma från strArray2 och strArray
'I retur får du ett String värde som du skall lägga in i lvResultat2
Private Function ConvCanKingData(ByVal data1 As String, _
ByVal data2 As String, ByVal data3 As String) As String
ConvCanKingData = CStr(Val("&H" & data1) * CSng(data2) + CLng(data3))
End Function
</code>
Exempel:
<code>
Set mItem2 = lvResultat2.ListItems.Add()
mItem2.Text = Mid$(strArray2(0), 3, 4)
mItem2.SubItems(1) = Str$(lonLineCounter)
mItem2.SubItems(2) =ConvCanKingData(strArray2(*),strArray(*),strArray(*))
</code>


Svara

Sv:Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-16 15:06:46 - Mats Adolphsson

Ojoj, det där blir ju kalas-bra! Jag lyckades som sagt läsa mig till det där med "&h" grejen och att lägga det som en funktion på det viset verkar ju kanon!
Jag ska försöka få ihop detta på ett bra sätt ikväll, så kanske jag har ett fullt fungerande program......TILL SLUT!

Återigen TACK!!!!!!!!

/M


Svara

Sv: Filtrera textfil och skriva ut resultat i listview (VB6)

Postades av 2007-05-16 15:19:03 - Sven Åke Persson

Oki. Nu får du gå genom allt och slipa till en del onödiga rader.
Tror inte att att du behöver ha dessa Public längre
Se bara till att det kommer rätt värde i strArray(*) och strArray2(*) som skall vara Public.

Option Explicit
Dim PGNPos As Long
Dim Resolution As Long
Dim Offset As Long


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 725
27 958
271 751
437
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies