Seite 2 von 2

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 8:58
von DerRolf
BJelinek hat geschrieben: Do, 18. Nov 2021 23:23 Hallo Rolf,

man kann doch Jimmys Methode mit Huberst kombinieren.

Immer eine Anzahl Zeilen z.B. 1000 in array einlesen und mit fwrite speichern
dann die nächsten Zeilen in array einlesen und mit fwrite speichern

so lange bis keine Zeilen mehr vorhanden.

Die Gesamtzahl der Zeilen lässt sich ja ermitteln.

Das könnte das 32bit Speicherproblem umgehen, wie bei Hubert mit großen Dateien.


Ich habe aber noch nicht verstanden, was Du willst.

Du hast meherere Excel-Dateien.

Was soll mit den Daten geschehen?

- excel in csv-Dateien wandeln

- excel in dbf-Dateien wandeln
Dies könnte man auch mit LibreOffice machen, da kann man Excel als DBF speichern.

- excel-Daten im Programm verarbeiten

- csv-Dateien in andere csv-Dateien umwandeln
Hallo Bernd.

Ja, mehrere Excel Tabellen, die jeweils in eine DBF zur Weiterverarbeitung gespeichert werden.
Diese CSV Dateien werden beim Export von Excel teilweise mit Anführunszeichen versorgt. Z. B., wenn ein ";" im Feld steht.
Dieses soll ja eigentlich der Feldtrenner sein.
Schöner wird es, wenn " und ; in einem Feld stehen.

Es gibt ein Tool "XLLS Converter". Das funktioniert gut, steigt aber bei den großen Dateien aus.

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 10:33
von AUGE_OHR
hi,
DerRolf hat geschrieben: Fr, 19. Nov 2021 8:35 Problem ist, dass ich momentan auf die Kombi ";"" abfrage, und ändere.
Das ist wie gesagt zu langsam.
sag mal : "was" passiert mit den CSV Dateien :!: "wo" werden die wieder "eingelesen" :?:

wenn man den "Delimiter" ersetzen würde "müsste" die App die es einlesen soll ja "verstehen"

---

Damit stellt sich die Frage ob es eine CSV sein "muss" :?:

gibt es für Excel nicht ein Macro was dir eine JSON Datei erstellen kann :idea:
auch XML wäre ja möglich ... wenn die "andere Apps" es "lesen" kann ...

---

p.s.
man kann auch eine CSV Datei mit "fester Länge", ohne "Delimiter", produzieren (und weiter verarbeiten)

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 10:51
von DerRolf
AUGE_OHR hat geschrieben: Fr, 19. Nov 2021 10:33 hi,

sag mal : "was" passiert mit den CSV Dateien :!: "wo" werden die wieder "eingelesen" :?:

wenn man den "Delimiter" ersetzen würde "müsste" die App die es einlesen soll ja "verstehen"

---

Damit stellt sich die Frage ob es eine CSV sein "muss" :?:

gibt es für Excel nicht ein Macro was dir eine JSON Datei erstellen kann :idea:
auch XML wäre ja möglich ... wenn die "andere Apps" es "lesen" kann ...

---

p.s.
man kann auch eine CSV Datei mit "fester Länge", ohne "Delimiter", produzieren (und weiter verarbeiten)
Hi.
Die CSV wird in eine DBF eingelesen.
JSON Format kenne ich so nicht. Auch beim XML Format wird es schwierig.
CSV in fester Länge wird auch schwierig, da einzelne Felder mehr als 2000 Zeichen beinhalten.

Den anderen Delimiter habe ich getestet. Excel schreibt aber trotzdem seine Anführungszeichen in die CSV.

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 11:23
von Martin Altmann
Rolf,
ist doch auch korrekt! Zeichenfelder werden in „ eingefasst, Felder selber durch ; getrennt.
Du kannst die so erstellte csv wie eine dbf in Xbase++ öffnen und die Sätze in eine dbf importieren. Musst nur die Angaben korrekt setzen (DELDBE_*)

Viele Grüße,
Martin

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 12:01
von AUGE_OHR
hi,
DerRolf hat geschrieben: Fr, 19. Nov 2021 10:51 Die CSV wird in eine DBF eingelesen.
und wie wäre es wenn du, statt der *.CSV, gleich eine *.DBF verschickst ... :-"

---

die Array Methode ist ja die schnellst aber du "könntest" auch "jede Cell lesen"
das kann man direkt mit Excel machen oder mit ADO

---

