Avatar billede adagio Nybegynder
04. november 2002 - 14:55 Der er 19 kommentarer og
1 løsning

Undersøg, og evt. skriv til txt filer

Lige nu har jeg et program, som læser fra forskellige txt filer. Disse text filer er skrevet linje for linje (med '0' eller '1' på diverse linjer) (Jeg ved...ikke specielt professionelt, men jeg er heller ikke pro...)

Problemet er at jeg af og til add'er noget til programmet, som så skal have en ny linje i txt filen, men jeg vil gerne have et program, som autmatisk læser alle filerne igennem (Jeg vil regne med at der ca. er 2-300 txt filer), ser efter om en txt fil, mangler noget info (Som f.eks om det står noget på linje 6 eller ej, hvilket er det linjenr. jeg er nået til nu), hvis der ikke står noget i det felt (dvs. at sidste linje er tomt, så der læses past End of File), så skal der skrives '0' på den linje (altså det skal gemmes i txt filen)

Jeg ved ikke helt hvor jeg skal smide det...om det skal være i programmet, eller om jeg skal lave et nyt (omkonventerings) program...jeg gætter på at det bliver sidst-nævnte...
Avatar billede martin_moth Mester
04. november 2002 - 23:52 #1
Hvad med at lave en filelistbox, og løbe alle filerne igennem, læser hver fil linie for linie og så gør det du nu vil gøre hvis dit og dat er opfyldt:

dim i as integer
dim Filnavn as string
dim Filnummer as integer
dim Linie as string
'Looper gennem alle filer vist i filelistboxen (smid evt. en DriveListBox og en dirlistbox på din form, så man kan vælge hvilken mappe der skal tages filer fra...)
For i=0 to file1.count -1

  'Finder filnavn på aktuel fil (dvs. fil nummer "i")
  If Right(Dir1.Path, 1) = "\" Then
    Filnavn = Dir1.Path & File1.List(i)
  Else
    Filnavn = Dir1.Path & "\" & File1.List(i)
  End If 
 
  'Åbner filen til læsning (for skrivning, brug Output ikke input)
  Filnummer= Freefile
  Open Filnavn For input As #Filnummer
 
  'Læser filen linie for line
  Do While Not EOF(Filnummer)
    Line Input #Filnummer, Linie
    if mid(ltrim(linie),1,1) = "6" then
      msgbox "hurra, der står 6 i filen " & filnavn 
      'Bla bla - gør hvad du nu skal gøre...
    end if 
  Loop

  close filnavn
next i

Smider du en Drivelistbox og en dirlistbox på din form også, får du dem til at "snakke sammen" ved følgende kode:

Private Sub Drive1_Change()
  Dir1.Path = Drive1.Drive
End Sub

Private Sub Dir1_Change()
  File1.Path = Dir1.Path
End Sub

Du kan sætte et filepattern på din file1 ved File1.Pattern = "*.txt"

Håber du kan komme igang - ellers spørg igen :o)
Avatar billede adagio Nybegynder
05. november 2002 - 14:37 #2
Når jeg kører programmet, så siger det "data member not found, og peger på .count i denne linje:

For i = 0 To File1.Count - 1
Avatar billede martin_moth Mester
05. november 2002 - 15:42 #3
Hvis du ikke har filer i dit File1, kan man jo ikke hente f.eks. File1.List(3)

Du kan bare lave en lille test forinden:

if file1.listcount < 1 then
  msgbox "Der er ingen filer..."
  exit sub
End if
Avatar billede adagio Nybegynder
05. november 2002 - 16:04 #4
Problemet er, at der er filer i biblioteket (Kan jeg se i file boxen, og der kommer ingen msgbox frem...)
Avatar billede martin_moth Mester
05. november 2002 - 16:17 #5
Skriv listcount i stedet.

