Einlesen und convertieren von Txt-Dateien

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Hi,
und zwar hab ich eine sehr lange txt Datei die folgender maßen aufgebaut ist:

[Trace.8389]
0;0;26.092227935791;-6.77717351913452;-0.122081476822495
1;0.5;25.7060890197754;-6.78669500350952;-0.12099138610065
2;1;25.8580360412598;-6.78311920166016;-0.12584039842089
3;1.5;26.1734962463379;-6.77557373046875;-0.129995991041263
Date.Year;2015
Date.Month;7
Date.Day;5
Time.Hour;16
Time.Minute;13
Time.Second;27

[Trace.8390]
0;0;26.4484901428223;-6.7680025100708;-0.124572464202841
1;0.5;25.9849891662598;-6.77938222885132;-0.122576119874914
2;1;26.0491065979004;-6.7779483795166;-0.125343568747242
3;1.5;26.3807716369629;-6.77001953125;-0.127764693275094
Date.Year;2015
Date.Month;7
Date.Day;5
Time.Hour;16
Time.Minute;13
Time.Second;27

Dieses format ist aber sehr ungünstig für weitere verarbeitungen. Ich würde die Daten gern einlesen und mir am Ende in einem anderen Format ausgeben lassen. Zu Beispiel so:

8389;05.07.2016;16:13:27;26.092227935791;25.7060890197754;25.8580360412598;26.1734962463379
8390 05.07.2016;16:23:27;26.448490142822;25.9849891662598;26.0491065979004;26.3807716369629

Kann mir da jemand helfen?
Danke schon mal im Vorraus.
Sirius3
User
Beiträge: 18254
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lienz20013: wo ist denn jetzt das Problem? Code? Fehlermeldung?
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Ich würde halt alles gern in Blöcke teilen nach dem "[Trace." zum beispiel und jeden block einzeln nach minuten Sekunden und so weiter durchsuchen. Zum Beispiel:

Code: Alles auswählen

with open('Dip_Cor_Moxa_raman_8_05_1520160131000534.csv','r') as temp_file:    
        
        text = temp_file.read() 
        
        trace = text.split('[Trace.*')
         
        sec=re.findall(r'Time.Second.*',trace)
        minu=re.findall(r'Time.Minute.*',trace)
        hour=re.findall(r'Time.Hour.*',trace)
        day=re.findall(r'Date.Day.*',trace)
        month=re.findall(r'Date.Month.*'trace)
        year=re.findall(r'Date.Year.*',trace)
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Also so bekomm ich schon mal Werte:

Code: Alles auswählen

with open('Dip_Cor_Moxa_raman_8_05_1520160131000534.csv','r') as temp_file:    
        
        text = temp_file.read() 
        
        #trace = text.split('[Trace.*')
         
        sec=re.findall(r'Time.Second.*',text,re.MULTILINE)
        minu=re.findall(r'Time.Minute.*',text,re.MULTILINE)
        hour=re.findall(r'Time.Hour.*',text,re.MULTILINE)
        day=re.findall(r'Date.Day.*',text,re.MULTILINE)
        month=re.findall(r'Date.Month.*',text,re.MULTILINE)
        year=re.findall(r'Date.Year.*',text,re.MULTILINE)
Aber ich hab es immer noch nicht nach dem Trace gesplitet
Sirius3
User
Beiträge: 18254
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lienz20013: split verwendet keine regulären Ausdrücke. Die würde ich bei Deinem Problem auch gar nicht verwenden, da ja das Trennzeichen ja eindeutig ein ; ist. Geh doch die Datei zeilenweise durch, das finden des Starts ist ja einfach und dann kommen die Daten bis zur nächsten Leerzeile.
BlackJack

Und die Dateiendung ist `*.csv`. Da würde sich ja irgendwie das `csv`-Modul anbieten um in einem ersten Schritt die Zeilen in Spaltenwerte zu zerlegen.
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Ja und vielleicht sollte ich das mit dem Befehl if machen also so was hier inder Arte:

file = open('*.csv','r')

Code: Alles auswählen

for line in file:
    if line < 112: continue    #ersten 112 Zeilen werden weg gelassen
    if line == "":
      break #bei leerer zeile aufhören    


