Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Unde gasesc acest tip de bec ?!

Knok at the Cabin (2023)

Pentru cei ce stati la bloc, va s...

Necesar software pt. timeline
 Biodome 27/ Thermica carpatino

Nu pot accesa unele pagini

Experiente cu mecanicii auto

La Digi de la Vodafone
 Creveti

Sare siguranta cand pornesc masin...

Verificare structura de rezistent...

Masina nr 2 - 90% oras, benzina, ...
 Tratament ortodontic

Passat B5 2000, fum

navigația auto nu porneș...

Demontare plastic hayon Seat Ateca
 

[VisualBasic] CUM citire fisier - verificare rand dupa valori multiple

- - - - -
  • Please log in to reply
2 replies to this topic

#1
sorin147

sorin147

    Senior Member

  • Grup: Senior Members
  • Posts: 5,307
  • Înscris: 11.08.2003
Am un fisier pe care vreau sa-l parcurg si, la fiecare rand, sa-mi caute daca gaseste valorile a, b sau c (de exemplu),
Valorile a, b si c sunt intr-o variabila array.

Daca parcurg fisierul cu do until e OK, trece prin fiecare rand. Buba apare atunci cand, ajungand la un rand, vreau sa caute pe randul respectiv daca sunt valori din arrayul in cauza. Asta o fac cu for each insa, in loc sa ramana pe randul respectiv pana termina tot arrayul, trece la randul urmator. Mai pe scurt, la fiecare trecere, foloseste acelasi index de citire si pentru rand si pentru array.
O solutie ar fi sa pornesc din array si, la fiecare element. sa citesc fisierul de la capat dar asta nu-mi suna prea bine.

Idei? Sugestii? Solutii? :)

CUM MERGE
Dim fileName, errors
Set fso = CreateObject("Scripting.FileSystemObject")

fileName = "<fisierul in cauza>"
errors = Array("a","b", "c")

processFile()
Sub processFile()
For Each val in errors
  Set f = fso.openTextFile(fileName)
		Do until f.atendofstream
				 MsgBox ("eroare aici " & f.readline & " " & val)
		Loop
  f.close
Next
End Sub


Cum mi-as dori sa mearga: sa deschid fisierul o singura data si pentru fiecare rand sa caut erorile
Sub processFile()
Set f = fso.openTextFile(fileName)
Do until f.atendofstream
  For Each val in errors
				 MsgBox "eroare aici " & f.readline & " " & val
  Next
	Loop
f.close
End Sub


Ia, cred ca i-am dat de cap: pentru fiecare rand, o procedura separata care trece prin array.
Se poate mai elegant?

Sub processFile()
Set f = fso.openTextFile(fileName)
Do until f.atendofstream
	 processLine(f.readline)
Loop
f.close
End Sub

sub processLine(currentLine)
for each val in errors
  msgbox (val & " " & currentLine)
next
end sub



#2
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 28,794
  • Înscris: 10.08.2005
parca asa, a trecut ceva timp
Private Sub readLines()
Dim strLine As String
Open path For Input As #id
	Do While Not EOF(id)
		Line Input #id, strLine
	 REM process here
	Loop
Close #id
End Sub


Edited by MarianG, 28 February 2019 - 00:35.


#3
addysoftware

addysoftware

    Ecological Member :)

  • Grup: Moderators
  • Posts: 7,497
  • Înscris: 12.04.2007
Paseaza randul respectiv ca "string" catre subprocedura de verificare; o sa dau un exemplu acusica.

Sub ProcessFile (sFileName as string)
Dim iFileNr as integer, s as String
iFileNr=FreeFile
Open sFilename for Input as #iFileNr
Do While Not EOF(iFileNr)
		 Line Input #iFileNr, s
		 Call ProcessLine (s)
Loop
Close #iFileNr
End Sub

Deci, chemi subprocedura ProcessLine cu argumentul s.
acu sper ca nu e o mica eroare de sintaxa la Line Input; poate se scrie LineInput

de asemenea, se poate face si in cadrul aceleiasi proceduri, un loop in alt loop; foloseste insa variabilele corespunzatoare.

Limbajul asta modern cu fso si .Net poate fi diferit de "stilul vechi" pe care l-am folosit; cred insa ca exista backward compatibility.

Edited by addysoftware, 28 February 2019 - 03:20.


Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate