csv Log vraagje

Gewoon even offtopic praten over van alles en nog wat.

Moderator: Moderators

Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

csv Log vraagje

Bericht door Swets »

Ik denk ik gooi het ook even hier in de groep...
tis wel geen CNC , maar wel een hoop slimme mensen hier...

van uit een PLC/HMI verhaaltje krijg ik diverse log files allemaal CSV bestanden.

nu is het zo dat elke variabele zijn eigen file krijg... dus druk-compressor 1 is een file... feedback klep 1 is een andere file...
nu zou ik die in Excel willen hebben in 1 file... zodat ik er een grafiek uit kan toveren....

wel zijn al die files het zelfde opgebouwd... eerste kolom datum, 2de kolom tijd, dan de Data....

dus nu zoek ik een manier om meerder van die files automatisch in 1 werkblad te krijgen...

nog 1 toevoeging... al die files hebben dus datum/tijd maar niet al die files lopen synchroon.... dus tis niet dat ze allemaal beginnen op 20200901 12:00:00

dus ja ik zoek iets... (voor weinig) wat dat allemaal kan... of een macro in excel?

Kortom... iemand enig idee?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: csv Log vraagje

Bericht door hugo stoutjesdijk »

Maar je wilt de log-data uiteindelijk wel synchroon op datum?
Dus alle files openen, 1e regels inlezen, de oudste datum er uit pikken en in een excell-cel plaatsen, en zo loop je alle ingelezen data af.
Steeds als je van 1 file een waarde hebt weggeschreven volgende veld lezen, want die kan nog steeds ouder zijn dan elk van die andere velden.
Als ze wel allemaal met hetzelfde interval meetdata hebben, hoef je alleen het begin te synchroniseren lijkt me.
Dus krijg je lege velden als sommige data op dat tijdstip niet gelogd is.
Ik denk dat ik es in SmallBasic zou gaan knoeien (vroeger deed ik Pascal of Delphi maar nu ik dat allemaal niet meer heb in W10 behelp ik me wel eens met SmallBasic, wat helemaal zo slecht niet is voor een beetje kliederwerk) Ik denk dat de specialisten er een soort speelgoed C# in herkennen, met wat vergevingsgezindere functies.
De echte fanaten zullen wel roepen dat dit een uitgelezen klusje is in Python, maar dan moet je je daar ook weer in gaan verdiepen.

Maar jij hoopt natuurlijk op een tooltje om data weer te geven op datum-tijd en daar meerdere files in te kunnen stoppen.
Misschien Gnuplot? daar heb ik lang geleden wel eens iets mee gedaan, is vast stukken verbeterd en ook onder windows werkend volgens mij.

Even gegoogled, het lijkt er op dat je niet de enige bent, maar deze meneer is er al mee aan de gang gegaan.
https://stackoverflow.com/questions/110 ... ngle-graph
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Ja dat is wel de bedoeling... dat ze op datum/tijd op 1 regel gezet worden....
importeren als dat is nog niet zo moeilijk.... en als ze allemaal helemaal het zelfde zoude zijn, ja dan kan je hele kolom knippen en plakken....

maar dat is juist het rotte...

en ook moet het iets worden waar andere ook mee uit de voeten kunnen...
ik krijg de data wel op de goed plek.... maar nu dat ik zelfs me moeder het kan laten doen... :-)

maar ik ga je link ff bekijken.... bedankt weer!!!
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

ik ben toch maar begonnen iets te proberen in Excel, en VBA...

maar ik heb echt nog nooit wat gedaan Excel dus tja... ik hoop dat er hier mensen zij die een beetje mee willen denken...
( mijn ervaring is dat hier vaak meer zinnige antwoorden gegeven worden , en dat vaak op Excel/proggrammer forums veel mensen die interessant doen, maar er komen eigenlijk nooit antwoorden)

ik denk dat ik maar stukje voor stukje het probeer goed te krijgen.... ik heb al wel in me hoofd hoe het zou moeten.... nu alleen nog even maken... :-)

Code: Selecteer alles

Sub CSV_Import()
Dim ws As Worksheet, strFile As String
 
