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.
Einlesen und convertieren von Txt-Dateien
-
- 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)
-
- User
- Beiträge: 88
- Registriert: Freitag 26. September 2014, 14:42
Also so bekomm ich schon mal Werte:
Aber ich hab es immer noch nicht nach dem Trace gesplitet
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)
@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.
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.
-
- 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')
Jetzt könnte ich ihn noch sagen beginn bei der Zeile die mit null anfänget. Wie mach ich das?
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?
@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
-
- 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
@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.
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()