Avatar billede wraber Praktikant
04. maj 2018 - 14:42 Der er 2 kommentarer

Merge CSV filer i kolonner:

eg har et lille problem.... du måske kan hjælpe med...

Jeg har ca 120 csv filer der skal merges sammen til en lang fil (eller retteer 6x30 filer der skal merges til 6 filer)
filerne ser sådan her ud:

metric,interquartile_arithmetic_mean
measurement_id,34
messages,{'W210': {'text': 'Transitions are too fast.'}}
adc_max,0.10402067309648802
noise_lf_re,8.258117472168418e-05
noise_lf_im,6.656337490626828e-05
noise_hf_re,6.069162849922085e-05
noise_hf_im,6.417820084763103e-05
peak_height_lf_re,-0.001782226270776706
peak_height_lf_im,3.6039908961794963e-05

Jeg skal bruge fra linje 2 til 8.

Jeg kan god finde metoder til at åbne en masser filer og smide dem sammen efter hinanden... altså ned en af men jeg vil gerne have det henad i stedet. altså i kolonnerne. Jeg skal kun bruge navnet på rækken en gang, for de resterende 30 filer skal det kun være værdirene der kopieres med.

Kan man lave en macro eller et script der gør dette lettere end at åbne hver csv fil  kopirer de rette celler ind i et nyt ark???

Mvh Martin
Avatar billede claes57 Ekspert
04. maj 2018 - 20:00 #1
vbs - du kan læse en linje ad gangen
https://www.wiseowl.co.uk/blog/s211/readline.htm
du kan lave en rutine, hvis du placerer alle 30 filer i en mappe og kalder din vbs med første fils navn. Så kan du åbne den og læse første linje med, og derefter læse alle filer i mappen og i dem læse linjer fra 2 til 8 (du læser fra linje 1, men den skriver du bare ikke til den nye samlede fil)
det hele skrives så i en ny fil undervejs - den nye fil åbnes ved start, og du åbner og lukker kildefiler i et loop, og når loop er endt, så lukker du den nye fil.
Avatar billede bvirk Guru
04. maj 2018 - 23:03 #2
Her et eksempel med fast liste af filer - det kan også laves som et mønster hvor de enkelte filnavne dannes i en løkke.

Function rows()
    Dim line, lineNr, row, headings, fn
    rows = Split("", ".")
    Const path = "C:\csvdata\"
   
    For Each fn In Array( _
          "csvdata1.csv" _
        , "csvdata2.csv" _
        , "csvdata3.csv")
        row = ""
        lineNr = 0
        With CreateObject("Scripting.FileSystemObject").OpenTextFile(path & fn, ForReading)
            While Not .AtEndOfStream
                line = .ReadLine
                If Len(line) Then
                    lineNr = lineNr + 1
                    If lineNr > 2 Then
                        If Not IsNull(headings) Then headings = headings & Split(line, ",")(0) & ","
                        row = row & Split(line, ",")(1) & ","
                End If: End If
          Wend
          .Close
        End With
        If Not IsNull(headings) Then
            addrow rows, slice(headings, , -1)
            headings = Null
        End If
        addrow rows, slice(row, , -1)
    Next
End Function

Filen der skal skrives til, fn,  dannes vha følgende der kalder ovenstående:

Sub rows2csv(fn)
    Dim row
    With CreateObject("Scripting.FileSystemObject").CreateTextFile(fn)
        For Each row In rows()
            .WriteLine row
        Next
        .Close
    End With
End Sub

Der er anvendt følgende hjælpefunktioner:

Sub addrow(r, i)
    ReDim Preserve r(UBound(r) + 1)
    r(UBound(r)) = i
End Sub

Function slice(str, Optional start = 0, Optional obEnd)
    If IsMissing(obEnd) Then obEnd = Len(str)
    If obEnd < 0 Then obEnd = Len(str) + obEnd
    If start < 0 Then start = Len(str) + start
    str = Mid(str, start + 1, obEnd - start)
    slice = str
End Function
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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