Du ved godt, at VB selv angiver alle muligheder selv - Hvis du skriver list1 og et punktum, kommer der en lilkle boks op - der kan du se hvad man kan vælge... Jeg huskede forkert, og troede det hed count - jeg har ikke lige VB her til at hjælpe mig med mulige forslag :o)
Avatar billede martin_moth Mester
05. november 2002 - 16:18 #6
Hmm - jeg mener : Skriv navnet på en kontrol du har på formen og et punktum, f.eks. "File1." - derefter kommer alle valgmuligheder...
Avatar billede adagio Nybegynder
05. november 2002 - 18:01 #7
Ok, det virker så...men nu har jeg et andet problem...jeg kender ikke lige betydningen af: (dvs, jeg kender if then...men Mid(LTrim... er ikke noget jeg kender...kunne du prøve at forklare det?)

If Mid(LTrim(Linie), 4, 1) = "" Then

Jeg troede at det første tal var linjenr. og det andet tal var længden inde i linje...men så bliver den ved med at vise msg boxen, selvom der står noget i det felt...Kører jeg den anden vej, og siger at det første tal er hvor langt inde i linjen, osv, så viser den aldrig msg boxen...
Avatar billede martin_moth Mester
05. november 2002 - 19:59 #8
søg på Mid i VB - bruges til at finde delstrenge i en streng

Mid(tekst, start, [længde])

Mid("Julemad feder", 3,7) = "lemad f"
Mid("Julemad feder", 4) = "emad feder"

Ltrim fjerner bare alle eventuelle blanktegen først i en streng - søg på Ltrim i hjælpen
Avatar billede martin_moth Mester
05. november 2002 - 20:01 #9
Hmm - jeg kan se, at du måske kunne få gavn af ledt mere forklaring:

  Do While Not EOF(Filnummer) '<- Fortsætter til EOF nås
    Line Input #Filnummer, Linie '<- Læser en NY linie - hver gang denne kode udføres,
' indlæses den næste linie i text-filen ind i variablen "Linie"

  if mid(ltrim(linie),1,1) = "6" then '<- Hvis første tegn i den aktuelle linie er "6" så...
      msgbox "hurra, der står 6 i filen " & filnavn 
      'Bla bla - gør hvad du nu skal gøre...
    end if 
  Loop
Avatar billede adagio Nybegynder
05. november 2002 - 20:07 #10
Ok, tak for forklaringen, dog er det nok ikke det som jeg skal bruge så, da mine txt filer ser således ud: (den gamle) (for at give et eksempel)

0
1
3
0
5

Tallene er tilfældige, men alle tal der bruges, kan dukke op flere gange i en txt fil...Det den så skal gøre er at se efter om der står noget i linje 6 (hvilket det ikke gør i det "gamle" filer), vis der IKKE står noget i linje 6, så skal den så udføre den der kode til at skrive '0' på linje 6
Avatar billede martin_moth Mester
06. november 2002 - 07:21 #11
Jamen så skriver jeg svaret lidt om - jeg troede du ville noget andet:

dim i as integer
dim j as integer ' <- NY
dim LinieArray() as string '<- NY Array (tabel) med linier i
dim Filnavn as string
dim Filnummer as integer
dim Linie as string

For i=0 to file1.count -1
  If Right(Dir1.Path, 1) = "\" Then
    Filnavn = Dir1.Path & File1.List(i)
  Else
    Filnavn = Dir1.Path & "\" & File1.List(i)
  End If 
  Filnummer= Freefile
  Open Filnavn For input As #Filnummer
  j=0    ' <- NY
  Do While Not EOF(Filnummer)
    Line Input #Filnummer, liniearray(j) '<- NY Læser linier ind i array
    j=j+1 'j = linienummer ' <- NY
  Loop
  close filnummer
  'Hvis j < 6 er der under 6 linier i filen - herfra er alt vist nyt:
 
  if j < 6 then
    Filnummer= Freefile
    Open Filnavn For output As #Filnummer ' <- Bemærk, at der står Output!
    for j=lbound(liniearray) to ubound(liniearray)
      Print #FilNummer, liniearray(j) '<-Skriver linier til filen igen
    next j
    Print #FilNummer, "0" '<- tilføjer en ny linie i filen
  end if
next i

Som før - jeg har ikke lige VB, så der kan optræde en lille stavefejl hist og pist - men mon ikke du fanger ideen, som er:

1) Åben filen for læsning, læs alle linier ind i et array og luk filen
2) Tjek hvor mange linier der var i filen
3) Var der under 6 linier åbnes filen for SKRIVNING og overskrives med linierne fra arrayet - på det punkt er filen bare "genskabt"
4) Der TILFØJES en ekstra linie i filen

/Martin
Avatar billede martin_moth Mester
06. november 2002 - 07:22 #12
Sorry - skift 6 ud med 5, for arrayet tæller jo med 0 som den første post. Dvs. hvis j < 5 then...
Avatar billede adagio Nybegynder
06. november 2002 - 13:46 #13
Af det af koden, som jeg kender, så ser det rigtigt ud, og det ser ikke ud til at være nogen stavefejl, men den bliver ved med at skrive "subript out of range" til denne linje:

