Seite 1 von 1

Einlesen und convertieren von Txt-Dateien

Verfasst: Donnerstag 3. März 2016, 16:36
von Lienz20013
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.

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Donnerstag 3. März 2016, 16:42
von Sirius3
@Lienz20013: wo ist denn jetzt das Problem? Code? Fehlermeldung?

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Donnerstag 3. März 2016, 17:32
von Lienz20013
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)

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Donnerstag 3. März 2016, 17:35
von Lienz20013
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

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Donnerstag 3. März 2016, 20:49
von Sirius3
@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.

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Donnerstag 3. März 2016, 21:04
von 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.

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Freitag 4. März 2016, 09:46
von Lienz20013
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?

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Freitag 4. März 2016, 10:11
von Sirius3
@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

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Freitag 4. März 2016, 12:05
von Lienz20013
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

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Freitag 4. März 2016, 12:28
von 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.

Re: Einlesen und convertieren von Txt-Dateien

Verfasst: Freitag 4. März 2016, 23:29
von 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()