Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

CSV in Arrayeinlesen - Splittingprobleme

Forumthread: CSV in Arrayeinlesen - Splittingprobleme

CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 08:30:30
Jan
Ich will eine csv Datei in ein Array zur Weiterverarbeitung einlesen. Das klappt mit dem split via Trennzeichen auch sehr gut und performant.

Leider gibt es Teststrings in der csv Datei mit genau dem Trennzeichen (in dem Fall Semikolon, könnte aber auch jedes beliebige andere sein). Zwar ist dieser Text in meinem Einlesearray (vor der Weiterverarbeitung durch den split) noch in extra Anführungszeichen und lässt sich darüber identifizieren, aber der split legt bei diesen (Ausnahme)Textsstrings weitere Arrayfelder (weil Semikolons im Text) an. Dadurch habe ich manchmal 10 Zeilen und manchmal 13, so dass dieselbe Info an verschiedenen Zeilen im Array steht.

Vorheriges ersetzen der strings via replace nützt natürlich nichts, weil dass ja auch die csv Trennzeichen mit entfernen würde. Ich habe versucht dies über Regex zu lösen. Damit kriege ich die (falschen) Semikolons raus, aber die Performance ist grottig und macht den ganzen Arrayvorteil zunichte.

Habt Ihr eine Idee, wie ich das lösen kann. Öffne ich die csv mit excel schafft excel es sauber zu trennen und lässt die Semikolons im Text unberücksichtigt. Dann müsste es doch auch mit VBA gehen... Hier ein Ausschnitt aus dem Code
  Open ThisWorkbook.path & "\" & CSV_Q_Jahr For Binary As #1

strDaten = Space$(LOF(1))
Get #1, , strDaten
Close #1
Vardat = Split(strDaten, vbCrLf)

For lngZeile = LBound(Vardat) To UBound(Vardat)
If Len(Trim(Vardat(lngZeile))) > 0 Then 'check, ob Inhalte in dieser Zeile vorhanden sind (Trim entfernt Leerzeichen)
Vardat(lngZeile) = Replace(Vardat(lngZeile), Chr(34), "") 'Anführungszeichen entfernen
VarErg = Split(Vardat(lngZeile), ";") 'string aufspalten
...
Anzeige

47
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 08:35:04
Oberschlumpf
Moin,

und wo ist die CSV-Bsp-Datei, mit der wir deinen Code testen könnten?
Besser wär natürlich nicht nur ein Teil deines Codes, sondern alles an Code, was zum Trennen/Array-Erstellung verewndet wird.

Ciao
Thorsten
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 09:19:08
Jan
Klar gern. leider kann ich die Quelldateien im csv Format nicht hochladen. Habe die als xlsb gespeichert. Zum Test müsstet Ihr dann wieder auf CSV (Trennzeichen-getrennt" wechseln oder mit einen Tip geben wie ich Euch die csv Quellen zukommen lassen kann...

https://www.herber.de/bbs/user/169681.xlsb
https://www.herber.de/bbs/user/169682.xlsb
https://www.herber.de/bbs/user/169683.xlsb

Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 09:35:09
Oberschlumpf
z Bsp alle csv-Dateien vor dem Upload in 1 ZIP-Datei packen...dann die ZIP-Datei hier per Upload zeigen
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 09:04:40
volti
Hallo Jan,

wenn es nur sporadisch vorkommt, das mit den Anführungszeichen, wäre als erster Gedanke folgendes mögliches Szenario denkbar:

Mit Instr o.ä. feststellen, ob Anführungszeichen in der Zeile sind. Wenn nicht, trenne wie bisher (schnelle Version):

Und wenn ja in einer Schleife die Zeile durch gehen und
1. Toggelevariable togglen und merken, ob Anführungszeichen den Text beginnt oder beendet
2. Bei Togglevariable=an das Semikolon z.B. durch ein anderes Zeichen ersetzen
3. Replace Anführungszeichen entfernen
4. Zeile splitten
5. Array durchgehen und im Array mit Replace die Sonderzeichen zurück in Semikolon wandeln.

Aber vielleicht hat ja jemand noch eine performantere Variante parat. :-)

