Per Batch einer CSV-Datei Zeilen verpassen
War vor Zeiten schonmal hier, nur irgendwie ist mein Account gelöscht. Daher neuanmeldung
Moinsen =)
Vorhanden ist eine CSV Datei deren Inhalt so hintereinander weggeschrieben wurde und durch ; getrennt ist.
Öffnen mit Excel sorgt nur dafür das ich 2 Zeilen habe, eine Überschrift - Umbruch - Inhalt.
Der Inhalt ist SO durchgeschrieben und durch ; eben getrennt.
Einziges EINDEUTIGES Erkennungszeichen zum Trennen der Zeile in mehrere Zeilen ist die Zeit. Die Informationen der Anlage, die abgefragt wurde, wird Stündlich gemacht. Die Uhrzeit steht mit 00:XX:00 drin.
Über Excel Boardmittel ist das ganze Komplizierter als einer Schildkröte fliegen beizubrnigen, zumindestens das was ich gelesen habe.
Daher mein einfall eines Batchscriptes das die Datei "einließt" und sobald es auf 00:XX:00 Trifft nen Zeilenumbruch macht und dann der Zähler der Zeit +1 geht usw.
Ich habe bisher keinerlei einfälle wie ich das vernünftig in Google suche, noch wie ich bei dem File anfange.
Daher die frage ob eventuell jemand Ansätze hat dieses umzusetzen oder eventuell per Zufall selbst sowas gebastelt hat, an dem ich nur anpassen muss.
Ausgabe sollte dann im endeffekt halt in ner neuen Datei beendet werden, dann in Excel öffnen und nur sagen: Trennzeichen sind ; und ab gehts.
Vielleicht hab ich glück, ansätze würden mir aber auch reichen, dann muss ich halt basteln ;)
Sollten noch Informationen fehlen, fragt einfach =)
Schönen abend noch.
Da Cold.
Moinsen =)
Vorhanden ist eine CSV Datei deren Inhalt so hintereinander weggeschrieben wurde und durch ; getrennt ist.
Öffnen mit Excel sorgt nur dafür das ich 2 Zeilen habe, eine Überschrift - Umbruch - Inhalt.
Der Inhalt ist SO durchgeschrieben und durch ; eben getrennt.
Einziges EINDEUTIGES Erkennungszeichen zum Trennen der Zeile in mehrere Zeilen ist die Zeit. Die Informationen der Anlage, die abgefragt wurde, wird Stündlich gemacht. Die Uhrzeit steht mit 00:XX:00 drin.
Über Excel Boardmittel ist das ganze Komplizierter als einer Schildkröte fliegen beizubrnigen, zumindestens das was ich gelesen habe.
Daher mein einfall eines Batchscriptes das die Datei "einließt" und sobald es auf 00:XX:00 Trifft nen Zeilenumbruch macht und dann der Zähler der Zeit +1 geht usw.
Ich habe bisher keinerlei einfälle wie ich das vernünftig in Google suche, noch wie ich bei dem File anfange.
Daher die frage ob eventuell jemand Ansätze hat dieses umzusetzen oder eventuell per Zufall selbst sowas gebastelt hat, an dem ich nur anpassen muss.
Ausgabe sollte dann im endeffekt halt in ner neuen Datei beendet werden, dann in Excel öffnen und nur sagen: Trennzeichen sind ; und ab gehts.
Vielleicht hab ich glück, ansätze würden mir aber auch reichen, dann muss ich halt basteln ;)
Sollten noch Informationen fehlen, fragt einfach =)
Schönen abend noch.
Da Cold.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 186795
Url: https://administrator.de/forum/per-batch-einer-csv-datei-zeilen-verpassen-186795.html
Ausgedruckt am: 22.12.2024 um 14:12 Uhr
20 Kommentare
Neuester Kommentar
Hallo ColdZero89, welcome back!
Als VBScript mit ein wenig RegEx etwa so:
Grüße
bastla
Als VBScript mit ein wenig RegEx etwa so:
Ein = "D:\Defekt.csv"
Aus = "D:\Repariert.csv"
Set fso = CreateObject("Scripting.FileSystemObject")
T = fso.OpenTextFile(Ein).ReadAll
Set rE = New RegExp
rE.Global = True
rE.Pattern = "(00:[0-2]\d:00)"
fso.CreateTextFile(Aus).Write rE.Replace(T, vbNewLine & "$1")
bastla
Moin Moin,
ok, du hast eine CSV-Datei die du in Excel nutzen willst. Warum fragst du da nicht im Excel-Brett nach einer Lösung?
Einen String mit VBA zu zerlegen ist einfach. Lediglich folgenden Teil-Satz habe ich nicht verstanden:
btw wenn die Datei aus einer Maschine kommt, wird man dort auch einstellen können, dass an irgendeiner Stelle auch ein sinnvoller Zeilenumbruch erfolgen soll.
Oder sind es Paketdaten einer bestimmten Länge? So dass man die Dateninhalte anhand der Informationslänge auswerten kann? (was imho mehr Sinn machen würde, als nach der Uhrzeit zu suchen)
ym2c
/Edit
ups, bastla war mal wieder schneller
/Edit
Grüße aus Rostock
Wolfgang
(Netwolf)
ok, du hast eine CSV-Datei die du in Excel nutzen willst. Warum fragst du da nicht im Excel-Brett nach einer Lösung?
Einen String mit VBA zu zerlegen ist einfach. Lediglich folgenden Teil-Satz habe ich nicht verstanden:
und dann der Zähler der Zeit +1 geht usw.
Wo kommt der Zähler her? und wohin geht er?btw wenn die Datei aus einer Maschine kommt, wird man dort auch einstellen können, dass an irgendeiner Stelle auch ein sinnvoller Zeilenumbruch erfolgen soll.
Oder sind es Paketdaten einer bestimmten Länge? So dass man die Dateninhalte anhand der Informationslänge auswerten kann? (was imho mehr Sinn machen würde, als nach der Uhrzeit zu suchen)
ym2c
/Edit
ups, bastla war mal wieder schneller
/Edit
Grüße aus Rostock
Wolfgang
(Netwolf)
Hallo ColdZero89!
änderst, geht's auch mit VBA ...
In Zeile 5 wird der gesamte Dateiinhalt in einen String ("T") eingelesen.
Die Zeilen 6 bis 8 legen fest, dass per "RegEx" nach allen Teilstrings, die dem Muster
entsprechen, gesucht werden soll.
In Zeile 10 schließlich wird diese Vorgabe genutzt, um die Suche mit einem Ersetzen zu kombinieren und das Ergebnis in die Zieldatei zu schreiben, wobei einfach jeder dem Suchmuster entsprechende Teilstring durch
(letzterer repräsentiert durch
Grüße
bastla
P.S.: Falls Du gesteigerten Wert auf einen Batch legen solltest :
wo nutzt man das? direkt in Excel?
Die gepostete Variante ist Stand-alone als VBScript (Dateityp ".vbs") zu nutzen - wenn Du die Zeile 6 aufSet rE = CreateObject("VBScript.RegExp")
ob du mir erklären könntest was da steht
In der Kurzfassung:In Zeile 5 wird der gesamte Dateiinhalt in einen String ("T") eingelesen.
Die Zeilen 6 bis 8 legen fest, dass per "RegEx" nach allen Teilstrings, die dem Muster
00:<Ziffer von 0 bis 2><beliebige Ziffer>:00"
In Zeile 10 schließlich wird diese Vorgabe genutzt, um die Suche mit einem Ersetzen zu kombinieren und das Ergebnis in die Zieldatei zu schreiben, wobei einfach jeder dem Suchmuster entsprechende Teilstring durch
<Zeilenschaltung><gefundener Teilstring>
$1
) ersetzt wird - oder einfacher: vor jeder Kombination "00:##:00" wird eine Zeilenschaltung eingefügt.Grüße
bastla
P.S.: Falls Du gesteigerten Wert auf einen Batch legen solltest :
@echo off & setlocal
set "Ein=D:\Defekt.csv"
set "Aus=D:\Repariert.csv"
set "R=%temp%\RepariereCSV.vbs"
>"%R%" echo Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile("%Ein%").ReadAll
>>"%R%" echo Set rE=New RegExp:rE.Global=True:rE.Pattern="(00:[0-2]\d:00)"
>>"%R%" echo fso.CreateTextFile("%Aus%").Write rE.Replace(T,vbNewLine ^& "$1")
cscript //nologo "%R%"
Hallo ColdZero89!
Wenn schon Batch, dann aber doch besser gleich nur Batch (ungetestet):
Anmerkung: Tausche total unnötiges "
Hinsichtlich des Suchmusters hast Du ja erfreulicher Weise meinen Fehler mit der Einschränkung bei den Minuten schon behoben.
Was das störende Datum anlangt: Wenn Du den "Pattern"-Wert entsprechend anpasst, kannst Du das verschwinden lassen:
- es wird so nach einem String entsprechend dem Muster
gesucht (und kann daher nur für Anlage 2 verwendet werden), wobei die Jahreszahl allerdings auf Werte im Bereich 2010 bis 2099 beschränkt ist - vor dem Jahrhundertwechsel dann bitte daran denken ...
Da im Suchmuster nur die Uhrzeit in der Klammer steht, wird auch nur diese als
Grüße
bastla
Wenn schon Batch, dann aber doch besser gleich nur Batch (ungetestet):
@echo off & setlocal
set "mydate=%date:~-4%%date:~-7,2%%date:~-10,2%"
move "Minutenmittelwerte*PVU2*.csv" "%Ein%"
set "Ein=PVU2.csv"
set "Aus=PVU2_new.csv"
set "R=%temp%\RepariereCSV.vbs"
>"%R%" echo Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile("%Ein%").ReadAll
>>"%R%" echo Set rE=New RegExp:rE.Global=True:rE.Pattern="([0-2]\d:[0-5]\d:00)"
>>"%R%" echo fso.CreateTextFile("%Aus%").Write rE.Replace(T,vbNewLine ^& "$1")
cscript //nologo "%R%"
move "%Aus%" "Archiv\%mydate%_PUV2.csv"
move "Minutenmittelwerte*PVU1*.csv" "Archiv\%mydate%_PUV1.csv"
del "%Ein%"
.\
" gegen (nur bei Dateinamen/Pfaden ohne Leerzeichen nicht erforderliche) Anführungszeichen ... Hinsichtlich des Suchmusters hast Du ja erfreulicher Weise meinen Fehler mit der Einschränkung bei den Minuten schon behoben.
Was das störende Datum anlangt: Wenn Du den "Pattern"-Wert entsprechend anpasst, kannst Du das verschwinden lassen:
>>"%R%" echo Set rE=New RegExp:rE.Global=True:rE.Pattern="[0-3]\d.[0-1]\d.20[1-9]\d ([0-2]\d:[0-5]\d:00)"
TT.MM.JJJJ hh:mm:ss
Da im Suchmuster nur die Uhrzeit in der Klammer steht, wird auch nur diese als
$1
in die Zieldatei geschrieben.Grüße
bastla
Hallo ColdZero89!
Mit dem Hinweis, dass "
Was die Batch-Version angeht: Es wird ja einfach nur das VBScript durch den Batch erzeugt - so müssen nicht 2 Dateien verwaltet werden ...
Grüße
bastla
P.S.: Ganz exakt wäre übrigens die Pattern-Schreibweise
da ein nicht per "\" maskierter "." für ein beliebiges Zeichen steht ...
Mit dem Hinweis, dass "
\d
" für eine beliebige Ziffer (also in Langform geschrieben "[0-9]
") steht (mehr dazu bei MS themselves), sollte das vielleicht etwas leichter nachvollziehbar sein - die Zeile soll natürlich die Zeile 10 in der Batchversion ersetzen).Was die Batch-Version angeht: Es wird ja einfach nur das VBScript durch den Batch erzeugt - so müssen nicht 2 Dateien verwaltet werden ...
Grüße
bastla
P.S.: Ganz exakt wäre übrigens die Pattern-Schreibweise
[0-3]\d\.[0-1]\d\.20[1-9]\d ([0-2]\d:[0-5]\d:00)
Hallo ColdZero89!
ginge natürlich auch, aber da ja "[0-9]" durch "\d" ersetzt werden kann, genügt auch
oder
(Erklärung siehe Link im vorigen Kommentar) ...
In allen diesen Fällen würden aber natürlich auch Datumswerte aus den Jahren 2000 bis 2009 gefunden.
Grüße
bastla
Mensch die Schulzeiten mit PHP und Java und co ham doch was gebracht.
Dann darf ich Dir auch zumuten, "rE" als Objekt, dessen Eigenschaften "Global" (es sollen alle, nicht nur die erste Fundstelle berücksichtigt werden) und "Pattern" (= Suchmuster) vorweg gesetzt werden, damit danach die Methode "Replace" verwendet werden kann, zu bezeichnen .hast du nun in einer Zeile zusammengefasst? (s.o.)
In Basic ist es erlaubt, mehrere Zeilen mit Trennung durch ":" in eine Zeile zu schreiben.2[0-9][0-9]\d
2\d\d\d
2\d{3}
In allen diesen Fällen würden aber natürlich auch Datumswerte aus den Jahren 2000 bis 2009 gefunden.
Grüße
bastla