Hej! Visa gärna lite kod på hur du gör så är det lättare att se om det finns bättre sätt. Du skriver att du splittar raden, låter onödigt om du bara ska kontrollera om ett ord förekommer... Det finns många sätt att lösa det här på. Oops! dubbelpost jag med! Visar här exempel på hur filerna ser ut. Testa om det går snabbare såhär: Hur många textdokument rör det sig om? Borde varit "If linein.StartsWith(txtSökord.Text) Then" istället, men det gör nog inte större skillnad. Får du många träffar? Om du får det kan du testa att skriva raderna till en fil istället, skrivning till Debug-fönstret är ganska långsamt. Jag använder bara debug just nu. ---Hur många textdokument rör det sig om? Om det bara rör sig om ett fåtal körningar per dag, så kanske nuvarande metod duger? Hejsan har klurat lite på din applikation, och detta är resultatet. Jo visst har jag funderat på Access. Hej Ivan! Sorry glömde ge exempel på en fullständig pattern.Läsa från textfil
Vill läsa data från några textfiler. Det fungerar bra med StreamReader.
Läser en rad i taget, splittar den, och ser sedan om mitt sökord finns i raden.
Om det gör det så.. ja då ska jag använda den raden/raderna av data lite senare.
Problemet är att det tar lite tid att läsa raderna i filen.
Det handlar om cirka 50000 rader och det tar 13-15 sekunder.
Eftersom jag vet att ett annat program (inte mitt) använder sig av samma filer
och finner det man söker efter mycket snabbt, på millisekunder, så finns det
såklart ett bättre sätt än det jag gjort.
Tror att man borde skapa index på något sätt, kanske i en separat fil med data från de andra
textfilerna, för att kunna söka mycket snabbare.
Inte vet jag hur eller om jag ens är på rätt spår.
Är jag det, och hur går det till i så fall eller finns det något annat sätt?
/PontusSv: Läsa från textfil
/JohanSv: Läsa från textfil
Berätta lite om:
Vad är det för filer?
Ändras dom eller är dom statiska?
Håller med Johan att det verkar onödigt att splitta raderna i förväg.
Om sidorna är statiska så kan man även trycka in dom i en databas.Sv: Läsa från textfil
fick följande felmeddelande:
500- Ett internt fel har uppstått
Felet har uppstått i filen: /communicate/forum/edit.aspx
Sidan har utfört ett fel och avbrutits. Felet rapporteras nu automatiskt till oss.
Vi ber om överseende och rättar till detta problem fortast möjligt. Vänligen prova igen om en stund för att se om felet är avhjälpt. Tack för visat tålamod.Sv:Läsa från textfil
Innehållet i varje fil är givetvis mycket större!
I ex. AIRPORT.TXT söker jag efter den andra delen i raden, ESSA (se nedan).
Finns det, vilket det gör, så ska jag ta hand om det som tillhör just ESSA.
Det får jag lösa senare.
Exempel på innehållet i AIRPORTS.TXT
A|ESSA|STOCKHOLM ARLANDA|59651944|17918611|137
R|01L|6|10830|1|109900|6|59637256|17913225|98|300|56
R|01R|6|8202|1|109350|6|59626397|17950742|137|300|51
R|08|72|8202|1|109550|72|59658419|17936133|108|000|50
R|19L|186|8202|1|111350|186|59648467|17958747|98|300|51
R|19R|186|10830|1|110700|186|59666403|17923767|118|300|51
R|26|252|8202|1|110100|252|59663897|17979153|124|300|53
A|ESSB|STOCKHOLM BROMMA|59354444|17942222|47
R|12|121|5472|1|110300|121|59358669|17929642|46|350|51
R|30|301|5472|1|109700|301|59350075|17953658|45|350|36
A|ESSD|BORLANGE|60422222|15515000|503
R|14|129|7579|0|0|0|60429089|15499878|503|000|50
R|32|309|7579|1|109500|309|60415097|15530839|493|300|55
I WAYPOINT.TXT är det den första delen jag vill söka i. Ex. DEVIL
som också förekommer flera gånger.
Exempel på innehållet i WAYPOINTS.TXT
DETSI|51976667|4220278|EH
DETSO|58600000|14264361|ES
DETSU|-1470000|21386667|FZ
DETTA|38656181|-108119281|K2
DETUR|48939167|953056|LF
DETUS|55022806|12999667|ES
DETUX|-20000000|14308333|FY
DETVE|43089511|-76310367|K6
DEUCA|-26646167|-47039833|SB
DEUCE|40643067|-73412783|K6
DEUSO|40968417|-80218169|K6
DEUTZ|39320189|-76542142|K6
DEVAC|34618081|-87435167|K7
DEVAL|50856944|1466667|EG
DEVAY|39237264|-81951147|K5
DEVBI|60715278|-8768333|EG
DEVEC|36068406|-105225497|K2
DEVEL|54730833|15748056|EP
DEVER|37853439|-89357144|K5
DEVID|89000000|-168973333|UO
DEVIL|-26475000|-52039333|SB
DEVIL|38569781|-82873908|K5
I sista exemplet NAVAIDS.TXT är det åter den första
delen som jag söker i ex. ARS eller NS o.s.v.
Exempel på innehållet i NAVAIDS.TXT
ARS|ALTO RIO SENGUERR|310000|0|0|195|-45016389|-70801111|0|SA
ARS|ARDROSSAN|115800|1|0|195|-34416667|137893333|0|YM
ARS|ARDROSSAN|398000|0|0|195|-34414167|137923056|0|YM
ARS|AROS|112800|1|1|195|59586194|16650389|50|ES
ART|WATERTOWN|109800|1|1|195|43952031|-76064617|370|K6
ARU|ALTURAS|215000|0|0|195|41471917|-120557417|0|K2
ARV|ARBOR VITAE|221000|0|0|195|45926142|-89729342|0|K5
ARV|ARVIDSJAUR|109350|0|1|195|65597778|19262861|1276|ES
ARW|NADOR ARWI|355000|0|0|195|34989664|-3044167|0|GM
NS|NELSON|116400|1|1|195|-41301694|173222533|20|NZ
NS|NELSPRUIT|480000|0|0|195|-25490719|30919069|0|FA
NS|NIAMTOUGOU|260000|0|0|195|9701583|1063139|0|DX
NS|NAMSANG|240000|0|0|195|20885556|97736944|0|VY
NS|NANXIONG|333000|0|0|195|25096667|114275000|0|ZG
NS|MARY LOM RW36L|480000|0|0|195|37571667|61898056|0|UT
NS|NARYN|691000|0|0|195|41166667|72166667|0|UA
NS|NIS|255000|0|0|195|43303444|21825028|0|LY
NS|NAKASHIBETSU|265000|0|0|195|43521111|144749444|0|RJ
NS|NIORT SOUCHE|329000|0|0|195|46340583|-300167|0|LF
NS|ULAN UDE|718000|0|0|195|51831667|107630000|0|UI
NS|MALMO|351000|0|0|195|55611667|13363333|0|ES
NS|NARSAQ|404000|0|0|195|60900000|-46016667|0|BG
NS|REYKJAVIK-NES|370000|0|0|195|64133889|-21961667|0|BI
NS|ESNS ILS/CAT I|109500|0|0|195|64627972|21051306|122|ES
NS1|SKOVDE|384000|0|0|195|58525583|14007500|0|ES
Filerna är normalt statiska med kommer att uppdateras ibland.
Detta sker manuellt eller åtminstone med min vetskap, alltså
inte helt plötsligt.
############################################
Som svar till Johan i samma inlägg som till Lars så är det så här jag gör
för att söka, i detta fall, waypoints.txt.
Dim linein As String
Dim resultat() As String
Dim oRead As StreamReader
oRead = File.OpenText("J:\waypoints.txt")
While oRead.Peek <> -1
linein = oRead.ReadLine()
resultat = linein.Split("|")
If resultat.Length >= 3 Then
If resultat(0) = txtSökord.Text Then
Debug.Print(linein) 'För att visa det rader som hittats.
End If
End If
End While
oRead.Close()
/PontusSv: Läsa från textfil
Dim linein As String
Dim resultat() As String
Dim oRead As StreamReader
oRead = File.OpenText("J:\waypoints.txt")
While oRead.Peek <> -1
linein = oRead.ReadLine()
If linein.Contains(txtSökord.Text & "|") Then
Debug.Print(linein) 'För att visa det rader som hittats.
End If
End While
oRead.Close()
/Johan
Sv: Läsa från textfil
Hur många körningar ska du gör per dag?
Vet du var i varje rad det eftersökta värdet skall sökas (per textdokument) ?
Är du nöjd med ditt sexliv? ( kan ev. sakna relevans för uppgiften)
Vet du hur långt ett "värde" kan bli som längst? (mellan pipe-tecknen?
Det jag är ute efter lite, är att ev. formatera till databasformat.Sv:Läsa från textfil
/JohanSv: Läsa från textfil
Nej det lär inte bli så många träffar.
Kanske ett tiotal som mest, vanligare är nog en eller några enstaka träffar.Sv:Läsa från textfil
Antalet är tre-fyra stycken.
---Hur många körningar ska du gör per dag?
Det blir inte många alls.
---Vet du var i varje rad det eftersökta värdet skall sökas (per textdokument) ?
I airport.txt så är det det andra. som innehåller fyra tecken.
Exempel ESSB eller ESSD i nedan exempel
A|ESSB|STOCKHOLM BROMMA|59354444|17942222|47
R|12|121|5472|1|110300|121|59358669|17929642|46|350|51
R|30|301|5472|1|109700|301|59350075|17953658|45|350|36
A|ESSD|BORLANGE|60422222|15515000|503
R|14|129|7579|0|0|0|60429089|15499878|503|000|50
R|32|309|7579|1|109500|309|60415097|15530839|493|300|55
I waypoints.txt är det första som innehåller fem tecken.
Exempel DEVID eller DEVIL nedan.
DEVER|37853439|-89357144|K5
DEVID|89000000|-168973333|UO
DEVIL|-26475000|-52039333|SB
DEVIL|38569781|-82873908|K5
I navaids.txt är det det första som innehåller tyvå till tre tecken.
Exempel ARV eller NS nedan
ARV|ARVIDSJAUR|109350|0|1|195|65597778|19262861|1276|ES
ARW|NADOR ARWI|355000|0|0|195|34989664|-3044167|0|GM
NS|NELSON|116400|1|1|195|-41301694|173222533|20|NZ
NS|NELSPRUIT|480000|0|0|195|-25490719|30919069|0|FA
NS|NIAMTOUGOU|260000|0|0|195|9701583|1063139|0|DX
---Vet du hur långt ett "värde" kan bli som längst? (mellan pipe-tecknen?
Nja, lite svårt att svara på men uppskattar det till max 25 tecken, oftast färre.
Som jag skrev i första inlägget så finns det redan ett program som söker mycket snabbt.
Har därifrån funnit en fil där innehållet är enligt nedan. OBS! Visar bara en mycket liten del
av innehållet här! Filen skapas första gången man startar programmet och antar innehållet
kommer från de andra textfilerna.
Kan en sådan fil vara snabb att söka i tro?
Som synes i början så verkar det bara coordinaterna finnas med. Det är i.o.f. det viktigaste
men visst ska det övriga innehållet också användas.
airportcoordinateindex=SBUA@-0.148056@-66.9858,SKLG@-0.182278@-74.7708,SETR@-0.122956@-76.3377,SECO@-0.460556@-76.9881,SEQU@-0.141111@-78.4886,SEGS@-0.453889@-90.2658,WIPR@-0.351667@102.334,WIDS@-0.478333@104.578,WIOO@-0.148056@109.404,WIOG@-0.348869@111.748,WALS@-0.487872@117.154,WALT@-0.093214@117.439,HKKI@-0.085331@34.73,HKGA@-0.466667@39.6333,HCMK@-0.35@42.4667,SBBE@-1.38472@-48.4789,SBJC@-1.415@-48.46,SBMD@-0.889444@-52.6017,SBTB@-1.485@-56.3983
navaidindex=1@0,1B@0,1E@56,1F@112,2@161,2A@161,2B@222,2F@271,2I@323,2J@380,2K@436,2S@488,2T@545,2U@599,3@653,3B@653,3J@707,3M@762,3N@821,3U@873,3X@925,3Z@980,4@1083,4B@1083,4G@1145,4H@1199,4K@1264,4L@1321,4M@1372,4N@1431,4O@1487,4Q@1542,4T@1594,4V@1648,4X@1704,5@1761,5J@1761,5Q@1816,5V@1869,5W@1924,5Y@1979,5Z@2030,6@2084,6F@2084
waypointindex=0@0,00@0,01@14984,02@34686,03@54280,04@74194,05@94175,06@114230,07@133999,08@153951,09@174027,0A@194335,0B@194668,1@194696,10@194696,11@216294,12@237719,13@258930,14@280267,15@301482,16@323493,17@344605,18@365483,19@386535,1A@407246,1B@407799,2@407886,20@407886,21@428657,22@449484,23@470539,24@491376,25@512063,26@535039,27@555982,28@577196,29@598088,2A@618576,2B@618865,2C@618894,2D@618952,2T@619036,2Z@619090,3@619118,30@619118,31@639759
/PontusSv: Läsa från textfil
Men om du vill få den blixtsnabb så kan du alltid göra om varje textdokument till motsvarande tabell
i t. ex. MS access och där få snabba svar.Sv: Läsa från textfil
Funktionen nedan borde klara läsa av och söka igenom filen på mindre än 1 sek.
Dim strPattern As String
Dim strFilInfo As String
Dim oRead As IO.StreamReader
oRead = IO.File.OpenText("J:\waypoints.txt") 'ladda in filen
strFilInfo = oRead.ReadToEnd() 'läs in hela filen
oRead.Close() 'stäng readern
'förklara lite regex pattern
'(?<funnen>" & txtSearch.Text & ") = leta efter exakta ordet och spara den i gruppen funnen
'\| = leta efter streck tecknet
'(?<kordinatX>\-?\d{8}) = leta efter ett minus tecke, minusteckent kan förekomma en gång eller ingen gång, leta därefter ett numeriskt värde på 8tecken
'samma gäller för kordinat Y
'(?<kod>\w{2}) = leta efter 2 tecken och spara i gruppen kod
strPattern = "(?<funnen>" & txtSearch.Text & ")\|(?<kordinatX>\-?\d{8})\|(?<kordinatY>\-?\d{8})\|(?<kod>\w{2})"
Dim objRegEx As New Regex(strPattern)
Dim objMatches As MatchCollection = objRegEx.Matches(strFilInfo)
Dim strFunnen As String
Dim strKordinatX As String
Dim strKordinatY As String
Dim strKod As String
'loopar igenom alla funna resultaten
For i As Integer = 0 To objMatches.Count - 1
strFunnen = objMatches(i).Groups("funnen").Value
strKordinatX = objMatches(i).Groups("kordinatX").Value
strKordinatY = objMatches(i).Groups("kordinatY").Value
strKod = objMatches(i).Groups("kod").Value
'gör något med dom funna resultaten
'...
NextSv:Läsa från textfil
Tycker dock att det borde fungera rätt bra med "bara" textfiler också
och det gör det nog då jag börjat att testa lite med tipset från Ivan.Sv:Läsa från textfil
Det här var intressant och nytt för mig.
Efter lite justeringar så kommer detta nog att fungera både bra och snabbt.
Försöker att lära mig lite om hur man väljer andra sökkriterier och ska nog
få till det som jag vill så småningom.
Tack för tipset!
/PontusSv: Läsa från textfil
(?<funnen>DEVIL)\|(?<kordinatX>\-?\d{8})\|(?<kordinatY>\-?\d{8})\|(?<kod>K5)
Denna pattern kommer att leta i hela filen/strängen efter DEVIL och K5 som kod..
Du kan även ändra \d{8} på både kordinatY och X till vad du vill att den ska matcha.
Och en viktig grej ta inte bort \-? för den letar efter ett minustecken på kordinaterna.
På denna sidan kan du hitta olika patterns: http://www.regular-expressions.info/
Ha en trevlig dag, och lycka till med trixandet ;)