Gruß
Karl-Heinz
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 09:58:18
daniel
Hi
wenn du die CSV in Excel direkt öffnen kannst, dann öffne sie in VBA wie eine normale Exceldei mit WORKBOOKS.OPEN, du musst allerdings zusätzlich den Parameter Local:=True setzen, damit auch das Semikolon das Trennzeichen ist und nicht das Komma.

wenn das nicht klappt, gibts auch noch WORKBOOKS.OPENTEXT.
das ist das öffnen der Datei mit Text in Spalten, hier kannst du dann Trennzeichen oder auch Texterkennungszeichen (die Anführungszeichen) explizit angeben.

aus den dateien kannst du dann ja das Array durch einfache Zurweisung befüllen.

Gruß Daniel
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 10:14:23
Der Steuerfuzzi
Hallo Jan,

sieht nach Datev-Export aus ;)

ich habe das mittels einer eigenen Split-Funktion (das ist die Lösung mit der Flag-Variablen) gelöst:
Function mySplit(strInput As String, strDel As String) As String()

Dim Temp() As String
Dim flag As Boolean
ReDim Temp(100)

Dim i As Long, z As Long
For i = 1 To Len(strInput)
If Mid$(strInput, i, 1) = strDel And Not flag Then
If z Mod 100 = 0 Then
ReDim Preserve Temp(z + 100)
End If
z = z + 1
Else
' Debug.Print Mid$(strInput, i, 1)
Temp(z) = Temp(z) & Mid$(strInput, i, 1)
If Mid$(strInput, i, 1) = """" Then
flag = Not flag
End If
End If
Next
ReDim Preserve Temp(z)
mySplit = Temp
End Function


Alternativ ist auch die Lösung von Daniel möglich, aber, wie ich finde, nicht so schön.

Grüße
Michael

Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 11:55:25
Der Steuerfuzzi
Ein kleiner Hinweis noch, da es sich anscheinend um den ASCII-Export aus dem Datev-Rechnungswesen-Programm handelt (falls Du es nicht schon kennst):

Man kann den Export automatisiert durchführen, indem man das von der Datev idR mitgelieferte Kommandozeilenprogramm "KRExport.exe" mit den entsprechenden Parametern ausführt. Die Parameter sind mittlerweile sogar offiziell von der Datev veröffentlicht worden.

Die Ausführung kann entweder über eine Batch-Datei, eine Verknüpfung oder (wie ich es gerne mache) in VBA mittels Shell erfolgen.

Damit spart man sich wieder einen Schritt mehr und es ist gefühlt komplett automatisiert.
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 13:13:28
Jan
Das klingt spannend, Wahrscheinlich kein Thema für den thread hier, aber würde ich gern mit Dir aufnehmen. Gibt es die Möglichkeit einer PN?
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 13:17:28
Der Steuerfuzzi
Kannst mir gerne unter bobbyewing@freenet.de schreiben
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 12:06:04
daniel
Hi

noch ne lösungsvariante für den Fall, wenn das Öffnen der CSV als eigenständige Exceldatei keine Option ist:

mit einer kleinen funktion kann man das ";" durch ein anderes Trennzeichen austauschen (möglichst ein zeichen, das sonst im Text nicht vorkommt, ich nehme meisten die Pipe "|"
um jetzt die Texteile innerhalb der anführungszeichen auszulassen, splittet man den Text am Anführungszeichen.
im so entstehenden Array ist dann jeder zweite Index innerhalb Anführungszeichen und die anderen außerhalb.

wenn man dann beim wiederzusammenfügen das Trennzeichen weglässt, hat man auch gleich die Anführungszeichen eleminiert:

hier die funktion:

Function xxx(txt As String) As String

Dim i As Long
Dim erg

erg = Split(txt, Chr(34))
For i = 0 To UBound(erg) Step 2
erg(i) = Replace(erg(i), ";", "|")
Next
xxx = Join(erg, "")
End Function


und dann setzt man die Funktion in deinen Code ein also statt:
VarErg = Split(Vardat(lngZeile), ";")

dann
VarErg = Split(xxx(Vardat(lngZeile)), "|")


Gruß Daniel

ps. du darfst dir auch gerne einen schöneren Funktionsnamen ausdenken
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 13:17:52
Jan
Vielen vielen Dank für Eure vielfältigen Lösungen. ich bin froh, dass ich mein Thema damit auflösen konnte.

Tolles Forum...Topic closed 😉
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 14:31:56
Onur
Die allereinfachste Methode:
Die CSV umbenennen in TXT, dann passiert sowas nicht mehr.


Sub Makro()
Dim FileName, dst
FileName = "C:\XXXXXXXXXXXXXXX\2_kontobuchungen_nok.csv"
dst = Replace(FileName, ".csv", ".txt")
FileCopy FileName, dst
Workbooks.OpenText FileName:=dst, DataType:=xlDelimited, Semicolon:=True, DecimalSeparator:=",", ThousandsSeparator:="."
End Sub
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 19:43:43
Jan
mhm, leider zu früh gefreut. All die Einzelstringlösungen sahen nur im Testcase schnell aus, weil ich da eine gekürzte und anonymisierte csv Inputdatei genutzt habe. Dort gab es tatsächlich - außer bei den falschen textstrings - keine Anführungszeichen. So konnte ich die falschen leicht identifizieren und nur diese sind durch die Bereinigungsfunktion gegangen. Das ist natürlich schnell.

Nun habe ich eine originale Quelldatei genommen - dort sind leider immer Anführungszeichen drin, so dass die Korrekturfunktion jedes mal durchlaufen wird. Das dauert ewig und ist bei allen vorgeschlagenen "Ersetzungslösungen" dasselbe, bei so vielen Datensätzen ein absoluter Performancekiller. Das Umbenennen in eine Textdatei wie von Onur vorgeschlagen löst das Problem leider auch nicht, weil auch die textdatei die Semikolons beim direkten Übertragen ins Array mit übernimmt. Wir die Datei geöffnet und dann das Array bestückt gibt es kein Problem, aber das geht auch mit der csv, weil dann eben kein splitting notwendig ist.

Das vorherige Öffnen einer Datei + Übertragen aus der geöffneten Datei ins Array löst das Problem, aber genau das will ich ja vermeiden. Der Übertrag via

    Open ThisWorkbook.path & "\" & CSV_Q_Jahr For Binary As #1

strDaten = Space$(LOF(1))
Get #1, , strDaten
Close #1
Vardat = Split(strDaten, vbCrLf)


inkl. folgender Aufbereitung geht rasend schnell, aber da habe ich das Problem mit den Semikolons beim Aufsplitten und eine Funktionsschleife über alle lines macht den Geschwindigkeitsvorteil wieder zunichte. Etwa doppelt so lange dauert das Abgreifen über ADO. Da ich da nicht mehr splitten muss entfällt das Problem der Semikolons. Die mit Abstand performancetechnisch schlechteste Lösung ist das Öffnen, bis die großen Textdateien geöffnet sind (haben teilweise >100MB) dauert mehrere sekunden...

Hoffe ich habe keinen Eurer Vorschläge übersehen... damit für mich leider zurück auf Los oder doch immer den Weg via ADO über vorheriges ins excel holen gehen... Ist wahrscheinlich in etwas so schnell/langsam wie das Öffnen, aber dann habe ich via SQL Abfrage die Grundgesamtheit zumindest schon mal verkleinert.

Vielleicht kommt mir übers WE noch eine Idee. Dank Euch auf jeden Fall fürs bisherige Brainstormen.

Happy w/e
Jan
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 20:32:42
Onur
Dann solltest du evtl die "originale Quelldatei " auch mal hier posten.
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 20:37:00
Volti
Hallo Jan,
Wenn alle Felder Anführungszeichen haben dann folgende ungeprüfte Idee.

In strDaten vor Split "; und ;" durch Pipezeichen ersetzen.
Dann nach vbcrlf splitten und später zeilenweise nach Pipe splitten.
Leider grad vom Handy, daher kein Vorschlagscode
Gruß Karl-Heinz
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
25.05.2024 13:46:35
Der Steuerfuzzi
Ich hätte noch folgende Vorschläge, um das ganze zu beschleunigen:

1) Du kannst im Datev-Programm das Trennzeichen frei bestimmen. Dann kannst Du das normale "Split" verwenden, dann läuft das Ganze schon wieder um längen schneller. Jetzt muss man natürlich aufpassen, welches am mit der größten Wahrscheinlichkeit nicht vorkommt. Nachdem die Tabulatortaste im Programm beim Buchen die Funktion hat, zum nächsten Feld zu springen, würde sich das Tabulatorzeichen ggf. anbieten. Pipes habe ich schon sehr oft in Buchungstexten gesehen.

2) Im Programm kann man beim Export auch die Anführungszeichen bei Textfeldern "deaktivieren"

3) Es sinnvoll sein, nur die benötigten Daten aus dem Programm zu exportieren. Grenze z.B. die exportierten Konten ein, lasse z. B. die Sammelkonten für Debitoren/Kreditoren weg, die sind redundant.

Leider weiß ich nicht, für was und wie die Daten weiter verarbeitet werden, daher sind natürlich nur allgemeine Aussagen möglich.
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
27.05.2024 10:32:59
Jan
Danke für Euren Wochenendinput. Mein Schweigen war keine Untätigkeit, sondern ich wollte erst ein paar Sachen durchprobieren.

Ich habe mehrere Datensätze getestet - leider haben nicht alle Felder ein Anführungszeichen, so dass die Idee alle gleich zwischen zu verarbeiten nicht funktioniert.

Ein alternatives Trennzeichen oder das Deaktivieren der Anführungszeichen hilft mir leider auch nicht, da ich input von verschiedenen Nutzern bekomme, die nicht alle gleich sorgfältig sind. Damit habe ich nicht sichergestellt, dass diese Bedingungen immer korrekt eingestellt sind und der automatische Durchlauf schlägt fehl.

Ich habe nun herausgefunden, warum die Quelldatei im Muster kein Problem gemacht hat. Dort habe ich ja ein paar Stellen bewusst fehlerhaft modifiziert und das damit notwendige Speichern der Datei bewirkt, das alle "normalen" Anführungszeichen entfernt werden. Damit bleiben nur die übrig, die das fehlerhafte Semikolon identifizieren und der "Ersetzen Code" läuft nur in den seltenen notwendigen Fällen. Ohne vorheriges Speichern (auch ohne irgendwelche Änderungen) bleiben die Anführungszeichen und damit wird jede Datenzeile als relevant identifiziert, jedes mal läuft die Ersetzenfunktion und damit geht die Performance bei der großen Anzahl an Datenzeilen signifikant in die Knie. Ein vorheriges Öffnen per klassischem Open-Save-Close hilft nicht, da das Öffnen und Speichern dieser großen Dateien etliche Sekunden dauert und damit der erhoffte Performancegewinn komplett aufgefressen wird.

Gibt es irgendeine "schnelle" Methode per VBA, das "Excelspeichern" zu erreichen?
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
27.05.2024 14:34:20
Jan
Hi zusammen,

Ich bin grad dabei, eine alternative Variante zu testen und die csv via SQL Abfrage reinzuholen. Damit kann ich auch gleich die Anzahl der Zeilen reduzieren.

Ich habe zwei Methoden probiert:

(1) Schreiben in eine Exceltabelle und von dort das Array bestücken
(2) Direktes Schreiben in ein Array

Eigentlich genügt (2) vollkommen. (1) brauche ich nur für etwaige debuggingfälle. Mein Problem ist, dass bei direkter Bestückung des Arrays VarDat die Spalten und Zeilen vertauscht sind. Ich brauche es so wie VarErg nach dem Bestücken aus der Tabelle aufgebaut ist.

Hier der Code - Ich vermute "rst.GetRows" in Zeile 140 muss irgendwie transponiert werden, aber stehe auf dem Schlauch. Könnt Ihr mir auf die Sprünge helfen, wie ich VarDat direkt bestücken kann und Zeilen/Spalten analog VarErg aufgebaut sind?

Sub CsvInArray_SQL(CSV_Q_Jahr, SKR, Spalte, Faktor, Optional Aufruf)

'aktuell unbearbeiteter Input

Dim wksZ As Worksheet
Dim ADOConn As Object, rst As Object
Dim strDaten As String, Vardat As Variant, VarErg As Variant, VarMapping As Variant, VarRes()
Dim lngZeile As Long, lngz As Long, Spaltemax As Long, i As Long, Kontogrenze As Long
Dim Grenze1 As Long, Grenze2 As Long, Grenze3 As Long, Z_letzte As Long, lngZMapp As Long
Dim strPfad As String, strDatei As String, strSQL As String

10 Set wksZ = ThisWorkbook.Sheets("CSV_Xcheck_SQL")
20 wksZ.Range("A2:V100000").ClearContents
30 Spaltemax = 20
40 Kontogrenze = 9000 * Faktor
50 strPfad = ThisWorkbook.Path & "\Dateninput\"

'Mappingarray anlegen (Infos zu Kontengruppe etc.)
60 Z_letzte = Sheets("MVZ_Export").Cells(20000, Spalte).End(xlUp).row ' letzte Zeile mit Kontonummer in Spalte E 'sonst aus Ubound(VarRes)
70 VarMapping = Sheets("MVZ_Export").Range(Sheets("MVZ_Export").Cells(12, Spalte), Sheets("MVZ_Export").Cells(Z_letzte, Spalte + 4)) 'Array mit zu mappender Kontogruppe etc.

80 strSQL = "Select * From "
90 Set ADOConn = CreateObject("ADODB.CONNECTION")
100 ADOConn.Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPfad & ";Extended Properties=""text;HDR=No;" & ";FMT=Delimited"";"

110 Set rst = CreateObject("ADODB.RECORDSET")
120 rst.Open strSQL & CSV_Q_Jahr & " WHERE F1=0 and F2" & Kontogrenze & "and F2 >= 2000 * " & Faktor & "Or F1 = 0 And F2 >= 50 * " & Faktor & " And F2 = 499 * " & Faktor, ADOConn

130 If Application.Caller = "Schaltfläche 2" Then
140 Vardat = rst.GetRows
150 Else
160 wksZ.Cells(2, 1).CopyFromRecordset rst, , Spaltemax
170 rst.Close
180 ADOConn.Close
190 Set ADOConn = Nothing
200 Set rst = Nothing

210 Z_letzte = wksZ.Cells(200000, 1).End(xlUp).row ' letzte Zeile mit Kontonummer in Spalte E 'sonst aus Ubound(VarRes)
220 VarErg = wksZ.Range(wksZ.Cells(2, 1), wksZ.Cells(Z_letzte, Spaltemax)) 'Array mit zu mappender Kontogruppe etc.
230 End If

End Sub


BG
Jan
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
27.05.2024 19:48:50
Der Steuerfuzzi
Ich meine mich zu erinnern, dass das ADO-Zeugs mit csv-Dateien immer Probleme gemacht hat. Glaube, da musste man ini-Dateien verwenden, dann ging es. Bin mir aber nicht sicher, ob ich mich richtig erinnere.
AW: CSV in Arrayeinlesen - Splittingprobleme
27.05.2024 20:32:10
Jan
Das ist korrekt, ich habe eine Schema.ini zur Definition der Formate pro Spalte der CSR im Einsatz. Damit funktioniert es gut.

Irgendeine Idee, wie ich das Array „richtigrum“ befülle?
AW: CSV in Arrayeinlesen - Splittingprobleme
28.05.2024 00:33:56
Der Steuerfuzzi
Brauchst Du die Daten nur im Array oder willst Du sie unbedingt in die Tabelle schreiben?

Im ersten Fall wäre es kein Problem, da Du ja nur Zeilen und Spalten "vertauschen" musst.

Im zweiten Fall ist es wahrscheinlich etwas komplizierter. Mir fallen auf Anhieb folgende Möglichkeiten ein:

1:
Du könntest die Recordsets in einer Schleife mit rst.getrow(1) "durchlaufen" und in ein Array schreiben. Wenn Du die Anzahl der Records ermitteln willst, dann geht das zulasten der Performance. Wenn Du die Anzahl der Records nicht ermittelst, kannst Du das Array mit einem bestimmten Wert dimensionieren (Im Zweifel mit der Anzahl der Zeilen einer Exceltabelle, da Du ja eh in die Tabelle schreiben willst). Das geht wimre ca. 40% schneller. Hat die Datei aber mehr Zeilen als die Tabelle, hast Du wieder ein Problem ...

2:
Schreibe das gesamte Recordset in eine temporäre Variable und transponiere diese per VBA, aber nicht mit Application.Transpose, da ist bei 65000 Zeilen Schluss, sondern mit zwei Schleifen. Ist aber möglicherweise auch langsam und kann bei sehr vielen Datensätzen und weiteren Daten im Speicher dazu führen, dass eine Fehlermeldung kommt, dass der Speicher nicht reicht (hatte ich mal bei ca. 2Mio Datensätzen). Nachdem Du aber bei der Abfrage bereits "selektieren" willst, könnte das unproblematisch sein.

3:
Wenn es weniger Datensätze sind als Spalten in der Tabelle (eher unwahrscheinlich), dann kannst Du die Daten mit Copyfromrecordset in die Tabelle kopieren und dann mit copy und Werte einfügen+transponieren wieder einfügen
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
28.05.2024 08:24:11
Jan
Hi Michael,

dank Dir für Deine Ideen. Version 1 und 2 werden durch die zusätzlichen Aktionen wahrscheinlich wieder den Performancegewinn durch die Vermeidung des Zwischenschritts über die Tabelle auffressen.

Aber Dein erster Ansatz passt - ich brauch die Daten nur in der Tabelle, wenn ich mal was debuggen muss und dann kann ich auch den Weg über Copyfromrecordset wählen. Wie kann ich denn für diesen Ansatz "einfach Zeilen und Spalten vertauschen"?
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
28.05.2024 10:34:11
Der Steuerfuzzi
Hm, ich weiß jetzt nicht was Du genau mit den Daten vor hast, aber wenn ich die Daten in "Tabellenform" in Vardat habe, dann wäre der Zugriff so:
Vardat(Zeile, Spalte)
Wenn Du es mit getrows befüllst, dann sieht es halt so aus:
Vardat(Spalte, Zeile)

AW: CSV in Arrayeinlesen - Splittingprobleme
28.05.2024 10:54:30
Jan
Hier die beiden Alternativen
  If Application.Caller = "Schaltfläche 2" Then

Vardat = rst.GetRows
Else
wksZ.Cells(2, 1).CopyFromRecordset rst, , Spaltemax
rst.Close
ADOConn.Close
Set ADOConn = Nothing
Set rst = Nothing

Z_letzte = wksZ.Cells(200000, 1).End(xlUp).row ' letzte Zeile mit Kontonummer in Spalte E 'sonst aus Ubound(VarRes)
VarErg = wksZ.Range(wksZ.Cells(2, 1), wksZ.Cells(Z_letzte, Spaltemax)) 'Array mit zu mappender Kontogruppe etc.
...

In (1) kippe ich direkt ins Array, aber damit kommen die Daten aber "seitenverkehrt" an. Mit (2) schreibe ich erst in die Tabelle und befülle von dort das Array. Und genau diese Anordnung hätte ich gern ohne den Zwischenschritt über die Tabelle....

Das Arraysoll in beiden Fällein gleich aufgebaut sein... tut es aber leider nicht ;-(

Nachvollziehbar? Oder soll ich die Beispieldatei hochladen, damit Du das array in beiden Fällen sehen kannst?
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
28.05.2024 10:59:23
Der Steuerfuzzi
Ich habe schon kapiert wie es in beiden Alternativen aussieht. Du musst bei der Weiterverarbeitung halt darauf achten, dass Spalten und Zeilen vertauscht sind.
AW: CSV in Arrayeinlesen - Splittingprobleme
28.05.2024 12:42:22
Jan
Klar, aber da ich beide Alternativen je nach einsatzcase parallel nutzen wollte wäre es schön, wenn ich die Arrays gleich identisch bestücken und damit dann mit gleicher Routine weiterverarbeiten könnte...

Ich habe nur noch keinen Weg gefunden, wie ich rst.GetRows gleich beim Reinkippen transponieren kann...
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
28.05.2024 13:37:45
Der Steuerfuzzi
rst.GetRows kannst Du mW nicht direkt beim reinkippen transponieren. Da musst Du die Werte mittels zwei Schleifen einzeln in ein anderes Array übertragen oder die Recordsets Zeilenweise in ein Array übertragen mit rst.getrows(1) bekommst Du immer eine Zeile der Daten, das ganze dann in einer Schleife bis das Ende erreicht ist (das ist erreicht, wenn rst.eof=true.
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
28.05.2024 14:46:59
Jan
schade, aber wie so oft, löst Du ein Problem kommt mit der Lösung ein neues ;-)

Danke erst mal
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 20:42:49
Volti
Hi Korrektur

Nur ";" durch Pipe ersetzen...
Gruß Karl-Heinz
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 15:26:56
Onur
Hier inkl der Arrayzuweisung:
Sub Makro()

Dim FileName, dst, arr
FileName = "C:\XXXXXXXXX\2_kontobuchungen_nok.csv"
dst = Replace(FileName, ".csv", ".txt")
FileCopy FileName, dst
Workbooks.OpenText FileName:=dst, DataType:=xlDelimited, Semicolon:=True, DecimalSeparator:=",", ThousandsSeparator:="."
arr = ActiveWorkbook.ActiveSheet.UsedRange
End Sub
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 15:43:20
daniel
Hi
muss man die Datei wirklich umbennen?
CSV sollte sich auch mit OPENTEXT öffnen lassen.
ggf ist es hier notwendig, den Parameter "TextQualifier" entsprechend anzugeben.
Gruß Daniel
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 15:54:48
Onur
Leider ja.
Es klappt weder mit " xlTextQualifierDoubleQuote" noch mit "xlTextQualifierNone" noch mit "xlTextQualifierSingleQuote".
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 16:03:43
Onur
Hi Daniel,

Vermutlich, weil Excel nur TXT als Text ansieht und bei CSV automatisch dazwischen funkt (wie bei "intelligenten" Tabellen) und versucht, die Daten vorher "aufzubereiten".

Gruß
Onur
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 10:23:14
Der Steuerfuzzi
Kleine Ergänzung noch:

Diese Funktion habe ich speziell für einen bestimmten Anwendungsfall geschrieben, bei dem die maximale Anzahl der Felder 100 ist.
Gegebenenfalls musst Du das ReDim Temp(100) am Anfang entsprechend anpassen.

Ich bin mir nicht ganz sicher, wie viele Felder der Buchungsdaten-Export aus Datev maximal zulässt, aber mit allen Zusatzinfos etc. dürften es nicht mehr als 120 sein. Zur Sicherheit einfach 200 nehmen und es sollte funktionieren.
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 10:35:46
Der Steuerfuzzi
Kommando zurück, habe gerade gesehen, da ist ein "automatisches" Redim drin, das die Dimension anpasst, wenn es mehr Felder sind.
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 11:08:36
Jan
Hi zusammen,

Danke für Euer brainstorming. Daniels Lösung funktioniert super. Wie entferne ich am Besten noch die (nach dem sauberen split nicht mehr notwendigen) Anführungszeichen. Bisher habe ich das vorher mit Vardat(lngZeile) = Replace(Vardat(lngZeile), Chr(34), "") gemacht, jetzt muss ich es nach oder bei dem split machen.

Wo würdest Du das am besten reinsetzen in Deiner Funktion, Daniel? Re/Datev: wo Du recht hast hast Du recht ;-)

BG
Jan
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 11:13:26
Der Steuerfuzzi
Wie genau hast Du Daniels Lösung umgesetzt? Beim Einlesen der Datei, so wie es Daniel vorgeschlagen hat, werden mW die Anführungszeichen direkt entfernt.
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 12:16:21
Jan
Es scheint, dass ich hier mit den Vornamen durcheinander komme... werde wahrscheinlich alt ;-)

Ich habe Michaels Funktion umgesetzt, klappt über den flag des Anfangs und Endes zur Identifikation des relevanten Teilstrings super. Nur die Anführungszeichen bei dem Teilstring mussten noch weg... Dazu habe ich in Deinen Code vor dem Zusammenbasteln des neuen Strings eine Bedingung gesetzt, die Anführungszeichen nicht berücksichtigt.

If Mid$(strinput, i, 1) > Chr$(34) Then Temp(z) = Temp(z) & Mid$(strinput, i, 1)


Da Einsatz der Funktion nur bei identifizierten Anführungszeichen ist die Performance mit und ohne Funktion nahezu identisch (Differenzen im 100stel sek Bereich)
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 12:46:39
Der Steuerfuzzi
So entfernst Du halt alle Anführungszeichen, auch solche, die im Text beabsichtigt vorkommen können.
Wenn du also sämtliche Anführungszeichen entfernen willst, kannst Du das auch direkt am Anfang mit strInput = Replace(strInput, """", "") erledigen. Davor (und das kannst Du ohnehin machen) solltest Du aber den Parameter strInput ByVal setzen.