Jetzt könnte ich ihn noch sagen beginn bei der Zeile die mit null anfänget. Wie mach ich das?
Sirius3
User
Beiträge: 18254
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lienz20013: wenn Du nur einen bestimmten Bereich einer Datei willst, nimm islice:

Code: Alles auswählen

from itertools import islice

for line in islice(file, 112, None):
    # process
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

O.K. bin jetzt schon ein stück weiter ich hab nur noch ein problem mit den Leeren zeilen

Code: Alles auswählen

import numpy as np


input = 'Dip_Cor_Moxa_raman_8_05_1520160122122520.csv'

output = 'Dip_Cor_Moxa_raman_8_05_1520160122122520_korr.csv' 


with open (input, 'r') as in_file,open (output, 'w'):
    
    
    
    
    points = [str(i) for i in range(0,273,1)]
    #points = ["{:02d}".format(x) for x in points]
    
    
    
   # new = np.zeros()
    new_line =np.zeros((1,279))    
    for lines in in_file:
        line = lines.rstrip('\n').split(';')

        if line[]        
        
        if any(s in line for s in ['Trace']):                                  #für Traces
            Trace_nr = line.split('.')[1].split(']')[0]
            new_line[0][0]=Trace_nr
            
        if any(line[0] in s for s in points):                                  #für Daten
            data = line[2]
            new_line[0][int(line[0])]=data
            
        if any(s in line for s in ['Date.Year']):                              #Date
            year = line[1] 
            new_line[0][-1]=year
        
        if any(s in line for s in ['Date.Month']):
            month = line[1]     
            new_line[0][-2]=month
            
        if any(s in line for s in ['Date.Day']):
            day = line[1] 
            new_line[0][-3]=day
            
        if any(s in line for s in ['Time.Minute']):
            minute = line[1] 
            new_line[0][-5]=minute
            
        if any(s in line for s in ['Time.Second']):
            sec = line[1]
            new_line[0][-6]=sec
            
        if any(s in line for s in ['Time.Hour']):
            hor = line[1]
            new_line[0][-4]=hor
BlackJack

@Lienz20013: Du willst ja eigentlich nicht bei der Zeile mit der 0 in der ersten Spalte anfangen sondern bei der mit dem ``[Trace …]``. Ich würde diese Blöcke mit Hilfe `itertools.groupby()` ermitteln, dann kann man eine Funktion schreiben die nur *einen* Block verarbeitet. Also das übliche Vorgehen Probleme in kleinere Teilprobleme zu zerlegen.
BlackJack

Ansatz für die Daten aus dem ersten Beitrag:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import csv
import re
from itertools import groupby, imap, islice
from operator import itemgetter

TRACE_RE = re.compile(r'\[Trace\.(\d+)\]')

get_first = itemgetter(0)
get_second = itemgetter(1)


def load_rows(filename):
    with open(filename, 'rb') as lines:
        for row in csv.reader(lines, delimiter=';'):
            yield row


def iter_sections(rows):
    def stamp_rows():
        section_id = None
        for row in rows:
            if row:
                match = TRACE_RE.match(row[0])
                if match:
                    section_id = match.group(1)
            yield (section_id, row)

    for section_id, group in groupby(stamp_rows(), get_first):
        yield (section_id, imap(get_second, group))


def process_section(section_id, rows):
    rows = iter(rows)
    header = next(rows)
    assert header and header[0].startswith('[Trace.'), header
    result = [section_id]
    values = [row[2] for row in islice(rows, 4)]
    year, month, day, hour, minute, second = (row[1] for row in islice(rows, 6))
    result.append(
        '{0}-{1:>02}-{2:>02}T{3:>02}:{4:>02}:{5:>02}'.format(
            year, month, day, hour, minute, second
        )
    )
    result.extend(values)
    return result


def save_rows(filename, rows):
    with open(filename, 'wb') as out_file:
        csv.writer(out_file, delimiter=';').writerows(rows)


def main():
    rows = load_rows('test.csv')
    processed_sections = (
        process_section(section_id, row)
        for section_id, row in iter_sections(rows)
    )
    save_rows('test2.csv', processed_sections)


if __name__ == '__main__':
    main()
Antworten