Set ws = ActiveWorkbook.Sheets("Blad1") 'set to current worksheet name
strFile = Application.GetOpenFilename(Title:="Selecteer het DATA bestand om te openen", FileFilter:="Excel CSV *.csv (*.csv),")
With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A2"))
    .TextFileParseType = xlDelimited
    'geef de scheidingstekens op:
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileCommaDelimiter = False
    .Refresh
End With
End Sub
 
Private Sub Workbook_Open()
CSV_Import
End Sub
ik ben gestart met het bovenstaande... en ik heb een button op me werkblad welke de bovenstaande code start...

als ik op de knop druk, komt het loadfilepopupvenster.... ik kan een file kiezen... en die komt in kolom a1

druk ik nog een keer, kan ik weer een file kiezen, die komt in de kolom A en de andere schuif op naar B...

maar nu zou ik eigenlijk willen, dat hij elke file op een nieuw werkblad zou openen...
(en daar heb ik al wel voorbeeld over gevonden, dus denk dat dat wel ga lukken)
maar nu wil ik eigenlijk ook dat de naam van dat werkblad de naam van de map krijg waar die file uit geladen werd. (of een deel daarvan)
het is namelijk zo dat die files allemaal het zelfde heten.... Dus de logfile van compressor 1 heet L200901.CSV , maar van Compressor 2 ook.... alleen ze staan in verschillende mappen, dus 1 staat in de map Compressor1 en de andere in Compressor 2

is dit te doen? en hoe?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

ik heb nu het onderstaande..
Als ik nu op de button druk, komt hij met de fileOpen popup... daar kan ik bladeren en een file kiezen.
dan zoek ik eerst uit wat de naam is....
dan maak ik een nieuw tabblad aan, en geef hem die naam...
en dan lees ik de file in..

DIt werkt opzich goed...

Moet alleen nog even iets doen aan ExtractFileNaam, want ik wil niet de naam van de csv-file, maar van de map waar hij in staat....

Code: Selecteer alles

Sub CSV_Import()
    Dim ws As Worksheet
    Dim strFile As String
    Dim NewName As String
    
    strFile = Application.GetOpenFilename(Title:="Selecteer het DATA bestand om te openen", FileFilter:="Excel CSV *.csv (*.csv),")
    
    NewName = ExtractFileName(strFile)
    
    AddSheets (NewName)
    
    Set ws = ActiveWorkbook.Sheets(NewName) 'set to current worksheet name
    
    With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A2"))
        .TextFileParseType = xlDelimited
        'geef de scheidingstekens op:
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = True
        .TextFileSpaceDelimiter = True
        .TextFileCommaDelimiter = True
        .Refresh
    End With

End Sub
 
Private Sub Workbook_Open()
    CSV_Import
End Sub

Public Function AddSheets(ByVal NewName As String)
    Sheets.Add.Name = NewName
End Function

Public Function ExtractFileName(ByVal strFullName As String) As String

    Dim p As Integer
    Dim i As Integer
    Dim s As Integer
    
    i = 1
    Do
        p = InStr(i, strFullName, "\", 1)
        If p = 0 Then Exit Do
        s = p
        i = p + 1
    Loop
    s = s + 1
    ExtractFileName = Mid(strFullName, s, Len(strFullName))

End Function

Laatst gewijzigd door Swets op 03 sep 2020 12:24, 1 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: csv Log vraagje

Bericht door hugo stoutjesdijk »

Nou, volgens mij kom je er wel.
Altijd wel leuk om jouw vragen te volgen, die je vaak ook zelf weer beantwoord. :lol:
Maar het klopt wel, als je de vraag goed weet te stellen is het misschien ook makkelijker om je te focussen om het antwoord te vinden.
Maar je oplossing laat zien wat er allemaal mogelijk is.
(ik krijg met elke nieuwere versie van excell steeds lastiger (of helemaal niet) een grafiek van de data zoals ik het wil zien (microsoft eigenwijsheid), maar ben benieuwd naar het resultaat)
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Ja dat heb ik altijd wel... als ik ergens mee bezig ben.... en het lukt niet... dan ga ik vragen...
maar omdat het altijd even duurt voor je antwoord krijg, ga ik onder tussen wel verder... en dan gebeurt het heel vaak dat ik dan het zelf vind... :-)
(moet wel zeggen dat ik super blij ben met Internet en Forums... vroeger fietste ik me de schijt naar de bibliotheek :-) )

