Forum: PC-Programmierung cvs Datenzeile in 10 Zeilen verteilt, wieder in 1 Zeile mergen?


von csv_problem (Gast)


Lesenswert?

Hallo,

aus einem Datenerfassungssystem erhalte ich einen CSV Export mit 10 
Werten pro Datenzeile mit einer zeitlichen Auflösung von 1 Minute.

Leider splittet das System den Export pro Datenzeile in 10 Zeilen.

Das ganze sieht dann etwa so aus:
1
23.05.2022 05:59:00;1;;;;;;;;;
2
23.05.2022 05:59:00;;2;;;;;;;;
3
23.05.2022 05:59:00;;;3;;;;;;;
4
23.05.2022 05:59:00;;;;4;;;;;;
5
23.05.2022 05:59:00;;;;;5;;;;;
6
23.05.2022 05:59:00;;;;;;6;;;;
7
23.05.2022 05:59:00;;;;;;;7;;;
8
23.05.2022 05:59:00;;;;;;;;8;;
9
23.05.2022 05:59:00;;;;;;;;;9;
10
23.05.2022 05:59:00;;;;;;;;;;10

Leider kann ich an der Art des Exports nichts ändern. Händisch ändern 
ist eigentlich keine Option, ein Export geht immer über 2 Tage womit 
immer 28800 Zeilen zusammenkommen, anstatt 2880.

Hat jemand einen Tip wie ich die jeweils 10 Datenzeilen wieder in eine 
Zeile zurückc "mergen" kann?

Danke.

von PittyJ (Gast)


Lesenswert?

Mit cut vorne das Datum entfernen.
Dann mit sed alle Semikolons durch Blanks ersetzen.

Dann hat man nur noch die Daten in einer Zeile einzeln.
Fehlt nur noch die jeweils 10 Zeilen zusammen fassen. Dafür habe ich im 
Moment noch keine Idee.
Da gibt es bestimmt was mit einem Shell-Script.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Mit der Programmiersprache deiner Wahl !
Datei zeilenweise in einer Schleife auslesen und dabei einen Zähler
mitführen, der beim Auslesen jeder Zeile um 1 erhöht wird. Dabei mit
Modulo 10 abfragen. Solange Zähler MOD 10 größer 0 ist, den gelesenen 
String
an den bestehenden String anhängen. Wenn Zähler Mod 10 gleich 0 ist,
den eingelesenen String auch noch anhängen und dann in eine 2. Datei
wegschreiben. Dann den 2. String aber mit = "" löschen.