Line Input #Filnummer, LinieArray(j)
Avatar billede martin_moth Mester
06. november 2002 - 14:07 #14
Gør den det ved første fil eller først ved fil nr. 2 (dvs. hvad er "i")?
Og hvad er værdien af "j" når fejlen kommer?

(hold musen over variablen i break-mode, så vises værdien)
Avatar billede adagio Nybegynder
06. november 2002 - 14:12 #15
Det sker ligeså snart at jeg starter programmet, jeg når ikke at se formen, så jeg kan ikke komme ind i break mode
Avatar billede martin_moth Mester
06. november 2002 - 14:29 #16
Jo du kan - du går bare tilbage til VB når fejlen kommer...

Jeg har lige fået fat i en anden PC, for det her kan jo ikke blive ved. Der var stadig et par småfejl i min kode, så jeg har skrevet den lidt om så den virker nu (og ER testet for første gang;o)

PS: Grunden til at du får fejlen er, at arrayet ikke er blevet dimensioneret - derfor kan du ikke kalde posten LinieArray(0)...

Her er koden - copy, paste, vær glad og spørg hvis der er noget du ikke forstår:

Private Sub Command1_Click()
Dim i As Integer
Dim j As Integer ' <- NY
Dim LinieArray() As String '<- NY Array (tabel) med linier i
Dim Filnavn As String
Dim Filnummer As Integer
Dim Linie As String

For i = 0 To File1.ListCount - 1
 
'Finder filnavn
  If Right(Dir1.Path, 1) = "\" Then
    Filnavn = Dir1.Path & File1.List(i)
  Else
    Filnavn = Dir1.Path & "\" & File1.List(i)
  End If
 
'Tæller antal linier i filen
  Filnummer = FreeFile
  Open Filnavn For Input As #Filnummer
  j = 0
  Do While Not EOF(Filnummer)
    Line Input #Filnummer, Linie
    j = j + 1
  Loop
  Close Filnummer
 
'Redimensionerer arrayet til at indeholde fra 0 til j pladser
  ReDim LinieArray(j)
 
'Indlæser i array
  Filnummer = FreeFile
  Open Filnavn For Input As #Filnummer
  j = 0
  Do While Not EOF(Filnummer)
    Line Input #Filnummer, LinieArray(j)
    j = j + 1 'j = linienummer ' <- NY
  Loop
  Close Filnummer
 
  'Skriver fra array til fil og tilføjer ny linie
  If j < 6 Then
    Filnummer = FreeFile
    Open Filnavn For Output As #Filnummer
    For j = LBound(LinieArray) To UBound(LinieArray) - 1
      Print #Filnummer, LinieArray(j)
    Next j
    Print #Filnummer, "0"
    MsgBox "Der blev skrevet til filen " & Filnavn
  End If
  Close Filnummer
 
Next i
End Sub
Avatar billede martin_moth Mester
06. november 2002 - 14:31 #17
PS: Når fejlen kommer LIGE når programmet starter, må det være fordi du har lagt koden i f.x. Form_Load. Det er måske ikke HELT så smart, mon ikke hellere du skulle lægge koden i en Command1_Click...
Avatar billede adagio Nybegynder
06. november 2002 - 15:01 #18
Damn...det slette lige mit svar...

Men kort og godt: Det virker nu, så tak for hjælpen

Grunden til at den kører koden fra start, er at det er programmets eneste funktion, efter fuldendt opdatering lukkes programmet ned igen, så det eneste man ser, er en MsgBox som siger at filerne er opdateret
Avatar billede martin_moth Mester
06. november 2002 - 15:42 #19
OK - så behøver du ikke drive1 og dir1, som jeg kom ind på i starten...

Du bør nok sikre dig, at stien er korrekt, så hvis alle filerne ligger i sammen med mappen, så sætte file1.path = app.path ;o)
Avatar billede adagio Nybegynder
06. november 2002 - 20:43 #20
Jeg brugte drive1 og dir1 til at tjekke om jeg nu også havde skrevet det rigtige bibliotek :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Riskpoint A/S (Riskpoint Solutions Limited)

IT Business Analyst

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Analytiker til Security Operationscenter i Cyberdivisionen Hvidovre

Capgemini Danmark A/S

Open Application (Denmark)

Unik System Design A/S

QA Engineer for AI-first development