Avatar billede strandgaard Nybegynder
28. januar 2005 - 11:02 Der er 11 kommentarer og
1 løsning

Læse tekstfil ind i excel

Halløjsa

Nu har jeg virkeligt brug for jer eksperter :-)

Har fået en opgave som jeg nemt selv kunne løse i MatLab, men det har vi ikke licens til her på mit arbejde, så det skal kunne køre i Microsoft Office.

Problemet er at jeg fra et program får en txt fil som jeg gerne vil kunne læse ind i et excel regneark. Da der er en masse fnidder (mange linieskift og ubrugelige tekst) i txt filen som jeg ikke vil have med over i excel, har jeg brug for en lille stump kode der kan læse min txt-fil og så smide de ønskede data ind i excel. Jeg ved det kan lade sig gøre i MatLab, men er ikke sikker på hvordan det virker i Office-miljøet, så måske det ikke er VBA jeg skal bruge???

Hvis der er en der har mod på at hjælpe med "udfordringen" så sender jeg selvfølgelig gerne txt filen så det kan blive mere konkret.

På forhånd tak - jeg ved der er en klog m/k der kan hjælpe mig i min nød :-)
Avatar billede lorentsnv Nybegynder
28. januar 2005 - 13:53 #1
Du kan sende en fil til lnv -at- danor dot dk, så vil jeg se om jeg kan hjælpe dig i weekenden.
Avatar billede strandgaard Nybegynder
01. februar 2005 - 09:58 #2
Har snedt dig en mail med txt-filen, selvom det er lidt forsænket håber jeg du kan hjælpe. Skriv til min mail hvis du mangler flere input ;-)

På forhånd tak
Avatar billede lorentsnv Nybegynder
01. februar 2005 - 10:49 #3
Jeg har modtaget din fil, og  der skal nok en del VBA kode til for at løse dette.
Men spørgsmålet er også om ikke disse data ligger i en database, hvor der måske ville være meget nemmere at trække dataene ud fra.

I din tekstfil er æ,ø, og å 'konverteret' til nogle andre tegn. Dette kunne vi måske også få rigtig, dersom data bliver læst direkte fra database.

Hvilket program generere rapporten, og har du mulighed for at undersøge om du kan få data leveret i andet format?
Avatar billede strandgaard Nybegynder
02. februar 2005 - 08:48 #4
Undskyld de lange svartider, men arbejdet har mig trængt op i en krog :-) Jeg er nødt til lige at kigge lidt nærmere på programmets indstillingsmuligheder for at undersøge om det kan spytte ud i andre formater. Programmet generere selv filen på baggrund af nogle input-data jeg giver det og nogle beregninger den udfører. Jeg tror derfor ikke at data ligger i en database, men det har jeg slet ikke styr på.

Hvis det bliver for stor en omgang med kodning i VBA (altså som en slags makro), så ville det også være rart bare med et kodeeksempel hvoraf jeg kan se hvordan man kan hente data fra en txt fil ind i excel, da jeg ofte får tilsendt data i txtfiler, hvor det kunne være rart at hente data over i excel til videre bearbejdning.
Avatar billede strandgaard Nybegynder
02. februar 2005 - 08:49 #5
Programmmet hedder forresten Mistra, og det beregner brotværsnit, så ved du det ;-) Kan være du kan læse om det på nettet, hvis det skulle ha' din interesse...
Avatar billede lorentsnv Nybegynder
02. februar 2005 - 13:17 #6
Her har du måske noget at starte med.

Jeg har lavet en lille test på læsning af text-fil, og bruger fso-objektet og TextSream. Du skal huske at lave en reference til Microsoft Scripting Runtime objektet i VBA. Det gør du ved at vælge Tools, og derefter References... når du er i Visual Basic editoren, og derefter finde Microsoft Scripting Runtime på listen og krydse af.

I eksemplet her køre jeg bare igennem de første 1000 linier af teksten, og har lavet en Select Case til at checke på kun nogle få ting. Dette skal udbygges, eller laves anderledes. Jeg tror du i tilleg til at checke på teksten, også skal checke på linienummer. Jeg tror en side er x antal linier lang, så ud fra det kan du nok også beregne dig frem til hvor overskrifter o.l. kommer. Det vil måske være hurtigere end at checke i teksten.

