22. januar 2007 - 13:56Der er
27 kommentarer og 1 løsning
Hente data fra text fil ?
Hvordan vil jeg kunne hente data ind i en celle, fra en text fil der er placeret i en anden mappe på computeren ? EXEL filen ligger i dokument mappen Data filen ligger på :\Programmer\CCP\EVE\capture\Marketlogs\Derelik - Megacyte - 2007.01.22 124915.txt ) Datafilen kan have samme navn, med undtagelse af dato, og tid (124915 <<--tid "12:49:15)
Textfilen indeholder en række data, separeret med et komma ( , ):
Den første linje er overskriften for hver kolonne, adskilt med et komma. Jeg skal nu have cellen til at hente det tal, der står under typeID, linje 4 (Det er "40"). Denne info, skal ind i en celle i EXEL.
En anden celle, skal tage alle tal under price, og finde gennemsnittet. dvs, EXEL skal tælle antallet af linjer, og dividere den samlede værdi, med antallet af linjer, og derefter vise gennemsnittet i den angivne celle.
Public Sub HentData() Dim Fil As String, Pris() As Variant, X As Long, ID As Long, Str As String Fil = "\Programmer\CCP\EVE\capture\Marketlogs\Derelik - Megacyte - 2007.01.22 124915.txt"
Open Fil For Input As #1 Line Input #1, Str X = 0 Do Line Input #1, Str ReDim Preserve Pris(X) Pris(X) = Val(Split(Str, ",")(0)) ID = Split(Str, ",")(2) X = X + 1 Loop Until EOF(1) Close #1 [A1] = ID [A2] = Application.WorksheetFunction.Sum(Pris) / X
Hvis brugeren skal vælge mellem hvilken fil der skal hentes data fra, skal der måske være en dialog som åbnes, som viser filer fra mappen \Programmer\CCP\EVE\capture\Marketlogs\, eller er det kun det seneste fil der er interessante?
hov, så en fejl jeg selv havde lavet :S Den skal kun finde gennemsnittet af prisen, ud af de rækker hvor "bid" er "false" ... min bøf, undskyld :( (Der er kun én "False" i her linje...)
Public Sub HentData() 'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps, ' 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Dim Fil As String, Pris() As Variant, X As Long, ID As Long, Str As String ' Fil = "\Programmer\CCP\EVE\capture\Marketlogs\Derelik - Megacyte - 2007.01.22 124915.txt" Open Fil For Input As #1 Line Input #1, Str X = 0 Do Line Input #1, Str If Split(Str, ",")(7) = "False" Then ReDim Preserve Pris(X) Pris(X) = Val(Split(Str, ",")(0)) X = X + 1 End If Loop Until EOF(1) Close #1
[A2] = Application.WorksheetFunction.Sum(Pris) / X ' skriver gennemsnit i aktiveark celle A2
Public Sub HentData() 'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps, ' 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Dim Fil As String, Pris() As Variant, X As Long, ID As Long, Str As String Fil = "\Programmer\CCP\EVE\capture\Marketlogs\Derelik - Megacyte - 2007.01.22 124915.txt" If Dir(Fil) <> "" Then Open Fil For Input As #1 Line Input #1, Str X = 0 Do Line Input #1, Str If Split(Str, ",")(7) = "False" Then ReDim Preserve Pris(X) Pris(X) = Val(Split(Str, ",")(0)) X = X + 1 End If Loop Until EOF(1) Close #1
[A2] = Application.WorksheetFunction.Sum(Pris) / X ' skriver gennemsnit i aktiveark celle A2 Else MsgBox " Filen findes ikke" End If End Sub
Nice :) Ved ikke hvad du gjorde, men det virker. Vil den nu selv finde den nyeste version af filen ?
"Derelik - Megacyte - " delen af filnavnet, vil altid være ens. "2007.01.22 124915.txt" Vil altid være forskellig... (124915 = 12:29:15 i digital-tid...)
Tro mig, jeg er henrykt, for dette problem har givet mig mange grå hår :) Men, hvis jeg skal hen og rette lidt over 1000 linjer med filnavne, hver gang jeg skal bruge arket... av :(
Der ligger flere filer der hedder det, men der er kun én fil med en given dato og tid på... Derelik - Megacyte - 2007.01.22 124911.txt Derelik - Megacyte - 2007.01.23 144901.txt Derelik - Megacyte - 2007.01.23 122913.txt Derelik - Megacyte - 2007.01.23 125515.txt Derelik - Megacyte - 2007.01.23 224910.txt
Public Sub HentData() 'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps, ' 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Dim Pris() As Variant, X As Long, ID As Long, Str As String, fileToOpen As Variant fileToOpen = Application.GetOpenFilename("tekstfiler (*.txt), *.txt") If fileToOpen <> False Then Open fileToOpen For Input As #1 Line Input #1, Str X = 0 Do Line Input #1, Str If Split(Str, ",")(7) = "False" Then ReDim Preserve Pris(X) Pris(X) = Val(Split(Str, ",")(0)) X = X + 1 End If Loop Until EOF(1) Close #1
[A2] = Application.WorksheetFunction.Sum(Pris) / X ' skriver gennemsnit i aktiveark celle A2 Else MsgBox " Filen findes ikke" End If End Sub
var så lidt :) Tror dog at jeg må lede efter det der kan finde den nyeste fil automatisk... Der vil blive brugt mange hundreder af filer til opdatering af data, så en stifinder til selv at finde den nyeste, vil være noget af en opgave.
Prøv at teste med denne kode, den skulle kunne læse filnavnene og finde den med den nyeste dato tid .
Public Sub HentData() 'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps, ' 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Dim Pris() As Variant, X As Long, ID As Long, Str As String, fileToOpen As Variant Open FindFil For Input As #1 Line Input #1, Str X = 0 Do Line Input #1, Str If Split(Str, ",")(7) = "False" Then ReDim Preserve Pris(X) Pris(X) = Val(Split(Str, ",")(0)) X = X + 1 End If Loop Until EOF(1) Close #1
[A2] = Application.WorksheetFunction.Sum(Pris) / X ' skriver gennemsnit i aktiveark celle A2
End Sub
Function FindFil() Dim NO As Long, strFilNavn() As Variant, MyPath As String, Dato() As Date Dim Tid As String, i As Long, Nyeste As Date NO = 1 MyPath = "\Programmer\CCP\EVE\capture\Marketlogs\" ReDim Preserve strFilNavn(NO) strFilNavn(NO) = Dir(MyPath & "Derelik - Megacyte*.txt") ' Hent den første filnavn. Do While strFilNavn(NO) <> "" ' Start løkken If strFilNavn(NO) <> "." And strFilNavn(NO) <> ".." Then NO = NO + 1 ReDim Preserve strFilNavn(NO) End If strFilNavn(NO) = Dir ' Hent næste filnavn. Loop NO = NO - 1 ReDim Dato(NO) For i = 1 To NO Tid = Left(Right(strFilNavn(i), 21), 17) Dato(i) = DateSerial(Left(Tid, 4), Mid(Tid, 6, 2), Mid(Tid, 9, 2)) _ + TimeSerial(Mid(Tid, 12, 2), Mid(Tid, 14, 2), Right(Tid, 2)) Next Nyeste = SortArray(Dato) For i = 1 To NO If Dato(i) = Nyeste Then FindFil = MyPath & strFilNavn(i) Exit Function End If Next End Function Function SortArray(RankArray As Variant) Dim Temp As Variant, N As Long, i As Integer, j As Integer Dim swap As Boolean, Col As Integer N = UBound(RankArray) ReDim Temp(Col) swap = True Do While swap swap = False For i = 1 To N - 1 For j = i To N If RankArray(i) > RankArray(j) Then Temp = RankArray(i) RankArray(i) = RankArray(j) RankArray(j) = Temp swap = True End If Next Next Loop SortArray = RankArray(UBound(RankArray)) End Function
Din kode virker dælme :) ...Havd da heller ikke regnet med andet, når man kigger rundt på alle de svar dugiver hist og her :)
Nu kan jeg så begynde at bygge op kan jeg se.. Skal jeg gentage hele ovenstående macro for hver fil der skal hentes ? Eller er der blot en bid der skal kopieres så den passer til et andet filnavn ?
(Derelik er en region, der kan variere, og megacyte er ét mineral af mange :S )
Hvis ikke, hopper jeg slavisk i båden :) Kanon :))) Beklager de sene og underlige svartider, men dagen er sgu lang i dette vejr :(
underligt... Gemmer jeg exel arket inde i EVE mappen, og ændrer MyPath = "\Programmer\CCP\EVE\capture\Marketlogs\" Til MyPath = "\capture\Marketlogs\" eller MyPath = "capture\Marketlogs\"
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.