Mit einem Basic - Dialekt würde das etwa so aussehen :
1
Declare String zeile1, zeile2, Int z
2
z = 1
3
zeile2 = ""
4
cls
5
Assign #1, "F:\Modulo.txt"
6
Reset #1
7
Assign #2, "F:\ModTest.csv"
8
Rewrite #2
9
10
WhileNot Eof(#1)
11
  Input #1, zeile1 
12
  If (z Mod 10) > 0
13
     zeile2 = zeile2 + zeile1
14
  ElseIf (z Mod 10) = 0
15
     zeile2 = zeile2 + zeile1
16
     Print #2, zeile2 
17
     zeile2 = ""
18
  EndIf
19
  Inc z
20
EndWhile
21
22
Close #1
23
Close #2
24
25
waitkey

Das ist jetzt zwar in XProfan getippt, aber auch ganz leicht in eine
andere Sprache zu portieren.

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Heinz B. schrieb:
> ganz leicht in eine
> andere Sprache zu portieren.

Challenge accepted!
1
perl -e 'while (<>) { chomp; @x=split/;/; if($d[0] ne $x[0]) { print join(";",@d),"\n"; @d=@x; } for (1..$#x) { $d[$_]=$x[$_] unless $d[$_]}} print join(";",@d),"\n"' test.csv

von imonbln (Gast)


Lesenswert?

csv_problem schrieb:
> Hat jemand einen Tip wie ich die jeweils 10 Datenzeilen wieder in eine
> Zeile zurückc "mergen" kann?

Was willst du denn noch mit den CSV Daten machen? Du siehst viele Wege 
führen nach Rom, daher würde ich Mittel zur Konvertierung dem nach 
gelagerten Prozess unterordnen.

Unter Python könnte man mit Pandas zum Beispiel folgendes machen:
1
    df = pd.read_csv("old.csv", sep=";")
2
    # the first column must be called "Date"
3
    # that depends on the CSV header,
4
    # it may have to be adjusted here.
5
    df2 = df.groupby(df["Date"]).mean()
6
    df2.to_csv("new.csv", sep=";")

von Schlaumaier (Gast)


Lesenswert?

Das geht sogar mit Excel OHNE Programmieren.

Einfach nach Verketten und INDIREKTER Zellen-Adressierung suchen.

Dabei wird die Zelle nicht mit einen festen Wert angesprochen sondern 
mit einen berechneten Wert.

von Fridolin (Gast)


Lesenswert?

Genau, das geht mit Excel-Hausmitteln.
Wenn die Werte in 10 Spalten stehen, daneben 10 Formel-Spalten einfügen, 
in denen sich der Inhalt jeweils durch vertikale(!) Verkettung aus 10 
Original-Zeilen ergibt. Da immer nur eine gefüllt ist, gelangen so alle 
Inhalte auf die gleiche Höhe. Das ganze mit Zeilenzahl modulo 10 
kombiniert und danach gefiltert oder sortiert - fertig.
Bei solchen Dingen sowieso immer eine gute Idee: eine eigene 
Zählerspalte verwenden, dann kann man beliebig rumprobieren und kommt 
trotzdem mit einem Knopfdruck zurück zur Ausgangsreihenfolge.

von P. S. (namnyef)


Lesenswert?

Viele Wege führen nach Rom. Ich würde das wahrscheinlich mit einem 
Python-Skript machen. Entweder mit dem CSV-Modul oder halt Pandas. Dazu 
finden sich im Netz sicher massenhaft Infos.

von Löppt (Gast)


Lesenswert?

Müsste auch mit regexp gehen :D

von Löppt (Gast)


Lesenswert?

Oder alternativ Makros im Texteditor (wäre vermutlich mein erster 
Ansatz)

von lilibet (Gast)


Lesenswert?

PittyJ schrieb:
> Fehlt nur noch die jeweils 10 Zeilen zusammen fassen. Dafür habe ich im
> Moment noch keine Idee.

mit tr

von Schlaumaier (Gast)


Lesenswert?

Fridolin schrieb:
> Wenn die Werte in 10 Spalten stehen, daneben 10 Formel-Spalten einfügen,
> in denen sich der Inhalt jeweils durch vertikale(!) Verkettung aus 10
> Original-Zeilen ergibt.

Viel zu viel arbeit und Quatsch.


in C8 steht : 23.05.2022 05:59:00;1;;;;;;;;;

in C9 steht : 23.05.2022 05:59:00;;2;;;;;;;;

in C10 steht : 23.05.2022 05:59:00;;;3;;;;;;;


in D8 = 8

in e8 steht = 
=VERKETTEN(INDIREKT("c"&D8)&INDIREKT("c"&D8+1))&INDIREKT("c"&D8+2)  <-' 
nur für 3 Zellen muss auf 10 erweitert werden.

In D9 Steht : = d8 + 10

Nun E8 nach E9 kopieren

Dann d9 + E9 nach unten kopieren bis alle erfasst.

Beides Kopieren Mit EXCEL-Kopierfunktion das die Formel angepasst wird. 
!!!!

Das war es.

Der INDIREKT-Befehl verbindet den Buchstaben einer Zelle (Spalte) mit 
der Zeilennummer.   Das ist alles.

Arbeitsaufwand : 5 Minuten.











   INDIREKT("c"&D8)

von Schlaumaier (Gast)


Lesenswert?

Nachtrag:

Hier die Erklärung der Funktion.

https://www.ionos.de/digitalguide/online-marketing/verkaufen-im-internet/excel-indirekt-funktion/

Ps. Das Indirekt ganz unten im mein vorherigen Beitrag habe ich 
vergessen zu löschen. Ich habe den Befehl einfach als Zwischenablage 
kopiert.

von csv_problem (Gast)


Lesenswert?

Εrnst B. schrieb:
> Heinz B. schrieb:
>> ganz leicht in eine
>> andere Sprache zu portieren.
>
> Challenge accepted!
> perl -e 'while (<>) { chomp; @x=split/;/; if($d[0] ne $x[0]) { print
> join(";",@d),"\n"; @d=@x; } for (1..$#x) { $d[$_]=$x[$_] unless $d[$_]}}
> print join(";",@d),"\n"' test.csv


Äh, ok. Muss ich mal ausprobieren. ;-)

