Hej! Vad har du för separator mellan kolumnerna? ÄR det fast bredd eller ett avskiljande tecken så som tab? Först kommer tre mellanslag. Det rör sig om fastbredd. Oj, detta lät komplicerat för mig då jag inte är direkt bekant med ADO, Access..... Access och ado brukar vara bekant för det flesta. Hej mats! Vi börjar känna varandra vid det här laget (jag är main i en del andra forum där du postat tidigare) :P Om du vill göra om programmet så att det söker efter vad som helst, och inte bara 4 tecken (med början från och med tecken 3), så kan du använda InStr. Hej tycker det är kul att sitta och pyssla med sådana här problem. Hej (igen till dig main som återigen har hjälpt mig)! JAg förstår inte varför ni söker igenom hela raden om ni vet vilken position värdet finns på? 0CF00400 X 8 F8 7D 7D 00 00 FF FF FF 2218.401 R Så är dock inte fallet med If Mid(strSearch(i), 3, 4) = strKey(j).Hjälp igång för ringrostig!
Jag är tyvärr ingen jättevan VB programmerare och skulle därför behöva lite tips och hjälp med att lösa ett problem.
Min önskan är att skapa ett program som läser in en textfil som kan se 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
Nu vill jag att programmet kollar den första 8 tecken långa gruppen (som är en identifierare) och jämför den med ett par bestämda kombinationer. Om denna finns med så skrivs hela raden ut.
Ur den 8 tecken långa första kombinationen så är det de fyra ”mittersta” tecknen (de på position 3,4,5 & 6) som skall jämföras med ett par 4 tecken långa bestämda kombinationer.
Ex. på bestämda kombinationer som jag är intresserad av är:
F004
F006
EFD2
FFFF
I detta fall så skulle rad 1, 3, 6 & 7 skrivas ut.
Dessa 4 tecken långa kombinationer som jag är intresserad av önskar jag kunna ändra/lägga till/ta bort. Har man dessa då kanske också i en separat textfil!?
Eftersom jag är rätt ringrostig när det gäller programmering och VB så skulle jag vara otroligt tacksam om någon skulle kunna hjälpa mig igång med tips/förslag på detta.
Tack på förhand!
/MatsSv: Hjälp igång för ringrostig!
Sv:Hjälp igång för ringrostig!
Sedan den 8 tecken långa "identifieraren".
Ett mellanslag.
Ett X.
Tre mellanslag.
En 8.
Tre mellanslag.
Därefter följer 8st 2-tecken långa grupper med två mellanslag mellan varje grupp.
Tre mellanslag.
Kombination "4 siffror.3 siffror"
Ett mellanslag.
R
Hoppas detta klargör denna "röriga" textfil.
/MSv: Hjälp igång för ringrostig!
Mitt tipps är att använda ADO och Access, JET OLEDB providern.
På så sätt kan du öppna filen som ett recordset.
För att göra detta behöver du definiera en Schema.ini:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcjetschema_ini_file.asp
Ett exempel på detta är:
[data1.txt]
ColNameHeader=False
Format=FixedLength
DecimalSymbol=,
Col1=Id Char Width 11
Col2=XFactor Char Width 2
Col3=MagicNumber Char Width 4
osv...
Så här öppnar du den:
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
rsTable.Open "SELECT * FROM " & TableName, Connection
Dim path As String
path = App.Path 'Katalog där Schema.ini ligger tillsammans med textfilerna
Set con = New ADODB.Connection
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Extended Properties='Text';" + _
"Data Source=" & path & ";"
rs = New ADODB.Recordset
rs.Open "SELECT * FROM [data1.txt]" , con
Do until rs.EOF
rs.MoveNext
rs.Loop
rs.Close
con.Close
Du kan då manuellt filtrerar ut posterna med en IF sats i loopen eller använda fileter egensapen på recordsetet.
Sv:Hjälp igång för ringrostig!
Vore det idé att ge sig på detta "främmande" eller finns det någon (för mig) smidigare lösning med enbart VB6?
MVH
/MSv: Hjälp igång för ringrostig!
Kod för att loppa igenom en fil:
Private Sub Form_Load()
Dim FileNo As Long
Dim FileName As String
Dim row as String
FileName = App.Path & "\data.txt"
FileNo = FreeFile()
Open FileName For Input As FileNo
Do Until EOF(FileNo)
Line Input #FileNo, row
'....
Loop
Close FileNo
End Sub
Om filen inte kommer att förändras så kan du använda följande knep för att dela upp data i kolumner:
Private Type RowCombined
data As String * 60
End Type
Private Type RowSplitt
Id As String * 11
XFactor As String * 2
MagicNumber As String * 3
data(7) As String * 4
HighPart As String * 6
LowPart As String * 4
BFactor As String * 2
End Type
Private Sub Form_Load()
Dim FileNo As Long
Dim FileName As String
Dim row As RowCombined
Dim data As RowSplitt
FileName = App.Path & "\data.txt"
FileNo = FreeFile()
Open FileName For Input As FileNo
Do Until EOF(FileNo)
Line Input #FileNo, row.data
LSet data = row
'...
Loop
Close FileNo
End Sub
Att filtrerar och så anser jag trivialt då det är en if-sats.
Sv: Hjälp igång för ringrostig!
I detta exempel måste du skapa en listbox (standardnamn List1).
Ytterligare en metod i VB (med dynamisk minnesallokering):
Dim strSearch() As String
Dim strKey() As String
Private Sub SearchFor(strFil As String)
Dim i As Integer
Open strFil For Input As #1
Do Until (EOF(1))
ReDim Preserve strKey(i)
Line Input #1, strKey(i)
i = i + 1
Loop
Close #1
End Sub
Private Sub SearchIn(strFil As String)
Dim i As Integer
Open strFil For Input As #1
Do Until (EOF(1))
ReDim Preserve strSearch(i)
Line Input #1, strSearch(i)
i = i + 1
Loop
Close #1
End Sub
Private Sub Form_Load()
Dim i As Integer, j As Integer
SearchIn ("c:\data.txt")
SearchFor ("c:\keys.txt")
For i = 0 To UBound(strSearch)
For j = 0 To UBound(strKey)
If Mid(strSearch(i), 3, 4) = strKey(j) Then
List1.AddItem strSearch(i)
End If
Next j
Next i
End Sub
Man hade faktiskt kunna göra detta helt utan att behöva utnyttja extra minne för raderna (förutom de två variablerna som läser en rad) (en metod jag visade dig i C förut).
Man kunde ha läst in båda filerna samtidigt och stegat igenom, sedan börjat om i nyckelfilen och läst igen (kommer att läsas n antal gånger n = antal rader). Den metoden kräver mindre minne men är inte så effektiv.
Om du vill ha radnummer lägger du till i+1 (eftersom index börjar med 0) i ListBoxens AddItem metod.
Sv: Hjälp igång för ringrostig!
Formatet på InStr är:
Instr([start], "sträng att söka i", "sträng att söka efter", [Sökmetod]).
Den returnerar ett heltal större än noll (0) om söksträngen påträffas i den andra (som indikerar vilken position den substrängen börjar på i söksträngen).
Klamrarna [ och ] indikerar att den parametern är optional, alltså frivillig att bifoga.
Exempel:
InStr("hejsan", "hej") returnerer 1 eftersom stängen "hej" finns i strängen "hejsan", och den fanns från och med position 1.Sv:Hjälp igång för ringrostig!
Om du gör ett projekt med detta kodexempel, lånat detaljer från grabbarna ovan.
Så får du en Temp.txt som innehåller dom rader du vill bearbeta.
Det får Vi komma till när du fått detta att funka. Lägg ditt projekt med input-Hexfil.txt i en egen mapp.
Börja med att tillverka en mapp,lägg upp en Command1 button och spara projektet As i den mappen.
Sen klistrar du in denna kod i button och kör.
<code>
Option Explicit
Private Sub Command1_Click()
Dim FileNum As Long, FileNum2 As Long
Dim FileName As String, FileName2 As String
Dim row As String, textRow() As String ' array
'Namnet på din hexfil här,skall ligga i samma mapp som projektet
FileName = App.Path & "\HexOrginal.txt"
'Namnet på din bearbetade utfil här. Samma mapp som projektet.
FileName2 = App.Path & "\Temp.txt"
FileNum = FreeFile
Open FileName For Input As FileNum
FileNum2 = FreeFile
Open FileName2 For Output As FileNum2
Do Until EOF(FileNum)
Line Input #FileNum, row
row = Trim$(row) 'ta bort onödiga space
textRow = Split(row, " ") 'space
If InStr(textRow(0), "F004") _
Or InStr(textRow(0), "F006") _
Or InStr(textRow(0), "EFD2") _
Or InStr(textRow(0), "FFFF") Then
Print #FileNum2, row
End If
Loop
Close #FileNum
Close #FileNum2
End Sub
</code>Sv: Hjälp igång för ringrostig!
Det finns många sätt att lära sig på, och detta är helt klart ett. Man börjar förstå och komma in i tankesätten mer och mer efter alla tips och förslag jag har fått från er alla via forum, det hade aldrig gått utan er välvilja, hjälpsamhet och framför allt kunskap. Tackar och bockar!
Jag kommer komma hem imorgon och har då möjlighet att pröva och sätta mig in i era förslag ordentligt, men det ser ju grymt ut! Det ska bli spännande att få se hur det fungerar ihop med mina filen och önskemål på resultat!
Stort TACK igen!
/MSv: Hjälp igång för ringrostig!
JAg ser det som ineffektivt och möjlighet att ge felträffar.Sv:Hjälp igång för ringrostig!
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
hm.... jag vet inte vilken position värdet finns på.
Jag undersöker bara dom 8 första tecknen , se Split raden.Sv:Hjälp igång för ringrostig!
Men det kan ju vara bra att utforma programmet mer dynamiskt så att om man någon gång skulle vilja använda det till att t.ex söka efter valfria substrängar så kan man lätt ändra raden ovan till instr istället.