maar ja...

onderstaande functie, is ook best wel weer lastig om even te wijzigen....
ik snap hoe die werkt... maar nu hem even aanpassen...

deze functie maakt een string , bijvoorbeeld "D:\testje\Compressor.csv" daar uit maakt hij een nieuwe string "Compressor.csv"

ik snap geloof ik ook hoe die werkt... met die InStr instruktie... die begint vooraan( i=1) in de string te zoeken naar "\" als hij niets vind komt hij terug met een 0, als hij het wel vind komt hij terug met de positie waar hij het gevonden heb.
Dus de eerste keer komt hij terug met 3, dan maakt hij start=3 en i=3+1=4,

dan gaat hij gaat hij weer zoeken, maar start op positie 4.... dan vind hij de \ op position 7 dan maakt hij start=7 en i=7+1=8

dan gaat hij weer zoeken , maar start op position 8... maar dan vind hij geen \ meer, en komt terug met een 0
als hij terug komt met een 0 stapt hij uit de lus....

start is nog de positie van de laatste \ , dus hij tel daar nog ff 1 bij op..
en je heb het begin van naam van de file gevonden...

Maar bij mij heten alle files het zelfde alleen staan ze in verschillende mappen... dus ik wil niet "Compressor.csv" vinden, maar "testje"
(en ik wil dat het altijd goed gaat.... in die voorbeeld zou ik kunnen zeggen als ik de eerste \ gevonden heb ben ik bij de start van de map naam.... )

ik moet iets verzinnen dan ik de een-na-laatste \ ook onthoud... pffff :-)
want tussen de een-na-laatste en laatste staat wat ik zoek....

Code: Selecteer alles