imonbln schrieb:
> csv_problem schrieb:
>> Hat jemand einen Tip wie ich die jeweils 10 Datenzeilen wieder in eine
>> Zeile zurückc "mergen" kann?
>
> Was willst du denn noch mit den CSV Daten machen? Du siehst viele Wege
> führen nach Rom, daher würde ich Mittel zur Konvertierung dem nach
> gelagerten Prozess unterordnen.
>
> Unter Python könnte man mit Pandas zum Beispiel folgendes machen:
>     df = pd.read_csv("old.csv", sep=";")
>     # the first column must be called "Date"
>     # that depends on the CSV header,
>     # it may have to be adjusted here.
>     df2 = df.groupby(df["Date"]).mean()
>     df2.to_csv("new.csv", sep=";")

Das klingt schon mal nicht schlecht. Danke.

Schlaumaier schrieb:
> Das geht sogar mit Excel OHNE Programmieren.

Excel bzw. jedwede Software die händischen Aufwand verursacht ist raus, 
es soll gerade mit programmieren funktionieren, da mit der Datei 
automatisiert noch diverse Auswertungen generiert werden.

Ursprünglich hat das auch mal so funktioniert, aber nach einem Update, 
kommt nun nur noch dieser "Datenmüll" beim Export heraus. Das ganze ist 
zwar schon als Bug gemeldet und erkannt, aber bis wann es einen Fix gibt 
oder ob man das ganze erst mit der nächsten Version fixt steht noch in 
den Sternen.

Hätte ich vielleicht im Eingangspost dazuschreiben sollen:

Die fertige CSV Datei soll durch diverse Scripte gehen, welche 
Auswertungen und Berechnungen damit machen. Das meiste ist selbst 
zusammengeklüngeltes C einer anderen Abteilung, es werden aber auch ganz 
profane Python Scripte darauf losgelassen und am Ende kommt Gnuplot noch 
zum Zuge um eine lustige Grafik damit zu generieren.

Insofern erstmal Danke für den Denkanstoß mit pandas und dem Perl 
"Einzeiler".

von Εrnst B. (ernst)


Lesenswert?

csv_problem schrieb:
> Die fertige CSV Datei soll durch diverse Scripte gehen, welche
> Auswertungen und Berechnungen damit machen. Das meiste ist selbst
> zusammengeklüngeltes C einer anderen Abteilung, es werden aber auch ganz
> profane Python Scripte darauf losgelassen und am Ende kommt Gnuplot noch
> zum Zuge um eine lustige Grafik damit zu generieren.
>
> Insofern erstmal Danke für den Denkanstoß mit pandas und dem Perl
> "Einzeiler".

Ich würde dir dann eher zu Python raten (egal ob da mit pandas oder 
selbstgebastelter zeilenweiser Schleife oder sonstwie).

Ohne triftigen Grund baut man in so ein fertiges System keine neue 
Programmiersprache ein, schon garnicht für sowas eher Triviales, und 
erst recht nicht, wenn die niemand im Team so wirklich beherrscht.

Und auch wenn Perl ursprünglich exakt für solche Aufgaben entstanden ist 
(Practical Extraction and Report Language), ist es doch schon etwas in 
die Jahre gekommen.

Solche Einzeiler zu basteln macht zwar Spaß, sie später zu Warten oder 
zu Erweitern eher nicht.

von Fridolin (Gast)


Lesenswert?

Wenn gewisse Schlaumaier hier "Quatsch" schreiben, dann beweist das nur 
deren fehlende Sozialkompetenz. Offenbar hat er sich nicht mal die Mühe 
gegeben, die Antworten vorher richtig zu lesen - geschweige denn sie 
nachzuvollziehen oder gar zu verstehen.
Manuell trägt man genau diese eine Formel in ein Feld ein:
1
=IF(MOD(ROW($A20);10)=1;CONCAT(B20:B29);"")

zieht sie neun Felder nach rechts und kopiert die zehn Felder mit einen 
Doppelklick nach unten. Nun noch die leeren Felder ausfiltern - fertig. 
Das ist nicht bloß lesbarer, sondern dauert höchstens eine Minute.
Tja, man sollte halt nicht nur die Werkzeuge kennen, mit denen man 
arbeitet, sondern sie auch effektv nutzen...

