Seite 1 von 2

Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 11:29
von DerRolf
Hallo.
Vielleicht hat jemand eine Idee.
Als Quelle habe ich Excel Tabellen mit teilweise mehreren 100.000 Zeilen.
Ich öffne die Tabelle mit ("Excel.Application").
Diese speichere ich als „*.csv“ ab.

Code:
oExcel := CreateObject("Excel.Application")
oExcel:Visible := .F.
oWorkBook := oExcel:Workbooks:Open(cExcelDatei)
cTempFilename := cCsvPfad + "Temp.csv"
oWorkBook:SaveAs(cTempFilename,6)
Codeende.

Das Problem ist, dass die Trennzeichen in der „+.csv“ Datei „;“ sind.
In den Excel Feldern kommen aber auch „;“ vor.

Ich habe eine Lösung, die ist aber jetzt zu langsam geworden, da die Excel Dateien immer größer werden.

Gibt es vielleicht die Möglichkeit bei „Save As“ das Trennzeichen anzugeben?
So ne Art: oWorkBook:Delimeter := ASC(xy)

Oder bietet da die LibXl eine Lösung an.

Wenn es eine Möglichkeit gibt die Excel Tabelle direkt in eine DBF zu kopieren, wäre das wahrscheinlich das Beste. Aber davon habe ich auch nióch nie was gehört.

Bin über jeden Vorschlag dankbar.
VG Rolf

Re: Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 11:34
von Marcus Herz

Code: Alles auswählen

define xlDBF3      8
oWorkBook:SaveAs(cTempFilename,xlDBF3)
https://docs.microsoft.com/de-de/office ... fileformat

Re: Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 11:43
von DerRolf
Wow.
Probiere ich sofort aus.
Das wäre echt der Hammer! :D

Vielen Dank Markus.
Gibt es so eine Liste auch für die Bearbeitung von Excel Tabellen?

EDIT: Ich habe es gesehen...

VG Rolf

Re: Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 11:46
von HaPe
Hallo Marcus !
define xlDBF3 8
oWorkBook:SaveAs(cTempFilename,xlDBF3)
Das funktioniert leider schon seit Excel 2007 oder so nicht mehr, weil $MS den DBF-Filter entfernt hat :roll:

Re: Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 11:47
von DerRolf
Uff.
Bin noch nicht dazu gekommen....

Das wäre schade.

VG Rolf

Re: Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 12:39
von DerRolf
Marcus Herz hat geschrieben: Mi, 17. Nov 2021 11:34

Code: Alles auswählen

define xlDBF3      8
oWorkBook:SaveAs(cTempFilename,xlDBF3)
https://docs.microsoft.com/de-de/office ... fileformat
Hallo Marcus.
Das klappt leider nicht.
Betriebssystemfehler: -212......

Wäre auch zu schön gewesen....

VG Rolf

Re: Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 16:34
von JonathanLeeming
Hi,

Ich spreche nicht fließend Deutsch, aber mit Hilfe von Google Translate kann ich vielleicht helfen (Englisch folgt)...

Anscheinend verwendet Excel das Listentrennzeichen, das in den Windows-Regionseinstellungen definiert ist, auf die über die Systemsteuerung für das CSV-Trennzeichen zugegriffen werden kann. Dies muss vor dem Öffnen von Excel festgelegt werden. Ich habe auch gehört, dass das Dezimalzeichen nicht mit dem Listentrennzeichen identisch sein kann.

Hoffe das hilft... Jonathan

Hi,

Apparently Excel uses the list separator character defined in Windows Region Settings accessible from the control panel for the CSV separator. This needs to be set before Excel is opened. I also heard that the Decimal Symbol can not be the same as the list separator.

Hope This Helps... Jonathan

Re: Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 17:12
von Tom
Hi, Jonathan.

Welcome! GoogleTranslate makes an excellent job, don't worry.

Re: Excel als CSV speichern.

Verfasst: Mi, 17. Nov 2021 17:55
von BJelinek
Hallo Rolf,

vieleicht hilft Dir das weiter:

https://www.pctipp.ch/praxis/office/tri ... 96442.html

