From f04868b7128065c3645a23436222d772fe130f5c Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 10 Jul 2025 20:05:05 +0200 Subject: [PATCH] CSVVisualizer.py aktualisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Standard-Dateiname wird jetzt vom ursprünglichen CSV-Dateinamen abgeleitet: Wenn eine Datei geladen wurde (self.file_label nicht "Keine Datei ausgewählt" ist) Wird die .csv-Erweiterung durch .png ersetzt Beispiel: battery_test_20250710_193945_3.csv → battery_test_20250710_193945_3.png (D) --- CSVVisualizer.py | 91 ++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 34 deletions(-) diff --git a/CSVVisualizer.py b/CSVVisualizer.py index 0f9969c..1810e51 100644 --- a/CSVVisualizer.py +++ b/CSVVisualizer.py @@ -89,46 +89,59 @@ class CSVVisualizer: ) try: - # Lese nur Datenzeilen (ignoriere Kommentare und leere Zeilen) + # Finde die Start- und Endzeilen der Daten skip_rows = 0 - with open(filepath, 'r') as f: - for line in f: - if line.startswith('Time(s)'): - break - skip_rows += 1 - - # Bestimme die letzte Datenzeile (ignoriere alles nach '# TEST SUMMARY') + end_row = None with open(filepath, 'r') as f: lines = f.readlines() - end_row = len(lines) for i, line in enumerate(lines): - if line.startswith('# TEST SUMMARY'): + if line.startswith('Time(s)'): + skip_rows = i + elif line.startswith('# TEST SUMMARY') and end_row is None: end_row = i break - self.df = pd.read_csv( - filepath, - skiprows=skip_rows, - nrows=end_row - skip_rows - 1 if end_row > skip_rows else None, - dtype={ - 'Time(s)': 'float32', - 'Voltage(V)': 'float32', - 'Current(A)': 'float32', - 'Phase': 'str', - 'Discharge_Capacity(Ah)': 'float32', - 'Charge_Capacity(Ah)': 'float32', - 'Coulomb_Eff(%)': 'float32', - 'Cycle': 'int32' - }, - on_bad_lines='warn' - ) - - # Bereinige die Daten - self.clean_data() - - self.file_label.config(text=os.path.basename(filepath)) - self.status_var.set(f"Daten geladen: {len(self.df)} Messungen") - self.update_plot() + # Wenn wir die Header-Zeile gefunden haben + if skip_rows > 0: + # Lese die Daten manuell und bereinige sie + data_lines = [] + for line in lines[skip_rows+1:end_row if end_row else len(lines)]: + # Überspringe Kommentarzeilen und leere Zeilen + if line.strip() and not line.startswith('#'): + data_lines.append(line) + + # Erstelle einen StringIO-Objekt für pandas + from io import StringIO + data_str = '\n'.join(data_lines) + + self.df = pd.read_csv( + StringIO(data_str), + names=['Time(s)', 'Voltage(V)', 'Current(A)', 'Phase', + 'Discharge_Capacity(Ah)', 'Charge_Capacity(Ah)', + 'Coulomb_Eff(%)', 'Cycle'], + dtype={ + 'Time(s)': 'float32', + 'Voltage(V)': 'float32', + 'Current(A)': 'float32', + 'Phase': 'str', + 'Discharge_Capacity(Ah)': 'float32', + 'Charge_Capacity(Ah)': 'float32', + 'Coulomb_Eff(%)': 'float32', + 'Cycle': 'int32' + }, + na_values=['', ' ', 'NaN', 'N/A', 'NA', 'None'], + skip_blank_lines=True + ) + + # Bereinige die Daten + self.clean_data() + + self.file_label.config(text=os.path.basename(filepath)) + self.status_var.set(f"Daten geladen: {len(self.df)} Messungen") + self.update_plot() + else: + messagebox.showerror("Fehler", "Keine gültigen Daten in der Datei gefunden") + self.status_var.set("Keine gültigen Daten") except Exception as e: messagebox.showerror("Fehler", f"Fehler beim Laden:\n{str(e)}") @@ -237,7 +250,17 @@ class CSVVisualizer: ('SVG Vector', '*.svg') ] - default_filename = "adalm1000_plot.png" + # Standard-Dateiname aus dem geladenen CSV-Dateinamen ableiten + if hasattr(self, 'file_label'): + current_file = self.file_label.cget("text") + if current_file != "Keine Datei ausgewählt": + # Entferne .csv Erweiterung und füge .png hinzu + default_filename = os.path.splitext(current_file)[0] + ".png" + else: + default_filename = "adalm1000_plot.png" + else: + default_filename = "adalm1000_plot.png" + filepath = filedialog.asksaveasfilename( title="Grafik speichern", initialfile=default_filename,