I eksemplet her checker jeg kun på de første 5 karakterer. Det var lidt for at det ikke skulle blive så tungt, men den løber de første 1000 linier igennem på et split sekund, så tiden er måske ikke noget problem, forstået på den måde at det måske går rimelig hurtig uanset.

Jeg ahr lavet to sub-rutiner, Tvaersnit og AllOthers. Dette skal selvfølgelig udbygges, hvis du vælger at cheket på teksten hvad indholdet er.

Men her er så koden (Der er også en Do While som er udkommenteret, men det vil nok være den rigtige måde at løbe igennem filen på. Jeg brugte bare For Next, for at afgrænse testen til 1000 linier):

Dim nLine
Dim rng As Range
Dim sLine As String

Sub Test()
Dim fso As New FileSystemObject
Dim ts As TextStream

Set ts = fso.OpenTextFile("C:\Data\BRUD-034 M min.txt")

Set rng = Excel.Worksheets("Sheet1").Range("A1:Z16000")
nLine = 0
For x = 1 To 1000
    sLine = Trim(ts.ReadLine)
    Select Case Left(sLine, 5)
        Case ""
        Case "_____", "¯¯¯¯¯", "====="
        Case "Tv{rs"
            Tvaersnit
        Case Else
            AllOthers
    End Select
Next x

'Do While Not ts.AtEndOfStream

'Loop

ts.Close

End Sub

Sub Tvaersnit()
            nLine = nLine + 1
            rng(nLine, 1).Value2 = Left(sLine, 12)
            rng(nLine, 2).Value2 = Mid(sLine, 13, 7)
End Sub

Sub AllOthers()
            nLine = nLine + 1
            rng(nLine, 1).Value2 = sLine
End Sub
Avatar billede lorentsnv Nybegynder
02. februar 2005 - 13:20 #7
Jeg har sat mit range object, rng, til
Set rng = Excel.Worksheets("Sheet1").Range("A1:Z16000")

Jeg valgte ("A1:Z16000") ud fra tanken om at det må nok være stort nok. Ved at bruge range-objektet, bliver det meget hurtigere end om jeg havde bruget cell-objektet. Range-objektet mener jeg  at jeg skal definere størrelsen på først, og da har jeg bare valgt at vælge et stort range-område som jeg er sikker på at tekstfilen vil passe ind i.
Avatar billede lorentsnv Nybegynder
02. februar 2005 - 13:41 #8
Her har jeg rettet lit på scriptet. Det er langt fra færdig, men jeg tror det er bedre du selv kigger på resten. Du har måske også behov for at strukturere dine data på en anden måde, men her har du i alle fald et udgangspunt til hvordan du kan importere tekst-filer med vba. På min pc, læser den hele filen på 1-2 sekunder.

Dim nLine
Dim rng As Range
Dim sLine As String

Sub Test()
Dim fso As New FileSystemObject
Dim ts As TextStream

Set ts = fso.OpenTextFile("C:\Data\BRUD-034 M min.txt")

Set rng = Excel.Worksheets("Sheet1").Range("A1:Z16000")
nLine = 0
Do While Not ts.AtEndOfStream
    sLine = Mid(ts.ReadLine, 7)
    Select Case Left(sLine, 5)
        Case ""
        Case "_____", "¯¯¯¯¯", "====="
        Case "Tv{rs"
            Tvaersnit
        Case "Snit.", "komb.", "  1 ", "  2 ", "    "
            Snit
        Case Else
            AllOthers
    End Select
Loop

ts.Close

End Sub

Sub Tvaersnit()
            nLine = nLine + 1
            rng(nLine, 1).Value2 = Left(sLine, 12)
            rng(nLine, 2).Value2 = Mid(sLine, 13, 7)
End Sub

Sub AllOthers()
            nLine = nLine + 1
            rng(nLine, 1).Value2 = sLine
End Sub
Sub Snit()
            nLine = nLine + 1
            rng(nLine, 1).Value2 = Trim(Left(sLine, 7))
            rng(nLine, 2).Value2 = Trim(Mid(sLine, 8, 10))
            rng(nLine, 3).Value2 = Trim(Mid(sLine, 19, 15))
            rng(nLine, 4).Value2 = Trim(Mid(sLine, 34, 15))
            rng(nLine, 5).Value2 = Trim(Mid(sLine, 49, 12))
            rng(nLine, 6).Value2 = Trim(Mid(sLine, 61, 15))