Auch hilft es bestimmte Änderungen oder Vorgänge in Makros aufzuzeichnen, um sie dann
übersetzt in xbase zu verwenden.

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 8:18
von DerRolf
BJelinek hat geschrieben: Mi, 17. Nov 2021 17:55 Hallo Rolf,

vieleicht hilft Dir das weiter:

https://www.pctipp.ch/praxis/office/tri ... 96442.html

Auch hilft es bestimmte Änderungen oder Vorgänge in Makros aufzuzeichnen, um sie dann
übersetzt in xbase zu verwenden.
Danke.
Das Trennzeichen müsste schon definierbar sein. Was man sicher nicht in einer Artikelbeschreibung verwendet.
VG Rolf

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 8:25
von DerRolf
JonathanLeeming hat geschrieben: Mi, 17. Nov 2021 16:34 Hi,

Ich spreche nicht fließend Deutsch, aber mit Hilfe von Google Translate kann ich vielleicht helfen (Englisch folgt)...

Anscheinend verwendet Excel das Listentrennzeichen, das in den Windows-Regionseinstellungen definiert ist, auf die über die Systemsteuerung für das CSV-Trennzeichen zugegriffen werden kann. Dies muss vor dem Öffnen von Excel festgelegt werden. Ich habe auch gehört, dass das Dezimalzeichen nicht mit dem Listentrennzeichen identisch sein kann.

Hoffe das hilft... Jonathan

Hi,

Apparently Excel uses the list separator character defined in Windows Region Settings accessible from the control panel for the CSV separator. This needs to be set before Excel is opened. I also heard that the Decimal Symbol can not be the same as the list separator.

Hope This Helps... Jonathan
Hi Jonathan.
Thats it.
Thank you.
But Excel still puts the ";" in inverted commas.

Rolf

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 8:43
von Tom
Ich verstehe das Problem nicht. Mal davon abgesehen, dass man an die Daten über die ODBCDBE oder per ActiveX direkt herankommt, also eigentlich den Umweg über die Speicherung nicht benötigt, kann man sich doch eine eigene Einlesefunktion bauen, die entweder das Format korrigiert oder im ungenauen CSV-Format importiert. Eine Textdatei zeilenweise einzulesen und auf Basis irgendeines Trennzeichens in Spalten aufzuteilen, ist doch nun wirklich kein Problem. Edit: Hubert hat doch seine schnelle Textdatei-Einlesefunktion hier irgendwo gepostet. Die kann man dafür verwenden.

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 9:02
von DerRolf
Tom hat geschrieben: Do, 18. Nov 2021 8:43 Ich verstehe das Problem nicht. Mal davon abgesehen, dass man an die Daten über die ODBCDBE oder per ActiveX direkt herankommt, also eigentlich den Umweg über die Speicherung nicht benötigt, kann man sich doch eine eigene Einlesefunktion bauen, die entweder das Format korrigiert oder im ungenauen CSV-Format importiert. Eine Textdatei zeilenweise einzulesen und auf Basis irgendeines Trennzeichens in Spalten aufzuteilen, ist doch nun wirklich kein Problem. Edit: Hubert hat doch seine schnelle Textdatei-Einlesefunktion hier irgendwo gepostet. Die kann man dafür verwenden.
Hallo Tom.
Ich lese die Textdatei zeilenweise ein, und korrigiere die Trennzeichen.
Es ist nur zu langsam geworden.

Direkt auf die Tabelle zugreifen, ist noch viel langsamer.
Wie gesagt es sind Tabellen mit teilweise über 300.000 Zeilen und 45 Spalten. Das sind bei einer Datei 13.500.000 Trennzeichen bearbeiten / kontrollieren.
Auch bei einem sehr schnellen Rechner dauert das über 30 Minuten. Manchmal sind es 30 bis 40 Dateien.

VG Rolf

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 9:15
von Tom
Hallo, Rolf.

Hast Du Dir Huberts Funktion mal angesehen? Die ist sehr schnell, auch bei großen Dateien.

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 9:17
von Tom

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 9:42
von AUGE_OHR
hi,

die Zeit die benötigt wird ist primär von der Schreib-Geschwindigkeit abhängig.

um ein Excel Sheet in ein Array zu übertragen dauert es ... 1 Sec. :!:
Problem : Das Array "könnte" für 32 Bit zu gross werden ...