ActiveX Befehle unter Xbase++ sind nicht schnell ... du solltest "DispHelper" in Ot4Xb ausprobieren.
"DispHelper" kann keine Events "empfangen" aber ohne ist er viel schneller.
wenn du dann mit FELIDGET() / FIELDPUT() arbeitest wird das APPEND BLANK am längsten dauern.

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 12:36
von DerRolf
Martin Altmann hat geschrieben: Fr, 19. Nov 2021 11:23 Rolf,
ist doch auch korrekt! Zeichenfelder werden in „ eingefasst, Felder selber durch ; getrennt.
Du kannst die so erstellte csv wie eine dbf in Xbase++ öffnen und die Sätze in eine dbf importieren. Musst nur die Angaben korrekt setzen (DELDBE_*)

Viele Grüße,
Martin
Hallo Martin.
Eben nicht. Schau doch mal mein Beispiel.

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 12:41
von DerRolf
AUGE_OHR hat geschrieben: Fr, 19. Nov 2021 12:01 hi,

und wie wäre es wenn du, statt der *.CSV, gleich eine *.DBF verschickst ... :-"

---
Wenn du mir sagst wie, dann knie ich den ganzen Tag nieder... :lol:
AUGE_OHR hat geschrieben: Fr, 19. Nov 2021 12:01
die Array Methode ist ja die schnellst aber du "könntest" auch "jede Cell lesen"
das kann man direkt mit Excel machen oder mit ADO

---
Wie sollte das direkt mit Excel gehen?
AUGE_OHR hat geschrieben: Fr, 19. Nov 2021 12:01
ActiveX Befehle unter Xbase++ sind nicht schnell ... du solltest "DispHelper" in Ot4Xb ausprobieren.
"DispHelper" kann keine Events "empfangen" aber ohne ist er viel schneller.
wenn du dann mit FELIDGET() / FIELDPUT() arbeitest wird das APPEND BLANK am längsten dauern.
Wo bekomme ich Infos über den "Disphelper"

Das Problem ist nicht das Befüllen der DBF, sondern die CSV zu bereinigen.

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 12:43
von Martin Altmann
Rolf,
ich sehe von Dir kein Beispiel für denImport der .csv in .dbf
Ein Beispiel dafür:

Code: Alles auswählen

procedure import()
local i
select 1
use xallhund
zap
select 2
DbeSetDefault( "DELDBE" )
DbeInfo( COMPONENT_DATA, DELDBE_DELIMITER_TOKEN, '"' )
DbeInfo( COMPONENT_DATA, DELDBE_FIELD_TOKEN, ';' )
use ( textpfad + "\BERLIN01.CSV" ) via ("DELDBE")
go top
do while .not. eof()
	if .not. ( empty( field->field5 ) .or. empty( field->field6 ) )
		select 1
		append blank
		select 2
		replace xallhund->GESCHLECHT with left( field->field3, 1 )
		replace xallhund->HUNDENAMEN with alltrim( field->field4 )
		replace xallhund->ZUCHTBUCH with alltrim( field->field5 )
		i := dtos( ctod( field->field6 ) )
		replace xallhund->WURFDATUM with right( i, 2 ) + substr( i, 5 ,2 ) + left( i, 4 )
		replace xallhund->PRUEFUNG1 with alltrim( field->field7 )
		replace xallhund->VATER with alltrim( field->field8 )
		replace xallhund->MUTTER with alltrim( field->field9 )
		if ( ( upper( alltrim( field->field10 ) ) == "JA" ) .and. ( empty( field->field11 ) ) )
			replace xallhund->ZUECHTER with alltrim( alltrim( field->field14 ) + " " + alltrim( field->field15 ) )
		else
			replace xallhund->ZUECHTER with alltrim( alltrim( field->field12 ) + " " + alltrim( field->field11 ) )
		endif
		replace xallhund->BESITZERVO with alltrim( field->field14 )
		replace xallhund->BESITZERNA with alltrim( field->field15 )
		replace xallhund->STRASSE with alltrim( field->field17 )
		replace xallhund->NATION with alltrim( field->field18 )
		replace xallhund->PLZ with alltrim( field->field19 )
		replace xallhund->ORT with alltrim( field->field20 )
	endif
	skip