Wenn Du nicht alle entfernen willst, kannst du das z. B. vor jedem erhöhen von z für den vorhergehenden Eintrag machen. Musst halt den letzten Eintrag noch nach der Schleife auch nochmal auf Anführungszeichen am Anfang und Ende prüfen und dann ggf. entfernen.
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 11:15:56
daniel
Hi
1. CSV als Excel datei öffnen
2. Anführungszeichen im Exceltabellenblatt mit Replace entfernen
3. Exceltabellenblatt in CSV einlesen.

aber mal testen. Wenn Texte in Zellen mit "=", "-" oder "+" anfangen, wird Excel versuchen, diese in Formeln oder Zahlen zu wandeln

Gruß Daniel
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 09:24:40
Jan
Hi Jochen,

danke für die Idee. Der Schleifendurchlauf ist ähnlich meinem Regex Versuch. Dadie csv auch mal 1 Mio Zeilen haben drückt das so stark auf die Perfomance, dass ich mir die ganze Aktion mit dem Array sparen könnte und gleich in Excel arbeiten. Excel ist dann deutlich schneller.

Hoffe es gibt eine Idee, sonst müsste ich in einem workaround die csv erst (korrekt) in excel schreiben und dann von dort ins array zur Weiterverarbeitung packen. Ist aber natürlich ein ineffizienter/unnötiger Schritt und drückt damit unnötig auf die Performance.