damit wären wir beim "erstellen" der CSV wo man mit FWRITE() arbeiten kann
wenn das bei dir "Minuten" benötigt brauchst du eine schnelle NVM :)

----

es ist notwendig ein leeres Array von der "selben" Grösse wie der "select" Bereich im Excel Sheet ist

Code: Alles auswählen

   oExcel := CreateObject( "Excel.Application" )
   oExcel:visible := .T.                   // visible
   // If there is a problem, don't let excel pop up messages
   oExcel:Application:DisplayAlerts := .F.
   // full Path
   oExcel:Application:Workbooks:open(cPATH+cFILE)
   // Make the first one active
   oWorkBook := oExcel:activeWorkBook
   oExcel:Application:Worksheets(1):activate()
   // Speed things up by creating an object containing the cells
   oSheet := oExcel:Worksheets(1):cells
   // "select" used Range (hole Sheet)
   oWorkBook:workSheets(1):usedRange:Select

   numRows    := oWorkBook:workSheets(1):usedRange:Rows:Count
   numColumns := oWorkBook:workSheets(1):usedRange:Columns:Count
   // build Array with same Size
   FOR i := 1 TO numRows
       AADD(aExcel,ARRAY(numColumns))
   NEXT
   // convert Numeric to "A1"
   cEnde := ZAHL2CHR(numColumns)

   // now get "select" Range into Array
   aExcel := oSheet:range( "A1:"+cEnde+LTRIM(STR(numRows)) ):value

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 11:32
von DerRolf
Hallo Tom, Hallo Marvin.
Danke für eure Hilfe.

Das Problem besteht nicht im Schreiben der CSV Datei. Das sind Sekunden. (Ich habe eine Samsung SSD 980 Pro 1TB M.2)
Das Problem ist das Bereinigen der überflüssigen Trennzeichen, die Excel eigenständig bei im Text verwendeten Anführungszeichen, oder Semikolon einsetzt.

Hier mal ein Beispiel:
Feld1 Feld2 Feld3 Feld4
Excel Sheet: ...4260255420183 Viawant ;Nitrile; Pro XS Nitrilhandschuhe; "EN455" ;AQL1.5 puderfrei,latexfrei,unsteril...

Nach Speicherung als CSV: ...;4260255420183;;"Viawant ;Nitrile; Pro XS";"Nitrilhandschuhe; ""EN455"" ;AQL1.5";puderfrei,latexfrei,unsteril;...

Und dabei läuft mir halt die Zeit weg.... :D

Am Rechner liegts nicht. CPU i9-10940X.

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 11:41
von DerRolf
AUGE_OHR hat geschrieben: Do, 18. Nov 2021 9:42 hi,

die Zeit die benötigt wird ist primär von der Schreib-Geschwindigkeit abhängig.

um ein Excel Sheet in ein Array zu übertragen dauert es ... 1 Sec. :!:
Problem : Das Array "könnte" für 32 Bit zu gross werden ...

damit wären wir beim "erstellen" der CSV wo man mit FWRITE() arbeiten kann
wenn das bei dir "Minuten" benötigt brauchst du eine schnelle NVM :)

----

es ist notwendig ein leeres Array von der "selben" Grösse wie der "select" Bereich im Excel Sheet ist

Code: Alles auswählen

   oExcel := CreateObject( "Excel.Application" )
   oExcel:visible := .T.                   // visible
   // If there is a problem, don't let excel pop up messages
   oExcel:Application:DisplayAlerts := .F.
   // full Path
   oExcel:Application:Workbooks:open(cPATH+cFILE)
   // Make the first one active
   oWorkBook := oExcel:activeWorkBook
   oExcel:Application:Worksheets(1):activate()
   // Speed things up by creating an object containing the cells
   oSheet := oExcel:Worksheets(1):cells
   // "select" used Range (hole Sheet)
   oWorkBook:workSheets(1):usedRange:Select

   numRows    := oWorkBook:workSheets(1):usedRange:Rows:Count
   numColumns := oWorkBook:workSheets(1):usedRange:Columns:Count
   // build Array with same Size
   FOR i := 1 TO numRows
       AADD(aExcel,ARRAY(numColumns))
   NEXT
   // convert Numeric to "A1"
   cEnde := ZAHL2CHR(numColumns)

   // now get "select" Range into Array
   aExcel := oSheet:range( "A1:"+cEnde+LTRIM(STR(numRows)) ):value