enddo
use
select 1
DbeSetDefault( "DBFNTX" )
sort on zuchtbuch to (datenpfad + "xalldog.dbf" )
use
Viele Grüße,
Martin

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 13:03
von DerRolf
Martin Altmann hat geschrieben: Fr, 19. Nov 2021 11:23 Rolf,
ist doch auch korrekt! Zeichenfelder werden in „ eingefasst, Felder selber durch ; getrennt.
Du kannst die so erstellte csv wie eine dbf in Xbase++ öffnen und die Sätze in eine dbf importieren. Musst nur die Angaben korrekt setzen (DELDBE_*)

Viele Grüße,
Martin
Ich habe es mal visuell dargestellt.
Einmal Excel, und dann die CSV.
temp.pdf
(144.54 KiB) 175-mal heruntergeladen

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 13:32
von Jan
Anführungszeichen in zu exportierenden Zeichenketten gehören ja auch verboten.

Jan

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 14:29
von DerRolf
Jan hat geschrieben: Fr, 19. Nov 2021 13:32 Anführungszeichen in zu exportierenden Zeichenketten gehören ja auch verboten.

Jan
Ja, Jan. Das habe ich auch gesagt!
Aber die Kreativität der Erfasser ist grenzenlos! :lol:

Da habe ich aber leider keinen Einfluss drauf.

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 14:35
von Jan
Rolf,

ich mach da immer ein StrTran(xxx, '"', "") drauf bei Exporten etc. Da bin ich inzwischen ziemlich gnadenlos.

Jan

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 14:40
von DerRolf
Jan hat geschrieben: Fr, 19. Nov 2021 14:35 Rolf,

ich mach da immer ein StrTran(xxx, '"', "") drauf bei Exporten etc. Da bin ich inzwischen ziemlich gnadenlos.

Jan
Wäre ne Maßnahme. Aber das sind dann die ";". :D
Die machenm dann auch keinen Spaß mehr, wenn mann nach ; separiert.

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 17:45
von Wolfgang Ciriack
Ich verstehe immer noch nicht den Umweg über .csv.
Warum nicht die .xlsx-Datei direkt in ein Array einlesen und dann verarbeiten ? Sind diese zu groß, dass das nicht klappt ?

Code: Alles auswählen

oWorkBook := oExcel:WorkBooks:Open(<xlsdatei>)
aValues   := oWorkBook:WorkSheets(1):UsedRange:Value
* NIL -Values entfernen
for i := 1 to l
   for ii := 1 to len(aValues[i])
	if aValues[i, ii] == NIL
           aValues[i, ii] := ""
	endif
   next
next

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 18:51
von HaPe
Hallo Rolf !
Ich verstehe immer noch nicht den Umweg über .csv.
Wolfgang hat mich auf die Idee gebracht ...

Ich habe mir vor 8 Jahren eine Funktion geschrieben um jede XLS/XSLX-Datei in eine DBF zu schreiben.
Dabei gehe ich über eine Text-Datei aber nicht über eine CSV-Datei.
Ich speichere die Felder getrennt mit Tabulatoren und lese dann diese Textdatei ein: TXT-Format (FileFormat = 20 = xlTextWindows)
Das funktioniert bei mir zuverlässig.

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 21:50
von brandelh
Hallo,

meine HBTextReader() Klasse ist in der Wissensbank:

:arrow: https://www.xbaseforum.de/viewtopic.php?f=16&t=7961

das Problem ist, dass meine Klasse keine Zeilenschaltungen innerhalb einer Zeile zulässt, einige CSV Dateien von Excel enthalten solche.
Ansonsten weiß ich nicht was du alles mit der Datei anstellen willst, ich lese große Textdateien ein, welche je Datenfeld eine Zeile enthalten, also etwa 130 Felder je Datensatz und das bei 360.000 Datensätzen, also über einer Million Zeilen.

Ich lese diese Textdateien in eine DBF ein, aber das ist im Prinzip egal, man kann sie auch in eine andere CSV schreiben.

Hier ein verkürztes Verarbeitungsprotokoll:

Code: Alles auswählen

18.10.2021 13:26:10 - Datensätze einlesen, bitte warten ...
18.10.2021 13:59:38 - Es wurden keine Fehler gemeldet.
18.10.2021 13:59:38 - 361.198 Datensätze wurden eingelesen (Dauer: 33 min).
                                        dies entspricht 35.758.603 Zeilen bzw. 513.320.956 Byte.
Also kurz gesagt, 513 MB Datendatei, 361.198 Datensätze (zusammengebaut und in DBF geschrieben) dauert etwa 33 Minuten.

Durch das Einlesen mit meiner Klasse ist man unabhängig von der Dateigröße, solange man die max. Dateigröße nicht überschreitet.
Alle Lösungen die den ganzen Bestand auf einmal in den RAM holen sind schneller (memoread()), wenn es nicht wegen Speichermangel schief geht.

Re: Excel als CSV speichern.

Verfasst: Sa, 20. Nov 2021 8:01
von AUGE_OHR
hi,
DerRolf hat geschrieben: Fr, 19. Nov 2021 12:41
AUGE_OHR hat geschrieben: Fr, 19. Nov 2021 12:01 das kann man direkt mit Excel machen oder mit ADO
Wie sollte das direkt mit Excel gehen?
DerRolf hat geschrieben: Fr, 19. Nov 2021 12:41
AUGE_OHR hat geschrieben: Fr, 19. Nov 2021 12:01 ActiveX Befehle unter Xbase++ sind nicht schnell ... du solltest "DispHelper" in Ot4Xb ausprobieren.
Wo bekomme ich Infos über den "Disphelper"
DerRolf hat geschrieben: Fr, 19. Nov 2021 12:41 Wenn du mir sagst wie, dann knie ich den ganzen Tag nieder... :lol:
Das Problem ist nicht das Befüllen der DBF, sondern die CSV zu bereinigen.
für ADO habe ich kein Xbase++ Sample ... nur harbour HMG
HB_ADO_EXCEL.ZIP
(8.77 KiB) 165-mal heruntergeladen
da aber ActiveX-OOP-Code 100% kompatible ist sollte euch "der" Code-Teil zum lesen/schreiben auch unter Xbase++ helfen.

btw. ADO kann man, statt ODBC, auch für SQl-Server nutzen !

bei ADO reduzieren sich die ActiveX Aufrufe

Code: Alles auswählen

   objRS := CreateObject( "ADODB.Recordset" )
   // go top
   objRS:MoveFirst()          
   DO WHILE .NOT. objRS:EOF()
      arrLine := {}
      FOR jj := 0 TO objRS:Fields:Count - 1
         xValue := objRS:Fields( jj ):Value()
         // do some Code IF EMPTY(xValue)
         AADD( arrLine, xOUT )
      NEXT
      // instead of Array. here you can use DBF to APPEND Data or write a CSV
      AADD( aGridData, arrLine )
      //Move to the next row
      objRS:MoveNext()
   ENDDO
--

"Disphelper" ist inzwischen Bestandteil von Ot4XB
das "Original" hat auch diverse Beispiele zur Anwendung
disphelper_081.zip
(175.98 KiB) 165-mal heruntergeladen
grob gesagt arbeitet "Disphelper" nach "Windows-Art" mit Pointer statt Object
da man eh mit Variablen arbeitet kommt man schnell hinter die Ot4Xb Syntax die man verwenden muss.
dhExcel.zip
(53.54 KiB) 163-mal heruntergeladen
der Vorteil ist die Geschwindigkeit ... teilweise 400 % gegenüber XbpActiveXControl()

! Note : die "DispHpr.dll" wird nicht benötigt für die "neue" Ot4Xb Syntax
statt @dh:dhPutValue(...) => _dh_PutValue(...)

---

in beiden Fällen "schreibst" du die *.CSV per FWRITE() oder überträgst die Daten per FIELDPUT() in eine DBF
bei DBF ohne ( :!: ) Index (kann man später aufbauen)

p.s. du hättest all die "Probleme" nicht wenn dein Excel Sheet nicht solche Zeichen hätte ... ein "Problem" sollte man an der Quelle korrigieren.

Re: Excel als CSV speichern.

Verfasst: Sa, 20. Nov 2021 8:43
von BJelinek
Hallo Rolf

Jimmy hat Recht. Warum ersetzt man unliebsame Zeichen nicht in Excel bevor man aus Excel speichert.

Die Syntax erhält man durch Makroaufzeichnung, die man übersetzen kann.

Re: Excel als CSV speichern.

Verfasst: Di, 23. Nov 2021 8:34
von DerRolf
HaPe hat geschrieben: Fr, 19. Nov 2021 18:51 Hallo Rolf !
Ich verstehe immer noch nicht den Umweg über .csv.
Wolfgang hat mich auf die Idee gebracht ...

