Hallo Mitglieder des python-forums,
ich bin Programier-Einsteiger und mache derzeit auch eine Ausbildung zum Fachinformatiker - Anwendungsentwicklung.
Mein Arbeitgeber gab mir als Einstiegshilfe in Softwareprogrammierung die Aufgabe eine CSV zu bearbeiten und anschließend in einer neuen CSV abzuspeichern. (Internetrechere ist erlaubt =) )
Die gelieferte CSV sieht wie folgt aus:
4711;20200101;20191216;20191230;JU;72.00;9.00;95;15;9010700;0;
0815;20200101;20191206;20191206;07;8.00;1.00;95;0;9010700;0;
und soll in folgendes "Format" geändert werden:
4711,,,,U,JU,16.12.2019,30.12.2019,9
0815,,,,A,7,06.12.2019,06.12.2019,1
Bisher habe ich durch google-Recherchen gelernt wie eine csv eingelesen, bearbeitet und abgespeichert werden kann.
(Die Beispiele waren recht simpel),
da ich bisher nur sehr wenig Programmiererfahrung habe, ist mir noch unklar
wie ich den Bezug zu den Rows der Ursprungstabelle herstelle und
wie ich bsw. das Datumsformat ändere oder
eine Regel setze wie; Wenn in Row 6 ein JU steht dann schreib in Row 5 ein "U" wenn nicht dann schreib "A"
Ich bitte nicht um einen vollständigen Code, wenn jemand einen LINK mit entsprechdener Thematik postet ist mir schon sehr geholfen.
Ich freue mich über jeden Beitrag und möchte schon vorab ganz herzlich für gemachte Mühe und geschenkte Aufmerksamkeit danken.
mit freundlichen Grüßen
ix42
CSV Bearbeitung
Ja ist mir bekannt, ich nutze PyCharm (empfehlung des BTI), meine mich zu erinnern es in Folge meiner Recherchen und Tests heruntergeladen zu haben.
***aaah, ich verstehe. "CSV modul Python" googeln gibt mir schonmal brauchbarere Informationen als "csv bearbeiten python".++
Vielen Dank, Sparrow.
***aaah, ich verstehe. "CSV modul Python" googeln gibt mir schonmal brauchbarere Informationen als "csv bearbeiten python".++
Vielen Dank, Sparrow.
Zuletzt geändert von ix42 am Mittwoch 12. Februar 2020, 12:37, insgesamt 1-mal geändert.
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@ix42: „Row“ ist die Zeile, ich denke Du meinst „Column” = Spalte, wenn Du „Row“ schreibst.
Arbeite ein Grundlagentutorial zu Python durch um die Grunddatentypen wie Listen, Tupel, Zeichenketten, Zahlen und die Operationen darauf kennen zu lernen.
Und dann Teil das Problem in kleinere Teilprobleme auf. Und die dann wieder in kleinere Teilprobleme, solange bis die Teilprobleme so klein sind, dass man sie mit einer Funktion mit wenigen Zeilen Code lösen kann. Das machst Du dann – einzelne Teilprobleme mit Funktionen lösen. Und die testen. Und wenn eine Teillösung funktioniert, gehst Du zum nächsten Teilproblem weiter. Und am Ende bekommst Du auf diese Weise eine Gesamtlösung.
Teilprobleme können sein: 1. Einlesen der Datei in eine geeignete Datenstruktur. 2. Aus dieser eingelesenen Datenstruktur eine Datenstruktur erstellen die das Ergebnis enthält. 3. Schreiben der Ergebnisdatenstruktur in eine Datei.
1. und 3. sind mit Hilfe des `csv`-Moduls aus der Standardbibliothek recht einfach, und da die Datenstrukturen nach dem einlesen und vor dem schreiben im Grunde gleich sind, kann man 1. und 3. erst einmal ohne 2. machen, also einfach nur die Daten mit einer Funktion einlesen, und mit einer weiteren Funktion unverändert wieder schreiben.
2. Lässt sich wieder zerlegen, denn das umwandeln aller Datensätze enthält als Teilproblem das umwandeln *eines* Datensatzes was man als eigene Funktion heraus ziehen kann.
Das Umwandeln eines Datensatzes besteht aus dem Aufbau eines neuen Datensatzes nach bestimmten Regeln, was unter anderem auch die Umwandlung einzelner Werte in ein anderes Format enthält. So ein Datum von einer Darstellungsart in eine andere Umzuwandeln, ist auch wieder ein Teilproblem für das man eine kleine Funktion schreiben kann.
Arbeite ein Grundlagentutorial zu Python durch um die Grunddatentypen wie Listen, Tupel, Zeichenketten, Zahlen und die Operationen darauf kennen zu lernen.
Und dann Teil das Problem in kleinere Teilprobleme auf. Und die dann wieder in kleinere Teilprobleme, solange bis die Teilprobleme so klein sind, dass man sie mit einer Funktion mit wenigen Zeilen Code lösen kann. Das machst Du dann – einzelne Teilprobleme mit Funktionen lösen. Und die testen. Und wenn eine Teillösung funktioniert, gehst Du zum nächsten Teilproblem weiter. Und am Ende bekommst Du auf diese Weise eine Gesamtlösung.
Teilprobleme können sein: 1. Einlesen der Datei in eine geeignete Datenstruktur. 2. Aus dieser eingelesenen Datenstruktur eine Datenstruktur erstellen die das Ergebnis enthält. 3. Schreiben der Ergebnisdatenstruktur in eine Datei.
1. und 3. sind mit Hilfe des `csv`-Moduls aus der Standardbibliothek recht einfach, und da die Datenstrukturen nach dem einlesen und vor dem schreiben im Grunde gleich sind, kann man 1. und 3. erst einmal ohne 2. machen, also einfach nur die Daten mit einer Funktion einlesen, und mit einer weiteren Funktion unverändert wieder schreiben.
2. Lässt sich wieder zerlegen, denn das umwandeln aller Datensätze enthält als Teilproblem das umwandeln *eines* Datensatzes was man als eigene Funktion heraus ziehen kann.
Das Umwandeln eines Datensatzes besteht aus dem Aufbau eines neuen Datensatzes nach bestimmten Regeln, was unter anderem auch die Umwandlung einzelner Werte in ein anderes Format enthält. So ein Datum von einer Darstellungsart in eine andere Umzuwandeln, ist auch wieder ein Teilproblem für das man eine kleine Funktion schreiben kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Mir wird aus deinen Beispielen die Aufgabe noch nicht ganz klar. Ein Schritt in Richtung einer Loesung ist auf jeden Fall mal, für verschiedene Transformationen jeweils eine Funktion zu schreiben. Also zB eine, die ein Datum im alten Format bekommt, und dann im neuen Format liefert. Die arbeitet dann *NUR* auf einem Wert, und es kommt eine weitere Funktion dazu, die dann diese Transformation auf all den gewuenschten Spalten als Quellen durchfuehrt, und das Resultat in die Zielspalten einfuegt.
Und ebenso eine fuer die verschiedenen anderen Transformationen, je nachdem ob die lokal oder auf der ganzen Zeile durchgefuehrt werden muessen.
Und ebenso eine fuer die verschiedenen anderen Transformationen, je nachdem ob die lokal oder auf der ganzen Zeile durchgefuehrt werden muessen.
@ __blackjack__: Vielen Dank für deinen ausfühlichen Beitrag, gerade in meiner Situation bin ich dankbar für jegliche "allgemeine Programmiertips" wie die Methode des Aufteilens der Probleme in Teilprobleme.
Das habe ich am Rande meiner bisher erst halbjährigen Ausbildung schoneinmal gehört aber nie den Sachverhalt richtig verstanden.
Ich versuche mich in Zukunft stärker danach zu orientieren.
***Du hast Recht, ich meinte Coloums; wie du merkst stecke im in den totalen Anfängen des Programmierens, meinen Dank für deine Nachsichtigkeit. =)
@ __deets__: Danke auch dir für deinen Beitrag.
Ich versuche die Aufgabenstellung genauer zu formulieren;
durch einen Kunden wird regelmäßig eine csv Datei geliefert mit folgenden Aufbau:
Ursprungsformat:
4711;20200101;20191216;20191230;JU;72.00;9.00;95;15;9010700;0;
0815;20200101;20191206;20191206;07;8.00;1.00;95;0;9010700;0;
diese Datei wird zur Zeit noch manuel über Excel in folgendes Format gebracht.
Formatvorlage:
4711,,,,U,JU,16.12.2019,30.12.2019,9
0815,,,,A,7,06.12.2019,06.12.2019,1
Mein Vorgesetzter möchte dass, ich ein Programm schreibe welches automatisch die 1. CSV ließt und nach entsprechender Vorlage (2.CSV) eine 3. CSV erstellt.
(*T)Also Daten der Ursprungsdatei in dem Format der Vorlage darstellen.
Kommatrennung statt Semikolon,
Datumsformat: tt.mm.jjjj statt: jjjjmmtt,
wenn JU in C6 dann U; ansonsten A.,
9 statt 9(.)00
Gemäß der Teilproblem-Methode:
Einlesen CSV
Schreiben CSV + Transformationen (*T)
Speichern CSV
Das habe ich am Rande meiner bisher erst halbjährigen Ausbildung schoneinmal gehört aber nie den Sachverhalt richtig verstanden.
Ich versuche mich in Zukunft stärker danach zu orientieren.
***Du hast Recht, ich meinte Coloums; wie du merkst stecke im in den totalen Anfängen des Programmierens, meinen Dank für deine Nachsichtigkeit. =)
@ __deets__: Danke auch dir für deinen Beitrag.
Ich versuche die Aufgabenstellung genauer zu formulieren;
durch einen Kunden wird regelmäßig eine csv Datei geliefert mit folgenden Aufbau:
Ursprungsformat:
4711;20200101;20191216;20191230;JU;72.00;9.00;95;15;9010700;0;
0815;20200101;20191206;20191206;07;8.00;1.00;95;0;9010700;0;
diese Datei wird zur Zeit noch manuel über Excel in folgendes Format gebracht.
Formatvorlage:
4711,,,,U,JU,16.12.2019,30.12.2019,9
0815,,,,A,7,06.12.2019,06.12.2019,1
Mein Vorgesetzter möchte dass, ich ein Programm schreibe welches automatisch die 1. CSV ließt und nach entsprechender Vorlage (2.CSV) eine 3. CSV erstellt.
(*T)Also Daten der Ursprungsdatei in dem Format der Vorlage darstellen.
Kommatrennung statt Semikolon,
Datumsformat: tt.mm.jjjj statt: jjjjmmtt,
wenn JU in C6 dann U; ansonsten A.,
9 statt 9(.)00
Gemäß der Teilproblem-Methode:
Einlesen CSV
Schreiben CSV + Transformationen (*T)
Speichern CSV
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Weil ich gerade mal was mit Dokumentation testen wollte.