BG
Jan
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 09:53:29
Jan
Hallo Karl-Heinz,

ich hab Dich fälschlich mit Jochen angesprochen, verzeih mir ;-)

Ich wollte Deine Variante grad maldurchtesten, aber steh noch auf dem Schlauch. Wie willst Du die csv Zeile handeln nachdem ich diese (mit gefundenem Anführungszeichen) identifiziert habe? Die hier als Beispiel:

5;7;8;"Ich bin der Text mit Semikolons;0;8;9";789;5

Die Semikolons müssen nur in den Anführungszeichen raus, nicht alle... Kannst Du mir auf die Sprünge helfen...

BG
Jan
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 10:31:07
volti
Hallo Jan,

eine Idee dazu....

Code:


Sub Test() Dim lngZeile As Long, VarDat(10) As String, VarErg() As String Dim bChck As Boolean, i As Long, Pos As Long ' Testvorbereitung VarDat(1) = Replace("5;7;8;|Text mit Semikolons;0;8;9|;789;5;|Ich;auch|", "|", Chr$(34)) VarDat(2) = "5;7;8;Ich bin der Text ohne Semikolons,0,8;9;789;5" lngZeile = 1 ' Nutzcode Pos = InStr(VarDat(lngZeile), Chr$(34)) If Pos > 0 Then bChck = False For i = Pos To Len(VarDat(lngZeile)) If Mid$(VarDat(lngZeile), i, 1) = Chr$(34) Then bChck = Not bChck If Mid$(VarDat(lngZeile), i, 1) = ";" And bChck Then Mid$(VarDat(lngZeile), i, 1) = "|" End If Next i VarErg = Split(Replace(VarDat(lngZeile), Chr$(34), ""), ";") For i = 0 To UBound(VarErg) VarErg(i) = Replace(VarErg(i), "|", ";") Next i Else VarErg = Split(VarDat(lngZeile), ";") End If ' Ergebnisausgabe For i = 0 To UBound(VarErg) Debug.Print i, VarErg(i) Next i End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz
Anzeige
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 13:17:16
Jan
Vielen Dank Karl-Heinz. Eure Lösungen funktionieren alle flott, da sie nur für den seltenen Fall zum Einsatz kommen, dass ein die Anführungszeichen (bei Vorkommen eines Semikolons m Text) identifiziert werden.

Lieber viele Wege nach Rom, als nicht ankommen 😉
AW: CSV in Arrayeinlesen - Splittingprobleme
24.05.2024 10:41:01
volti
Hallo Jan,

wenn Du alles ausprobierst, also meine Variante, die Originalvariante ohne Behandlung und die von Michael lass es uns wissen, wie die Performance jeweils ist.

Also mit Timer mal messen. Das wäre m.E. ganz interessant.

Gruß KH
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige