Hej! Nää jag kan inte se nån bättre lösning . Hej! Det är resurskrävande att dimensionera om en array. Du du är tvungen at alkoera nytt minnesområd, Föröver informationen och frigöra det gamla för varje rad. Det tar mer och mer tid ju fler poster det blir. Då kan det i vissa fall löna sig att läsa igenom filen för att räkna tecken. Annars kan du ju alltid använda Split: Ahhh! Är du galen pojk. Inte konkratenera ihop en fil radvis. Det är galenskap. Visserligen, men vad betyder det om det är en mindre fil? Ingen som helst betydelse. Det har endast betydelse om vi pratar om filer som fyller Mb på hårddisken... Oftast när man jobbar med textfiler så är filerna bara några k stora och då är minnesallokeringen så pass snabb att du inte kommer att märka av det i allafall. Eftersom detta är ett forum. Så bör vi lära ut concept. Man skall se i ett större perspektiv på sin lösning. Jag tycker Axi:s svar var bra i princip,Räkna rader i en txt-fil...
Någon som har ett tips på hur man kan räkna antalet rader i en textfil på ett enklare sätt än nedanstående? Det är så att jag vill dimensionera en array i förväg och slippa dra igenom filen två ggr.
Open "C:\Test.txt" For Input As intFilNr
While Not EOF(intFilNr)
Line Input #intFilNr, strTemp1
i = i + 1
Wend
Close #intFilNr
/JörgenSv: Räkna rader i en txt-fil...
Man skulle också kunna räkna hur många vbCrLf det finns i texten.
Men det finns mig veterligen inget bra sätt att göra det snabbare.
Man kan också använda API SendMessage med <b>Const EM_GETLINECOUNT = &HBA</b>
Det förutsätter att du har laddat texten i en TextBox
<code>
' Get number of lines in TextBox
TextLines = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0&, 0&)
</code>
Då skulle man kunna tänka sig att du laddar en Visible = False Textbox
redan i Form_Load och sedan använder API:et när den tiden kommer.
Men varför i hela fridens namn skriver folk så här ???
<b>While Not EOF(intFilNr)</b>
"Så länge inte jobbet är klart får du fortsätta"
Var för skall man lägga in en Negations Operator Not, till vilken nytta ?
Jag skriver på det positiva sättet utan att "svamla" med extra "Inte"(Not) fras.
<b>Do Until EOF(intFilNr)</b>
"Kör till det är klart"Sv: Räkna rader i en txt-fil...
Man kan ju dimensionera arrayen efterhand:
While Not EOF(intFilNr)
Line Input #intFilNr, strTemp1
i = i + 1
ReDim Preserve Inpfield(i)
Wend
/BoSv:Räkna rader i en txt-fil...
Hur stora filer rör det sig om? Om det är mindre filer. Kan du läsa in hela filen till en variabel. Då det är snabbare att läsa hela fil till en variabel och arbeta med den där. Än att läsa rad för rad. Fil IO operationer är långsamma.Sv: Räkna rader i en txt-fil...
<code>
Dim intFilNr As Integer
Dim strTemp1 As String
Dim strTemp2 As String
Dim strMyArray() As String
Open "C:\Test.txt" For Input As intFilNr
While Not EOF(intFilNr)
Line Input #intFilNr, strTemp1
strTemp2 = strTemp2 & strTemp1
Wend
strMyArray = Split(strTemp2, vbCrLf)
</code>
Då kommer strMyArray automatiskt att vara dimensionerad till antalet rader...Sv:Räkna rader i en txt-fil...
Då strängvariabeln kommer omalkoeras vid varje tilldelning.
* Ta istället reda på stroleken på filen.
* Fylle en varaibel med tecken.
* Läs in filen i variabeln.Sv: Räkna rader i en txt-fil...
Men visst - om man skall tänka på skalbarhet så har du rätt. Sv:Räkna rader i en txt-fil...
Din kod påverkar alla som läser den. Du bör därför skriva på bästa sätt. För att ager föredömligt för andra.Sv: Räkna rader i en txt-fil...
mycket överspel och pekpinnar här av den gode Hillqvist !
<b>Eftersom detta är ett forum</b> Och blir frågan ?
Axi:s förslag lite modifierat.
<code>
Dim intFilNr As Long
Dim tmpStr As String
Dim strMyArray() As String
intFilNr = FreeFile
Open "C:\Test.txt" For Input As intFilNr
tmpStr = Input$(LOF(intFilNr),#intFilNr)
Close #intFilNr
strMyArray = Split(tmpStr, vbCrLf)
</code>