Code: Alles auswählen
#!/usr/bin/env python3
"""
Transform CSV files from customers into CSV file usable for _some other program
or purpose_.
.. todo:: Describe the file formats and other relevant information here.
Input CSV format
----------------
…
Output CSV format
-----------------
…
"""
import csv
from contextlib import closing
from datetime import datetime as DateTime
ENCODING = "ascii"
"""Encoding used for reading and writing the CSV files."""
def load_rows(filename):
with open(filename, "r", encoding=ENCODING) as file:
yield from csv.reader(file, delimiter=";")
def transform_date(string):
"""
Transforms string with date of the form "YYYYMMDD" into "DD.MM.YYYY".
Raises:
ValueError: Given string can not be parsed as a valid date.
Example:
>>> transform_date("20200215")
'15.02.2020'
"""
return format(DateTime.strptime(string, "%Y%m%d"), "%d.%m.%Y")
def transform_integer(string):
"""
Transforms string with a number into a string representation of the same
number as integer without leading zeroes and without any fractional part.
Raises:
ValueError: String is not parseable as number or convertible into an
integer value.
Example:
>>> transform_integer("42")
'42'
>>> transform_integer("007")
'7'
>>> transform_integer("47.11")
'47'
>>> transform_integer("nan")
Traceback (most recent call last):
...
ValueError: cannot convert float NaN to integer
"""
return str(int(float(string)))
def transform_row(row):
"""
Transforms a single row.
Raises:
ValueError: The row has not enough items or transforming of an element
was not possible.
Example:
>>> row = ["4711", "20200101", "20191216", "20191230", "JU",
... "72.00", "9.00", "95", "15", "9010700", "0", ""]
>>> transform_row(row)
['4711', '', '', '', 'U', 'JU', '16.12.2019', '30.12.2019', '9', '']
"""
#
# TODO Use better names in this function.
#
bad_name, _, start_date, end_date, another_bad_name, _, some_number, *_ = (
row
)
is_ju = another_bad_name == "JU"
return [
bad_name,
"",
"",
"",
"U" if is_ju else "A",
another_bad_name if is_ju else transform_integer(another_bad_name),
transform_date(start_date),
transform_date(end_date),
transform_integer(some_number),
"",
]
def save_rows(filename, rows):
with open(filename, "w", encoding=ENCODING) as file:
csv.writer(file, delimiter=",").writerows(rows)
def main():
with closing(load_rows("test.csv")) as rows:
save_rows("test2.csv", map(transform_row, rows))
if __name__ == "__main__":
main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari