listeneromega
Goto Top

Dateien vergleichen mit fc - zurückgegebene Zeilenlänge

Hallo,
wir arbeiten mit Windows 7; [64].
Die Hauptanwendung auf dem System ist eine Datenbank (FileMaker).
Begleitende Funktionen - Dateien verschieben, vorbereiten etc. - werden per cmd-Systemscripts ausgeführt.
Es soll möglichst bei cmd bleiben; wenn es irgend geht, wollen wir nicht mit unterschiedlichen Scripts (VB o.ä.) arbeiten.

Eines der cmd-Scripts hat den Job, csv-Dateien miteinander verglichen und abweichende Zeilen zur weiteren Bearbeitung in eine neue txt-Datei zu schreiben. Mit dem Befehl fc funktioniert das auch ziemlich gut - so lange ein Datensatz (eine Textzeile) nicht länger ist als 127 Zeichen. Zeilen, die länger sind, werden umgebrochen. Die Datenbank, die die neuen Werte lesen muss, versteht die neue Zeile natürlich als neuen Datensatz - gar nicht gut!

Ich hoffe, Ihr habt da eine Lösung für mich!

Mit besten Grüssen

Martin

Content-Key: 359280

Url: https://administrator.de/contentid/359280

Printed on: April 16, 2024 at 04:04 o'clock

Member: rubberman
Solution rubberman Dec 27, 2017 at 17:50:50 (UTC)
Goto Top
FC hat diesen Bug und es gibt keine Möglichkeit dieses Tool dazu zu bewegen, im ASCII Modus vernünftig zu agieren. Es bleibt die Möglichkeit Dateien in einer Schleife durchzuackern. Aber auch da wird bei 1021 Zeichen Schluss sein, da parallel mit FOR /F und SET /P gearbeitet werden müsste. Dass solche Workarounds die Performance von FC nicht ansatzweise erreichen können, sollte klar sein. Falls du darauf bestehst, ist das schnell runter geschrieben. Ein paar Testdaten und den erwarteten Output solltest du dann aber zur Verfügung stellen.

Steffen
Member: listeneromega
listeneromega Dec 27, 2017 at 21:09:02 (UTC)
Goto Top
Hallo rubberman,
danke für Deine Antwort - auch wenn es nicht gerade ermutigend klingt face-confused
Eine Datei hat maximal 1441 Datensätze / Zeilen (1 Tag, 1 Datensatz pro Minute +1 Kopfzeile).
Ein Datensatz kennt maximal 27 Fliesskomma-Werte. Die Werte sind per Semikolon getrennt.
Ein Wert besteht gewöhnlich aus höchstens 8 Zeichen.
Etwa alle 10 min. wird die Datei aktualisiert. Wenn ich jedes Mal (jede Minute) alle Werte in die Datenbank hole und dann erst um die bereits geholten Werte bereinige ... naja, von Performance traue ich mich dann gar nicht mehr zu sprechen.
Da die neuen Werte jeweils hinten angehängt sind, war es natürlich naheliegend, die alte Datei als Referenz zu behalten und damit alle alten Datensätze 'rauszufiltern.
Wenn sich die 1021 auf eine Zeile bezieht, bin ich frohen Mutes. Wenn damit das Limit der gesamten csv gemeint ist, brauchen wir in diese Richtung nicht weiter denken.
Ich stell Dir mal die Muster-Dateien rein:
Neue CSV - also die neu gelieferten Werte
vorhergehende Referenzdatei - also die Werte, die die Datenbank schon kennt
das gewünschte Ergebnis
Im endgültigen Ergebnis muss eine Zeile über den Daten stehen (die Datenbank importiert die erste Zeile als vermeintliche Kopfzeile nicht mit), aber das ist nachrangig.
Ich hänge auch noch mal das aktuelle Script mit dran:
cmd-Script
Die ursprünglichen Pfade lasse ich stehen; es ist ja nur für den allgemeinen Ablauf.
Die For-Schleife ist erforderlich weil es nicht nur eine sondern bis zu 15 Dateien sind, die abgeholt werden müssen. Allerdings haben wir im Moment nur eine Datei die mehr als 127 Zeichen in der Zeile stehen hat.

Vielen Dank für Deine Mühe!

Mit besten Grüssen
Martin
Member: rubberman
Solution rubberman Dec 27, 2017 at 22:26:00 (UTC)
Goto Top
Hallo Martin,

wenn ich dich richtig verstanden habe, geht es gar nicht darum dass in bereits bestehenden Daten Änderungen gemacht werden. Es kommen lediglich neue Datensätze (Zeilen) hinzu, richtig? Falls das so ist, dann ist die Lösung einfacher als gedacht.
Beispiel:
@echo off &setlocal

REM Zeilenanzahl der beiden Dateien ermitteln
for /f %%i in ('type "ref.csv"^|find /c /v ""') do set /a "line_cnt_old=%%i"  
for /f %%i in ('type "gka.csv"^|find /c /v ""') do set /a "line_cnt_new=%%i"  
REM Differenz ermitteln
set /a "line_cnt_diff=line_cnt_new-line_cnt_old"  

setlocal EnableDelayedExpansion
<"gka.csv" >"result.txt" (  
  REM Kopf ...
  echo Vergleichen der Dateien blabla

  REM Ignoriere die bereits bekannten Zeilen
  for /l %%i in (1 1 %line_cnt_old%) do set /p "="  

  REM Lese und schreibe die hinzugekommenen Zeilen
  for /l %%i in (1 1 %line_cnt_diff%) do (
    set "ln=" &set /p "ln="  
    echo(!ln!
  )
)
endlocal
Steffen
Member: listeneromega
listeneromega Dec 28, 2017 at 00:49:13 (UTC)
Goto Top
Hallo Steffen,
wow - schnell und handlich gelöst - vielen Dank.
Ja, es kommen immer nur neue Datensätze dazu. Gelegentlich kann es sein, dass mal ein Datensatz unvollständig war, aber das fällt nicht ins Gewicht. Am Ende des Tages erfolgt sowieso noch mal ein vollständiger Abgleich.

Ich hätte mich wohl erst gar nicht an den 127 Zeichen im fc-Befehl festbeissen sollen. Ich bin allerdings überrascht, dass ich zu diesem offenbar bekannten Problem nichts bei Tante G gefunden habe.

Mit den Details in Deinem Script werde ich mich morgen befassen, aber für mich ist es schon jetzt die Lösung.

Problem gelöst, der Faden kann mit einem herzlichen Dankeschön geschlossen werden.

Mit besten Grüssen

Martin