28. januar 2005 - 11:02Der 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 :-)
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?
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.
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...
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
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.
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
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
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.
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 :-)
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.