Public Function ExtractFileName(ByVal strFullName As String) As String

    Dim position As Integer
    Dim StartPos As Integer
    Dim start As Integer
    
    i = 1
    Do
        position = InStr(i, strFullName, "\", 1)
        If position = 0 Then Exit Do
        start = position
        i = position + 1
    Loop
    start = start + 1
    ExtractFileName = Mid(strFullName, start, Len(strFullName))

End Function
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: csv Log vraagje

Bericht door hugo stoutjesdijk »

Als je nu van achter naar voren alles weggooid wat geen '\' is, dan gooi je dus de file naam weg. Vervolgens gooi je ook die achterste '\'weg en je mapnaam staat als laatste in de string.
Dus als je dan de plek op zoekt van de laatste '\' die er nog in staat is daarachter de mapnaam.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

https://www.dropbox.com/s/gcd3ke2q91dh3 ... g.png?dl=0

ik snap er ff niets van...

bij die groene pijl, als ik van die Q een S maakt... gaat alles goed....

maar zodra ik er iets anders van maakt krijg ik die 400?

ik heb er ook al een gewoon getal neer gezet.. ook dat niet?
weet ook niet waar die 400 op slaat... verwacht je toch een fout verwijzing in...

ExtractFileName = Mid(strFullName, 10, Len(strFullName))
zou toch gewoon moeten werken?

ik begrijp ook die lengte nog niet helemaal... als je vanaf een beelpaalde plaats een stuk uit die string haal, verwach je toch ook dat die lengte niet de lengte is van de hele string?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

hugo stoutjesdijk schreef: 03 sep 2020 14:09 Als je nu van achter naar voren alles weggooid wat geen '\' is, dan gooi je dus de file naam weg. Vervolgens gooi je ook die achterste '\'weg en je mapnaam staat als laatste in de string.
Dus als je dan de plek op zoekt van de laatste '\' die er nog in staat is daarachter de mapnaam.
C:\Users\asw\Desktop\DataLogVerhaal\DataKondilli\Log\Compressors.Compressor1.Data.Pressure\D2006290.csv

dit is bijvoorbeeld het hele path... maar dat kan overal totaal anders zijn...
alleen is dit stuk " Compressors.Compressor1.Data.Pressure\D2006290.csv" altijd het zelfde... want het HMI gooit het op die manier in een map (die je zelf kan kiezen)

het verhaaltje wat ik nu heb vind : " D2006290.csv"

en ik wil eigenlijk dat "Compressors.Compressor1.Data.Pressure" er uit zien te filteren....

Dus ik moet het stuk hebben tussen de laatste en een-na laatste "\" ...

Code: Selecteer alles

   SearchFromPos = 1
   Do
        FoundPos = InStr(SearchFromPos, strFullName, "\", 1)
        If FoundPos = 0 Then Exit Do
        q = s
        s = FoundPos
        SearchFromPos = FoundPos + 1
   Loop
    s = s + 1
    ExtractFileName = Mid(strFullName, s, Len(strFullName))
en ik dacht, voor ik de laatst gevonden \ positie vind (s=Foundpos) sla ik de vorige gevonden gevonden position op (q=s)
als ik dan uit de loop kom heb ik in S de position van de laatste \ en in q de positie van de ene laatste \ staan

en ik dacht dan een Mid(strFullName,q+1,(s-q))

dus uit de volle string een stuk knippen welke begint op de positie van de een-na-laaste gevonden \ +1 (anders lees je de \ ook) en dan is de lengte het aantal position van de een-na-laaste tot de laatste...

maar ik blijf maar rare errors houden... snap het nog niet helemaal wat ik nu fout doe....
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Code: Selecteer alles

Public Function ExtractFileName(ByVal strFullName As String) As String

    Dim FoundPos As Integer
    Dim SearchFromPos As Integer
    Dim s As Integer
    Dim q As Integer
    
    
   SearchFromPos = 1
   Do
        FoundPos = InStr(SearchFromPos, strFullName, "\", 1)
        If FoundPos = 0 Then Exit Do
        q = s
        s = FoundPos
        SearchFromPos = FoundPos + 1
   Loop
    
    s = s + 1
    
    s = 10

    ExtractFileName = Mid(strFullName, s, Len(strFullName))

End Function
zonder die s=10 werkt het.... als ik die s=10 er voor zet krijg ik een 400 error?
dus ik doe iets verkeerd met die Mid ?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: csv Log vraagje

Bericht door Swets »

Code: Selecteer alles

Public Function ExtractFileName(ByVal strFullName As String) As String

    Dim FoundPos As Integer
    Dim SearchFromPos As Integer
    Dim s As Integer
    Dim q As Integer
    Dim StrTest As String
      
   SearchFromPos = 1
   Do
        FoundPos = InStr(SearchFromPos, strFullName, "\", 1)
        If FoundPos = 0 Then Exit Do
        q = s
        s = FoundPos
        SearchFromPos = FoundPos + 1
   Loop
    
    s = s + 1
    
    'ExtractFileName = Mid(strFullName, s, Len(strFullName))
    
    ExtractFileName = Mid(strFullName, 1, 3)

End Function
ik snap er ff niets van...
StrTest = Mid(strFullName,1,3) geeft geen fout...
ExtractFileName = Mid(strFullName, 1, 3) geeft fout?

iemand enig idee?
http://www.arjan-swets.com (met cnc filmpjes)
Kjelt
Donateur
Berichten: 6259
Lid geworden op: 14 jun 2007 21:51
Locatie: Eindhoven

Re: csv Log vraagje

Bericht door Kjelt »

Swets schreef: 03 sep 2020 15:03 ik snap er ff niets van...
StrTest = Mid(strFullName,1,3) geeft geen fout...
ExtractFileName = Mid(strFullName, 1, 3) geeft fout?

iemand enig idee?
Ik weet niets van excel maar dit is makkelijk gegoogled ;-)
Ja extract is een "reserved word" en mag niet gebruikt worden.

https://www.mrexcel.com/board/threads/n ... rds.61507/
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: csv Log vraagje

Bericht door hugo stoutjesdijk »

Je wilt ook niet de filename er uit hebben, maar een willekeurige string.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Plaats reactie