Ich habe mir vor 8 Jahren eine Funktion geschrieben um jede XLS/XSLX-Datei in eine DBF zu schreiben.
Dabei gehe ich über eine Text-Datei aber nicht über eine CSV-Datei.
Ich speichere die Felder getrennt mit Tabulatoren und lese dann diese Textdatei ein: TXT-Format (FileFormat = 20 = xlTextWindows)
Das funktioniert bei mir zuverlässig.
Hallo.
Auch wenn in den Feldern ";" vorkommen?
Wie unterscheidest du zwischen Feldtrenner und Inhalt?

Re: Excel als CSV speichern.

Verfasst: Di, 23. Nov 2021 8:40
von DerRolf
BJelinek hat geschrieben: Sa, 20. Nov 2021 8:43 Hallo Rolf

Jimmy hat Recht. Warum ersetzt man unliebsame Zeichen nicht in Excel bevor man aus Excel speichert.

Die Syntax erhält man durch Makroaufzeichnung, die man übersetzen kann.
Weil bei diesen großen Excel Dateien die Verarbeitrung zu langsam ist.
Das hatte ich vor Jahren als erstes probiert.
Wenn das funktionieren würde, bräuchte ich noch nicht einmal die CSV noch die Zeichen entfernen, sondern könnte die Felder sofort in die DBF schreiben...

Re: Excel als CSV speichern.

Verfasst: Di, 23. Nov 2021 8:48
von DerRolf
AUGE_OHR hat geschrieben: Sa, 20. Nov 2021 8:01 hi,
DerRolf hat geschrieben: Fr, 19. Nov 2021 12:41
p.s. du hättest all die "Probleme" nicht wenn dein Excel Sheet nicht solche Zeichen hätte ... ein "Problem" sollte man an der Quelle korrigieren.
Das ist richtig.
Aber leider nicht möglich. Da alle vorhandenen Artikestämme kontrolliert werden müssten, unf ggf. geändert werden.
Es handelt sich um 130 verschiedene Lieferanten, die fast ausschließlich riesige Unternehmen sind, sich nur sehr schwer bewegen.

Dann das Problem der Kontrolle.
Ich muss es auch dann noch kontrollieren, da ansonsten die Export Datei kaputt ist.

Danlke für die Tipps. Ich versuche es weiter.

Re: Excel als CSV speichern.

Verfasst: Di, 23. Nov 2021 10:24
von HaPe
Hallo Rolf !
Ich speichere die Felder getrennt mit Tabulatoren und lese dann diese Textdatei ein: TXT-Format (FileFormat = 20 = xlTextWindows)
Auch wenn in den Feldern ";" vorkommen?
Ja.
Wie unterscheidest du zwischen Feldtrenner und Inhalt?
Falls der Lieferant der Excel-Tabelle entgegen der Vereinbarung, doch Tabs in Zellen eingefügt hat, putzt die VBA-Funktion Clean alle nichtdruckbaren Zeichen aus den Zellen.

Re: Excel als CSV speichern.

Verfasst: Di, 23. Nov 2021 12:08
von DerRolf
HaPe hat geschrieben: Di, 23. Nov 2021 10:24
Falls der Lieferant der Excel-Tabelle entgegen der Vereinbarung, doch Tabs in Zellen eingefügt hat, putzt die VBA-Funktion Clean alle nichtdruckbaren Zeichen aus den Zellen.
Hallo Hape.
Die Funktion "Clean" löscht die Zeichen aus der Excel Tabelle? Auch die Semikolon?
Kannst du mir bitte zeigen, wie das funktioniert?
Würde das auch bei so großen Dateien funktionieren?

Danke Dir.

Re: Excel als CSV speichern.

Verfasst: Di, 23. Nov 2021 12:48
von HaPe
Hallo Rolf !
...putzt die VBA-Funktion Clean alle nichtdruckbaren Zeichen aus den Zellen.
Die Funktion "Clean" löscht die Zeichen aus der Excel Tabelle? Auch die Semikolon?
Die Funktion Clean löscht alle nichtdruckbare Zeichen aus einer Zelle: https://docs.microsoft.com/de-de/office ... tion.clean
Kannst du mir bitte zeigen, wie das funktioniert?
In einer Schleife über alle Zellen die gefüllt sind => bitte Google bemühen, da mein VFP-Klassen-Code nicht Xbase++-kompatibel ist.
Hier gibt es ein gutes VBA-Beispiel: https://www.thespreadsheetguru.com/the- ... h-vba-code
Würde das auch bei so großen Dateien funktionieren?
Bei mir sind die zu verarbeitenden Excel-Tabellen maximal 5 MB groß.
Wenn Sie bei dir viel größer sind, wird das auch funktionieren, aber halt sehr langsam ...