Hej! Gör detta i design läge Det bör vara här: Alla Integer skall vara Long Hej, och ett stort TACK Sven Åke! Braaaaaaa kul att mina förslag faller i god jord. Hej igen! Ok skall kolla noga. Hej, Lägg din data i ett databas eller åtminstonde i ett recordset. Här visa hur du fyller ett recordset: Andreas förslag är helt Ok men "overkill" för detta projekt. Jag skulle vilja skriva om hela <b>Private Sub FindCombo(FilePath As String)</b> Hej! 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. Intressant projekt,jag hjälper gärna till med råd och dåd. Visst är det intressant...och rätt komplext har jag märkt när jag kommit en bit. Helt Ok nu förstår jag allt och har allt underlag. Fixar du det själv ? Hej och tack för tipset. Jag lade till trim$(strLine) direkt vid ditt tips. Bra tanke att "säkra" på detta sätt! Hej! Utan ha analyserat så noga så gäller att dom värde du skall använda i både Find1 och 2 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! Hej! Hej Mats. Delfråga 1 . ta bort ev. 2 o 3 space seperatorer i FindCombo2 kan du göra så här. Hej igen! Det blev lite rörigt för mig , men du har ju koll på läget. 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! Oki. Nu får du gå genom allt och slipa till en del onödiga rader.Filtrera textfil och skriva ut resultat i listview (VB6)
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
Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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>Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
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> Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
Det var till stor hjälp för mig! Man lär sig något nytt varje dag!
MVH
/MSv:Filtrera textfil och skriva ut resultat i listview (VB6)
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.Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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>Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
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>Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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
/MSv:Filtrera textfil och skriva ut resultat i listview (VB6)
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.Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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.
Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
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>Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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.Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
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.Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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'.Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
<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.Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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!Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
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 ?Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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!
/MSv:Filtrera textfil och skriva ut resultat i listview (VB6)
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>Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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>Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
<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. RoffeSv: Filtrera textfil och skriva ut resultat i listview (VB6)
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
/MSv:Filtrera textfil och skriva ut resultat i listview (VB6)
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.Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
<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>Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
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
/MSv: Filtrera textfil och skriva ut resultat i listview (VB6)
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>Sv:Filtrera textfil och skriva ut resultat i listview (VB6)
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 Sv: Filtrera textfil och skriva ut resultat i listview (VB6)
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