von Schlaumaier (Gast)


Lesenswert?

Fridolin schrieb:
> Offenbar hat er sich nicht mal die Mühe
> gegeben, die Antworten vorher richtig zu lesen - geschweige denn sie
> nachzuvollziehen oder gar zu verstehen.

Pack dir an die eigenen Nase.

csv_problem schrieb:
> Excel bzw. jedwede Software die händischen Aufwand verursacht ist raus,
> es soll gerade mit programmieren funktionieren, da mit der Datei
> automatisiert noch diverse Auswertungen generiert werden.

Lese hilft.

Als ich die Aussage oben geschrieben habe, war davon aber keine Rede.

Meine Erklärung mit Beweisführung später, zeigt weniger den TO sondern 
dir das deine Aussage inkorrekt war.

Bei meiner Lösung muss ich nix "Filtern" . Ich kopiere die Zeile runter 
und habe das Ergebnis.  FERTIG.

Davon abgesehen ist deine Lösung FALSCH. !!!

Wenn ich deine Felder nach Link kopiere steht das Ergebnis in neuen 
Feldern. Wenn ich nun diesen Felder in eine Text-Datei o.ä. kopiere wird 
der Text durch Chr(9) = TAB getrennt, und DAS ist nicht im Sinne des 
Users.

Wenn ich MEIN Ergebnis in eine Text Datei kopiere habe ich am Ende der 
Zeile CR + LF stehen, und der Text ist korrekt wie der TO das will.

LESEN solltest du wenigstens den ersten Beitrag.

Aber da der TO eh kein Excel will, O.K.  Ich hätte das ganze auch locker 
mit anderen Programmiersprachen gelöst. Vermutlich in VB mit 
Parameteraufruf.   Wandler.exe "Quelldatei.txt"  "Zieldatei.txt" , 
starten und fertig.

Vermutlich 20 Zeilen Code.

So was ist  Programmieren für Anfänger. Das habe ich schon vor fast 40 
Jahren so gemacht. in COBOL. !!!

von c-hater (Gast)


Lesenswert?

csv_problem schrieb:

> Excel bzw. jedwede Software die händischen Aufwand verursacht ist raus,
> es soll gerade mit programmieren funktionieren, da mit der Datei
> automatisiert noch diverse Auswertungen generiert werden.

Man kann Excel mit all seinen Features problemlos auch aus eignene 
Programmen heraus benutzen. Insofern ist deine Einwendung also 
grenzdebiler Schwachsinn.

Allerdings ist es natürlich einigermaßen sinnlos, Excel zu benutzen, 
wenn man eh' schon ein eigenes Programm schreiben will und Excel weder 
Quelle noch Ziel der Daten ist.

In diesem Fall muß man einfach nur die gewählte Programmiersprache 
beherrschen, lösbar dürfte das Problem in JEDER beliebigen sein und 
zwar auf weit mehr als nur eine Art...

Dein Problem ist einfach nur: du kannst nix und du weißt nix und willst 
dir die Arbeit von anderen erledigen lassen. Also ein typischer Parasit. 
Ich HASSE Parasiten.

von Schlaumaier (Gast)


Lesenswert?

c-hater schrieb:
> Man kann Excel mit all seinen Features problemlos auch aus eignene
> Programmen heraus benutzen.

STIMMT.

Das mache ich mit meine VB z.b. dauernd.

Ich schreibe ganze Tabellen mit Formeln und Grafik und alles mit VB.

Der Grund ist, ich lese Daten aus sqlite aus, verarbeite die in einer 
bestimmten Form, und übergebe die dann an die Excel-Tabelle. Dann werden 
in einige Felder Kalkulationsformeln geschreiben, andere Felder sind für 
freie Parameter zuständig, etc.

Je nach spätere Eingabe des Users werden dann die Kalkulationen mit 
Grafik etc. ausgeführt. Um Fragen wie : "Wie würde sich eine 
Preiserhöhung von 5 % des Lieferanten auf Umsatz und Marge auswirken" zu 
beantworten.

Und das ich Excel-Daten von Lieferanten in Sqlite-Tabellen zurück lese 
ist ja wohl logisch.

Ich benutze sogar Excel ohne das man es sieht. Schöne Tabellen + 
Grafiken sind so nämlich einfacher zu erstellen. ;)



Ach was das Problem angeht. Ich habe so was wirklich mal als 
Prüfungsaufgabe bekommen in einen EDV-Kurs.  Thema : Serielles Lesen und 
schreiben von Dateien in Quickbasic.  Lang, ne sehr lang ist her. ;)

von Oliver S. (oliverso)


Lesenswert?

csv_problem schrieb:
> Die fertige CSV Datei soll durch diverse Scripte gehen, welche
> Auswertungen und Berechnungen damit machen. Das meiste ist selbst
> zusammengeklüngeltes C einer anderen Abteilung, es werden aber auch ganz
> profane Python Scripte darauf losgelassen und am Ende kommt Gnuplot noch
> zum Zuge um eine lustige Grafik damit zu generieren.

Das klingt danach, als ob eure Firma mehr als nur ausreichende 
Kompetenzen zur Verfügung hätte, das Problemchen in ein paar Minütchen 
zu lösen.

Wie immer in solchen Fällen stellt sich dann die Frage: warum nur macht 
das dort nicht jemand, der sich auskennt?

Oliver

: Bearbeitet durch User
von Ar**karteweiterreicher (Gast)


Lesenswert?

>> Challenge accepted!
>> perl -e 'while (<>) { chomp; @x=split/;/; if($d[0] ne $x[0]) { print
>> join(";",@d),"\n"; @d=@x; } for (1..$#x) { $d[$_]=$x[$_] unless $d[$_]}}
>> print join(";",@d),"\n"' test.csv

>> Unter Python könnte man mit Pandas zum Beispiel folgendes machen:
>>     df = pd.read_csv("old.csv", sep=";")
>>     # the first column must be called "Date"
>>     # that depends on the CSV header,
>>     # it may have to be adjusted here.
>>     df2 = df.groupby(df["Date"]).mean()
>>     df2.to_csv("new.csv", sep=";")


Die zitierten codeschnipsel nur als stellvertretende Beispiele, folgend 
meine weiterführende Gedanken / Manöverkritik.

Ein gezeigter Ansatz war "solange aufeinanderfolgende Eingabezeilen den 
selben Zeitstempel haben, werden deren folgende Datenfelder in eine 
Ausgabezeile zusammengefügt".
Ein anderer Ansatz war "beginnend mit dem ersten Datenfeld, werden exakt 
10 Datenfelder in eine Ausgabezeile zusammengefügt".

Angesichts der Tatsache dass das vorgelegte Eingabedatenformat bereits 
einem (anderswo) getätigten Fehler entstammt, lohnen sich m.M.n. 
folgende zusatzüberlegungen.
Sie zielen darauf ab weitere unerwartete (künftige) Anomalien bzgl. 
Datenformat sinnvoll anzumeckern.

- sind die Zeitstempel wirklich immer exakt sekundengenau identisch oder 
muss ev. ein +/-epsilon an Abweichung toleriert werden?

- kommen echt nur gültige Zeitstempel daher? Oder ist auch mit z.b. 
"25.05.2022 05:67:00;..." zu rechnen?

- die folgenden Datenwerte sind wirklich immer eine Zahl (oder eine 
Zeichenkette)? Kann auch ein "Leerwert" gültig sein?

- wie ist ein allfälliges Quoting geregelt? (ist ';' garantiert nie 
Bestandteil der Daten?)

- sind die 10 Zeilen mit selbem Zeitstempel immer in perfekter 
Reihenfolge? Oder kann es sein dass z.B. die dritte Zeile den fünften 
Wert bringt, der dritte Wert erst mit der fünften Zeile kommt (o.ä)?

- sind es garantiert immer 10 Zeilen welche zusammengehören? Können es 
auch mal weniger sein? (ist dann der 10er-Block ungültig weil 
unvollständig?) ...oder mehr sein? (ist dann eine Zeile einfach doppelt? 
Gibt es doch mehr als 10 Werte? Usw.)

- sind die Zeitstempel strikt auf- oder ab-steigend? Monoton (also im 
gleichbleibenden Abstandsintervall)?

Manchmal sucht man eben bloss einen schnellen fix für kurze Zeit; 
manchmal bleiben jedoch solche Provisorien viiiiieeeeel länger produktiv 
im Einsatz als deren Qualität es rechtfertigt...

Ich persönlich arbeite gerne mit PCREs wie im Modul "re" von Python 
verfügbar, um Sanity-Checks in Daten(zwischen)formate zu implementieren. 
Und sei es auch nur um ohne sichtbarem Effekt einfach die gewissenheit 
zu haben dass das Zeugs "immer noch so ist, wie es immer war", resp. 
einen Alarm zu bekommen bevor das Kind in den Brunnen fällt...

von WIRO (Gast)


Lesenswert?

Als Batchdatei:
1
if %2.==. (
2
  echo Syntax: %0 ^<von_datei^> ^<nach_datei^>
3
  pause
4
  goto :eof)
5
SETLOCAL ENABLEDELAYEDEXPANSION
6
copy nul %2
7
for /f "tokens=*" %%i in (%1) do (
8
  set s_in=%%i
9
  if not !s_in!==!s_in:^;1^;=! set s1=!s_in!
10
  if not !s_in!==!s_in:^;2^;=! set s2=!s_in!
11
  if not !s_in!==!s_in:^;3^;=! set s3=!s_in!
12
  if not !s_in!==!s_in:^;4^;=! set s4=!s_in!
13
  if not !s_in!==!s_in:^;5^;=! set s5=!s_in!
14
  if not !s_in!==!s_in:^;6^;=! set s6=!s_in!
15
  if not !s_in!==!s_in:^;7^;=! set s7=!s_in!
16
  if not !s_in!==!s_in:^;8^;=! set s8=!s_in!
17
  if not !s_in!==!s_in:^;9^;=! set s9=!s_in!
18
  if not !s_in!==!s_in:^;10=! (
19
    set s10=!s_in!
20
    set s_out=!s1!!s2!!s3!!s4!!s5!!s6!!s7!!s8!!s9!!s10!
21
    echo !s_out!>>%2))
22
ENDLOCAL

Gruß
WIRO

von Philipp_K59 (Gast)


Lesenswert?

Ich hatte das problem auch mal.

ich importiere die Daten in Librebase und Merge diese über ein Group By, 
man kann ausgewählte Datensätze dann auch in eine CSV oder Excel Tabelle 
schicken.

Bei mir waren es soviele Daten in hunderten dateien verteilt das ein 
Bashscript zulange gebraucht hätte.

Wenn es immer der gleiche Ablauf an Zeilen ist sollte das bei dir mit 
einem einzeiler funktionieren.

von Daniel A. (daniel-a)


Lesenswert?

Das sollte mit csvsql aus dem csvkit machbar sein:
1
csvsql -H -d ';' --query 'SELECT a,group_concat(b), group_concat(c),group_concat(d),group_concat(e),group_concat(f),group_concat(g),group_concat(h),group_concat(i),group_concat(j),group_concat(k) FROM y GROUP BY a ORDER BY a ASC' y.csv | csvformat -D ';' | sed 1d

von Ich A. (alopecosa)


Lesenswert?

Oliver S. schrieb:
> Das klingt danach, als ob eure Firma mehr als nur ausreichende
> Kompetenzen zur Verfügung hätte, das Problemchen in ein paar Minütchen
> zu lösen.
>
> Wie immer in solchen Fällen stellt sich dann die Frage: warum nur macht
> das dort nicht jemand, der sich auskennt?

Wer sagt denn was von Firma? "Abteilung" kann ja nun alles bedeuten. In 
diesem Fall Forschung.

Ar**karteweiterreicher schrieb:
> - sind die Zeitstempel wirklich immer exakt sekundengenau identisch oder
> muss ev. ein +/-epsilon an Abweichung toleriert werden?
>

Der Zeitstempel ist immer exakt sekundengenau gleich in den 10 Zeilen.

> - kommen echt nur gültige Zeitstempel daher? Oder ist auch mit z.b.
> "25.05.2022 05:67:00;..." zu rechnen?

Es gibt nur gültige Zeitstempel.

> - die folgenden Datenwerte sind wirklich immer eine Zahl (oder eine
> Zeichenkette)? Kann auch ein "Leerwert" gültig sein?

Es gibt nur Werte. "Leerwerte" kommen nicht vor bzw. werden als 0 (Nicht 
NULL) repräsentiert.

>
> - wie ist ein allfälliges Quoting geregelt? (ist ';' garantiert nie
> Bestandteil der Daten?)

Semikolon ist der garantierte Trenner.

> - sind die 10 Zeilen mit selbem Zeitstempel immer in perfekter
> Reihenfolge? Oder kann es sein dass z.B. die dritte Zeile den fünften
> Wert bringt, der dritte Wert erst mit der fünften Zeile kommt (o.ä)?

Die Zeilen sind immer in exakt dergleichen Reihenfolge wie im Beispiel 
dargestellt.

> - sind es garantiert immer 10 Zeilen welche zusammengehören? Können es
> auch mal weniger sein? (ist dann der 10er-Block ungültig weil
> unvollständig?) ...oder mehr sein? (ist dann eine Zeile einfach doppelt?
> Gibt es doch mehr als 10 Werte? Usw.)

Es gibt immer garantiert nur 10 Werte also 10 Zeilen.

> - sind die Zeitstempel strikt auf- oder ab-steigend? Monoton (also im
> gleichbleibenden Abstandsintervall)?

Die Zeitstempel sind immer gleichbleibend im Minutentakt von 0:00 bis 
23:59.


Bisher wurde das ganze von 2 HiWis händisch korrigiert. Die möchte ich 
aber nun entlasten und brauchte Input da ich offensichtlich auf den 
Schlauch stand.

von Daniel A. (daniel-a)


Lesenswert?

Ich A. schrieb:
> Es gibt nur Werte. "Leerwerte" kommen nicht vor bzw. werden als 0 (Nicht
> NULL) repräsentiert.

Ok, dann muss man in meinem csvsql statement SUM statt group_concat 
nehmen. Zumindest angenommen es sind immer Zahlen.

von WIRO (Gast)


Lesenswert?

Mit der etwas kürzeren Batch wird es auch funktionieren:
1
if %2.==. (
2
  echo Syntax: %0 ^<von_datei^> ^<nach_datei^>
3
  pause
4
  goto :eof)
5
SETLOCAL ENABLEDELAYEDEXPANSION
6
copy nul %2
7
for /f "tokens=*" %%i in (%1) do (
8
  set s_in=%%i
9
  if not %%i==!s_in:^;1^;=! (
10
    set s_out=%%i
11
  ) else if %%i==!s_in:^;10=! (
12
    set s_out=!s_out!%%i
13
  ) else (
14
    echo !s_out!%%i>>%2))
15
ENDLOCAL
Gruß
WIRO

von Milchtrinker (Gast)


Lesenswert?

Wer in Lohn und Brot steht und für solchen Kinderkram in Foren fragen 
muss der sollte auf Briefträger umschulen.

von Wolfgang (Gast)


Lesenswert?

csv_problem schrieb:
> Leider kann ich an der Art des Exports nichts ändern. Händisch ändern
> ist eigentlich keine Option, ein Export geht immer über 2 Tage womit
> immer 28800 Zeilen zusammenkommen, anstatt 2880.

In den von dir gezeigten Daten ist nichts zu erkennen, was nach 
Information aussieht, nur Datum, Uhrzeit und eine fortlaufende Nummer.
Vielleicht verrätst du, wie eine Zeile nach der Umformung aussehen soll. 
Jede besser Editor erledigt die Umformung wahrscheinlich mit einem 
vernünftigen Makro.
Also - wie soll das Ergebnis zu deinen Beispieldaten aussehen?

von Zeno (Gast)


Lesenswert?

Das geht in der Bash mit ein paar Zeilen. Die Zeilen Deiner Datei 
enthalten 11 Felder (Datum + 10x Daten). Die Zeilen werden eingelesen, 
per cut in das jeweils aktuelle Feld zerlegt und in der Ausgabevariable 
wieder zusammengefaßt.
Sobald alle 11 Felder zusammengefaßt sind geht das Spiel von vorn los.
Das erste if in der while-Schleife fängt Leerzeilen ab.
1
#!/bin/bash
2
FIELDS=11
3
OUT=""
4
i=0
5
while read LINE
6
do
7
  if [[ -n "${LINE// /}" ]]
8
    i=$(($i+1))
9
    if [ $i -eq 1 ]
10
    then
11
      OUT="$(echo "$LINE" | cut -d ';' -f 1);$(echo "$LINE" | cut -d ';' -f 2)"
12
      i=$(($i+1))
13
    else
14
      OUT="$OUT;$(echo "$LINE" | cut -d ';' -f $i)"
15
    fi
16
    if [ $i -eq $FIELDS ]
17
      echo "$OUT" >> DeineAusgabedatei
18
      OUT=""
19
      i=0
20
    fi
21
  fi
22
done < DATEI

von Philipp_K59 (Gast)


Lesenswert?

Oder das ganze als Einzeiler in Regex..

Muss man nur einen Replace auf nix ("") machen und das bleibt in jeder 
konsole, Programmiersprache, Interpreter oder Powershell ein Einzeiler.

(?:[\r\n]+((\d{2}).(\d{2}).(\d{4}) (\d{2}):(\d{2}):(\d{2})))?;([;]{1})

von Philipp K. (philipp_k59)


Lesenswert?

Noch zum testen hinterher:

https://regex101.com/r/94mcfX/1

Edit: funktioniert nur wenn es für jeden Timestamp auch 10 Einträge wie 
im Beispiel gibt.

: Bearbeitet durch User
von Philipp K. (philipp_k59)


Angehängte Dateien:

Lesenswert?

Löppt schrieb:
> Oder alternativ Makros im Texteditor (wäre vermutlich mein erster
> Ansatz)

Gerade erst gelesen.. in Notepad++ kann man regexp in Suche/Ersetzen 
benutzen, so habe ich mein Regexp  erstellt und getestet.

Alternativ kann man auch zum Beispiel Java nehmen, Code examples gibt es 
ja für diverse Programmiersprachen beim regextester.

Im Anhang noch fix in Javascript als HTML umgesetzt.

von derToto (Gast)


Lesenswert?

oder ein "echter" Einzeiler für die Windows Powershell.
1
(Get-Content -Raw merge.csv ) -replace "([`r`n]+(\d{2}).(\d{2}).(\d{4}) (\d{2}):(\d{2}):(\d{2})[;][^0-9+])|([;]{2})", '' | out-file output.csv

von Karl Käfer (Gast)


Lesenswert?

imonbln schrieb:
> csv_problem schrieb:
>> Hat jemand einen Tip wie ich die jeweils 10 Datenzeilen wieder in eine
>> Zeile zurückc "mergen" kann?
>
> Was willst du denn noch mit den CSV Daten machen? Du siehst viele Wege
> führen nach Rom, daher würde ich Mittel zur Konvertierung dem nach
> gelagerten Prozess unterordnen.
>
> Unter Python könnte man mit Pandas zum Beispiel folgendes machen:
>
>
1
>     df = pd.read_csv("old.csv", sep=";")
2
>     # the first column must be called "Date"
3
>     # that depends on the CSV header,
4
>     # it may have to be adjusted here.
5
>     df2 = df.groupby(df["Date"]).mean()
6
>     df2.to_csv("new.csv", sep=";")
7
>

Der Trick mit "mean" ist echt clever, Respekt! Man könnte die 
Spaltennamen aber auch gleich beim Einlesen erzeugen, wenn die Datei 
keinen Header hat, und / oder n Zeilen des eventuell vorhandenen Headers 
mit "header=<n>" in read_csv() einfach ignorieren, dann wird es ein 
Einzeiler:
1
pd.read_csv('f.csv', sep=';', names=['date']+['col_%d'%(i) for i in range(10)]
2
).groupby('date').agg('mean').to_csv('g.csv', header=False)

von Karl Käfer (Gast)


Angehängte Dateien:

Lesenswert?

csv_problem schrieb:
> Die fertige CSV Datei soll durch diverse Scripte gehen, welche
> Auswertungen und Berechnungen damit machen. Das meiste ist selbst
> zusammengeklüngeltes C einer anderen Abteilung, es werden aber auch ganz
> profane Python Scripte darauf losgelassen und am Ende kommt Gnuplot noch
> zum Zuge um eine lustige Grafik damit zu generieren.

hüstel So gerne ich Gnuplot auch mag, aber... wenn die Daten eh schon 
in einem Pandas-Dataframe vorliegen, kann man sie auch gleich da 
weiterverarbeiten. Simple Plots kann Pandas mit der Funktion 
pandas.DataFrame.plot(), ansonsten sei seaborn wärmstens empfohlen -- 
den Barplot im Anhang habe ich so gemacht:
1
import pandas as pd
2
import seaborn as sns
3
4
df = pd.read_csv('f.csv', sep=';', 
5
    names=['date']+['col_%d'%(i) for i in range(10)]).groupby('date').agg('mean')
6
sns.barplot(data=df)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.