End Sub
Avatar billede lorentsnv Nybegynder
02. februar 2005 - 14:31 #9
Jeg har justeret lidt mere på den, så den tager hensyn til forskellige kolonnestruktur ved VIRKNINGSGRAD og SP[NDINGER.

En anden måde at programmere dette på kunne være i VB.NET eller C#.NET hvor du kunne bruge Regulare Expressions, som er et objekt til behandling af tekstfiler. Det kender jeg ikke selv, men det skulle være stærkt til denne type opgaver.

Men er er den justerede kode i VBA:

Dim nLine
Dim rng As Range
Dim sLine As String
Dim sType

Sub Test()
Dim fso As New FileSystemObject
Dim ts As TextStream

Set ts = fso.OpenTextFile("C:\Data\BRUD-034 M min.txt")

Set rng = Excel.Worksheets("Sheet1").Range("A1:Z16000")
nLine = 0
Do While Not ts.AtEndOfStream
    sLine = Mid(ts.ReadLine, 7)
    Select Case Left(sLine, 5)
        Case ""
        Case "_____", "¯¯¯¯¯", "====="
        Case "VIRKN"
            sType = "virkn"
            AllOthers
        Case "SP[ND"
            sType = "spænd"
            AllOthers
        Case "Tv{rs"
            Tvaersnit
        Case "Snit.", "komb.", "  1 ", "  2 ", "  5 ", "  6 ", "    "
            Snit
        Case Else
            AllOthers
    End Select
Loop

ts.Close

End Sub

Sub Tvaersnit()
            nLine = nLine + 1
            rng(nLine, 1).Value2 = Left(sLine, 12)
            rng(nLine, 2).Value2 = Mid(sLine, 13, 7)
End Sub

Sub AllOthers()
            nLine = nLine + 1
            rng(nLine, 1).Value2 = sLine
End Sub

Sub Snit()
    nLine = nLine + 1
    If sType = "virkn" Then
        rng(nLine, 1).Value2 = Trim(Left(sLine, 7))
        rng(nLine, 2).Value2 = Trim(Mid(sLine, 8, 10))
        rng(nLine, 3).Value2 = Trim(Mid(sLine, 19, 15))
        rng(nLine, 4).Value2 = Trim(Mid(sLine, 34, 15))
        rng(nLine, 5).Value2 = Trim(Mid(sLine, 49, 12))
        rng(nLine, 6).Value2 = Trim(Mid(sLine, 61, 15))
    Else
        rng(nLine, 1).Value2 = Trim(Left(sLine, 5))
        rng(nLine, 2).Value2 = Trim(Mid(sLine, 6, 5))
        rng(nLine, 3).Value2 = Trim(Mid(sLine, 11, 7))
        rng(nLine, 4).Value2 = Trim(Mid(sLine, 18, 11))
        rng(nLine, 5).Value2 = Trim(Mid(sLine, 29, 10))
        rng(nLine, 6).Value2 = Trim(Mid(sLine, 39, 11))
        rng(nLine, 7).Value2 = Trim(Mid(sLine, 50, 11))
        rng(nLine, 8).Value2 = Trim(Mid(sLine, 61, 7))
    End If
End Sub
Avatar billede strandgaard Nybegynder
03. februar 2005 - 08:53 #10
Hold da op, du har virkelig været igang, det er sgu´ dejligt. Jeg skynder mig lige at teste det, og så vender jeg tilbage så du kan få dine velfortjente point.
Avatar billede strandgaard Nybegynder
03. februar 2005 - 09:02 #11
SUPER!!! Efter ændring af henvisning til txt filen og konvertering til dansk sprogbrug virker det helt perfekt :-)

Nu har jeg et eksempel at gå ud fra, og så skulle jeg nok kunne regne ud hvordan jeg retter det til. Hvis du smider et svar, sender jeg nogle point i din retning :-)
Avatar billede lorentsnv Nybegynder
03. februar 2005 - 09:04 #12
Ha' en god dag!
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