Hallo.
Die Variante hatte ich mal vor Jahren ausprobiert. Das bleibt nachher fast stehen.

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 11:48
von Tom
Schau Dir mal Huberts Klasse an, Rolf. Link vier Nachrichten rückwärts.

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 12:02
von DerRolf
Tom hat geschrieben: Do, 18. Nov 2021 11:48 Schau Dir mal Huberts Klasse an, Rolf. Link vier Nachrichten rückwärts.
Habe ich.
Steige ich nicht durch alles durch. Erstellen von Excel Sheets ohne Excel...
Aber auslesen habe ich nicht gefunden. :roll: *schäm*

Edit:
War auf der falschen HP.
LIBXL.com ist wohl die richtige Seite.
Das schaue ich mir mal an.

Danke.

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 15:50
von brandelh
Hallo,

wenn die Daten in Excel vorliegen und Texte mit ";" vorhanden sind gibt es ein echtes Problem.
Excel (und wohl auch die Definition) sagt, dass alles was in " " eingefasst ist, kein Steuerzeichen ist, z.B. auch Zeilenschaltungen.
Nur dass zumindest bei das so keiner umgesetzt hat ;-)

Wenn die Daten in Textdateien vorliegen kann man meine Textreader Klasse verwenden, wenn man XLS / XLSX Dateien hat, kann man ohne Excel mit LibXL zugreifen.

Der Export in DBF Dateien ist immer problematisch, da die Feldnamen oft nicht erlaubt sind, ob es noch geht weiß ich daher aus dem Stand gar nicht.
Der Import aus einer DBF geht aber einwandfrei, das mache ich oft (Excel 2010, höher habe ich das noch nicht probiert).

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 15:59
von brandelh
Ich sehe gerade .... "" zuviel und sollen nach " umgesetzt werden ?

Memoread() // besser wäre eine eigene Funktion mit FOpen() :arrow: File2Str()

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

solange die Datei so 200 MB oder 300 MB nicht überschreitet, kann man das direkt einlesen und mit StrTran() die "" nach " tauschen lassen.
danach wieder speichern:

Str2Disk(cFile,cTxt)

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 22:31
von AUGE_OHR
hi,
DerRolf hat geschrieben: Do, 18. Nov 2021 11:41 Die Variante hatte ich mal vor Jahren ausprobiert. Das bleibt nachher fast stehen.
das liegt daran das dir der Speicher unter 32 Bit "ausgeht", ansonsten ist es IHMO die "schnellste" Methode

Re: Excel als CSV speichern.

Verfasst: Do, 18. Nov 2021 23:23
von BJelinek
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

Re: Excel als CSV speichern.

Verfasst: Fr, 19. Nov 2021 8:35
von DerRolf
brandelh hat geschrieben: Do, 18. Nov 2021 15:59 Ich sehe gerade .... "" zuviel und sollen nach " umgesetzt werden ?

Memoread() // besser wäre eine eigene Funktion mit FOpen() :arrow: File2Str()

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

solange die Datei so 200 MB oder 300 MB nicht überschreitet, kann man das direkt einlesen und mit StrTran() die "" nach " tauschen lassen.
danach wieder speichern:

Str2Disk(cFile,cTxt)
Hallo Hubert.
Leider geht das nicht, da Excel bei einem ";" das ganze Feld in einfache Anführungszeichen setzt.
Diese müssen auch raus.
Problem ist, dass ich momentan auf die Kombi ";"" abfrage, und ändere.
Das ist wie gesagt zu langsam.

Ich versuche mal den Vorschlag von Jonathan, das Trennzeichen in der Region Einstellung auf einen Wert zu ändern, den die "kreativen Erfasser" nicht verwenden können.
Aber Excel versorgt trotzdem die CSV Datei mit den Anführungszeichen!
Dann würde ich wie beschrieben alle Anführungszeichen löschen. Dann würden auch alle in der Felder stehenden Anführungszeichen gelöscht.
Ist nicht 100%.

Ist es möglich mir bitte deine Funktion zum Lesen der CSV Dateien zukommen zu lassen?