Hallo Ihr Spezialisten ich hab da ein Problem und komme auch nach längeren herumsuchen im Internet nicht weiter.
Ich habe eine csv-datei.001 wie folgt:
ALHWANA
ALK9VO
ALKHBE3/4
ALKKFE
ALKKFE3/4
ALKMIDI
CRLF zeilenweise getrennt.
Ich habe ein csv-datei002 wie folgt:
['A;N;KEM47670040;00;KEMPER Niro-Pressverschr. SANPRESS INOX;flachdichtend DN40/42mm G1 3/4i;1;0;ST;6942;562Z;090; ;']
['B;N;KEM47670040;KEM47670040; ; ;0;0;0; ; ;0908;0;1; ; ;']
['A;N;KEM47670041;00;KEMPER Niro-Pressverschr. SANPRESS INOX;flachdichtend DN40/42mm G1 3/4i;1;0;ST;6942;562Z;090; ;']
['B;N;KEM47670041;KEM47670040; ; ;0;0;0; ; ;0908;0;1; ; ;']
Menge so ca.200000 Zeilen
Jetzt möchte aus Datei001 den ersten Begriff auswählen und in Datei002 suchen im 2 Feld (weil es sollte eine Liste sein?). Wenn gefunden den
gefundenen Datensatz in einer neuen csv-Datei speichern. Und dann in datei001 den nächsten nehmen und wieder
in Datei002 suchen usw. bis " " kommt in Datei001
Mit for und while ist es mir nicht gelungen da immer die ganze Datei durchlaufen wird.
Könnt Ihr mir da bitte helfen.
Besten Dank im Voraus.
Datensätze nacheinander verarbeiten
Deine csv-datei.001 sieht komisch aus, weil das ja nur Begriffe sind, die untereinander stehen.
Deine csv-datei002 sieht komisch aus, weil es in der Datei jeder Zeile so eckige Klammern hat. Die erste Spalte mit ['A und die letzte mit '] machen irgendwie keinen Sinn. Sieht die Datei denn wirklich so aus?
Wie sieht denn der Code aus, den Du versucht hast?
Schritte wären ja, csv-datei002 komplett einlesen, zur Effizienz in ein Wörterbuch umwandeln und dann die erste Datei einfach durchgehen.
Deine csv-datei002 sieht komisch aus, weil es in der Datei jeder Zeile so eckige Klammern hat. Die erste Spalte mit ['A und die letzte mit '] machen irgendwie keinen Sinn. Sieht die Datei denn wirklich so aus?
Wie sieht denn der Code aus, den Du versucht hast?
Schritte wären ja, csv-datei002 komplett einlesen, zur Effizienz in ein Wörterbuch umwandeln und dann die erste Datei einfach durchgehen.
Die Datei schaut aus dem Grund komisch aus weil sie so eingelesen und am Bildschirm angezeigt wird.
So eingelesen:
with open('C:/users/datanorm.002', 'r', encoding='ANSI', newline='') as codes:
# leser = csv.reader(codes, dialect='excel')
# for line in leser:
# print(line)
Dann kommt so eine komischer Druck auf Bildschirm heraus:
['A;N;KEM47670040;00;KEMPER Niro-Pressverschr. SANPRESS INOX;flachdichtend DN40/42mm G1 3/4i;1;0;ST;6942;562Z;090; ;']
['B;N;KEM47670040;KEM47670040; ; ;0;0;0; ; ;0908;0;1; ; ;']
Könnte das ein Liste sein, oder wie kann ich das besser einlesen?
So eingelesen:
with open('C:/users/datanorm.002', 'r', encoding='ANSI', newline='') as codes:
# leser = csv.reader(codes, dialect='excel')
# for line in leser:
# print(line)
Dann kommt so eine komischer Druck auf Bildschirm heraus:
['A;N;KEM47670040;00;KEMPER Niro-Pressverschr. SANPRESS INOX;flachdichtend DN40/42mm G1 3/4i;1;0;ST;6942;562Z;090; ;']
['B;N;KEM47670040;KEM47670040; ; ;0;0;0; ; ;0908;0;1; ; ;']
Könnte das ein Liste sein, oder wie kann ich das besser einlesen?
Und ANSI ist wohl eher ASCII. Daher bitte tatsächlich lauffähigen Code zeigen, damit das tatsächliche Problem erkennbar ist. Es nur "so in etwa" zu zeigen ist beim Programmieren (gerade wenn man Anfänger ist) keine so gute Idee... 

Also für mich sieht das gar nicht komisch aus.
Die erste Datei ist halt eine normale Textdatei, wo in jeder Zeile ein Begriff drin steht.
Die zweite Datei ist die Ausgabe einer Liste, die mit dem csv.reader gelesen wurde. (die Zeilen sind zwar im Beispiel auskommentiert, aber wenn man den Code ausführen würde, dann würde ich das gezeigte Ergebnis so oder so ähnlich erwarten)
Ich würde das so lösen:
1. erste Datei in eine Liste stopfen
2. erste Datei in eine temporäre Sqlite-DB im RAM schreiben (evtl auch auf Platte, aber die DB wird ja bestimmt keine zig GB an Arbeitsspeicher brauchen)
3. per SQL die Datensätze aus der Sqlite-DB ziehen
4. Ergebnis entweder gleich in eine Datei auf der Platte schreiben oder in der Sqlite zwischenspeichern und zum Schluss alles gesamt schreiben
Die erste Datei ist halt eine normale Textdatei, wo in jeder Zeile ein Begriff drin steht.
Die zweite Datei ist die Ausgabe einer Liste, die mit dem csv.reader gelesen wurde. (die Zeilen sind zwar im Beispiel auskommentiert, aber wenn man den Code ausführen würde, dann würde ich das gezeigte Ergebnis so oder so ähnlich erwarten)
Ich würde das so lösen:
1. erste Datei in eine Liste stopfen
2. erste Datei in eine temporäre Sqlite-DB im RAM schreiben (evtl auch auf Platte, aber die DB wird ja bestimmt keine zig GB an Arbeitsspeicher brauchen)
3. per SQL die Datensätze aus der Sqlite-DB ziehen
4. Ergebnis entweder gleich in eine Datei auf der Platte schreiben oder in der Sqlite zwischenspeichern und zum Schluss alles gesamt schreiben
Hallo Sirius3,
Du schreibst "Da wird gar nichts gelesen, weil Du alles auskommentiert hast".
Ich hab und kann da auch nichts aus kommentiert haben, weil die Datei so am Bildschirm angezeigt wird.
Das Trennzeichen ist auch nicht falsch weil eben das Trennzeichen ein "," ist.
Hallo snafu,
es ist auch keine ADCII Datei weil ich diese nur als ANSI einlesen kann. Und
ich zeig auch nicht "nur so in etwa", weil der Code wie ich ihn einlese so ist
wie bereits mitgeteilt.
Ich kann auch keinen lauffähigen Code anzeigen, weil ich nach dem Einlesen
eben nicht weiterkomme. Ich habe schon x-verschiedene Codes ausprobiert.
Das Problem ist das die for-Schleife immer komplett durchläuft. Ich brauch
einen HINWEIS wie ich die Datensätze EINZELN verarbeiten kann, eben
einen Datensatz nach dem anderen. Also welchen Code willst Du da sehen?
Hallo bfm, danke Du hast das Problem erkannt. Ich hab mich mit der Sqlite-DB
bereits beschäftigt. Werde deine Vorschläge ausprobieren.
Also auf jeden Fall DANKE für eure Bemühungen auch wenns teilweise keine
wirklichen Hilfen waren.
Du schreibst "Da wird gar nichts gelesen, weil Du alles auskommentiert hast".
Ich hab und kann da auch nichts aus kommentiert haben, weil die Datei so am Bildschirm angezeigt wird.
Das Trennzeichen ist auch nicht falsch weil eben das Trennzeichen ein "," ist.
Hallo snafu,
es ist auch keine ADCII Datei weil ich diese nur als ANSI einlesen kann. Und
ich zeig auch nicht "nur so in etwa", weil der Code wie ich ihn einlese so ist
wie bereits mitgeteilt.
Ich kann auch keinen lauffähigen Code anzeigen, weil ich nach dem Einlesen
eben nicht weiterkomme. Ich habe schon x-verschiedene Codes ausprobiert.
Das Problem ist das die for-Schleife immer komplett durchläuft. Ich brauch
einen HINWEIS wie ich die Datensätze EINZELN verarbeiten kann, eben
einen Datensatz nach dem anderen. Also welchen Code willst Du da sehen?
Hallo bfm, danke Du hast das Problem erkannt. Ich hab mich mit der Sqlite-DB
bereits beschäftigt. Werde deine Vorschläge ausprobieren.
Also auf jeden Fall DANKE für eure Bemühungen auch wenns teilweise keine
wirklichen Hilfen waren.
@ossi047: Der code kann nicht ausgeführt werden, weil du ihn auskommentiert hast. Da hat Sirius3 schon recht.
Was ist denn die Ausgabe des folgenden Codes?
Edit: Encoding angepasst.
Was ist denn die Ausgabe des folgenden Codes?
Code: Alles auswählen
with open('C:/users/datanorm.002', 'r', encoding="cp1252") as file:
for line_count, line in enumerate(file):
print(f"{line_count}: {repr(line)}")
if line_count > 20:
break
- __blackjack__
- User
- Beiträge: 14030
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@ossi047: In dem Quelltext den Du zeigst sind die Zeilen auskommentiert. Wenn der Code etwas ausgibt, dann ist das anderer Code, also mindestens mal ohne das auskommentieren.
Und das Trennzeichen ist ganz offensichtlich nicht das Komma, sondern das Semikolon.
Beides *sehen* wir ganz *deutlich* an dem was Du da im Beitrag zeigst. Da kannst Du was anderes behaupten solange Du magst, es macht aber keinen Sinn gegen Fakten zu argumentieren.
ANSI ist ”falsch”, denn das ist keine offizielle Kodierung. Python akzeptiert diesen Unsinn auch nur unter Windows. Der offizielle Name der Kodierung ist CP1252, und den sollte man auch verwenden.
*Welche* Datensätze willst Du einzeln verarbeiten? Über *diese* Datensätze musst Du halt eine Schleife schreiben.
Und das Trennzeichen ist ganz offensichtlich nicht das Komma, sondern das Semikolon.
Beides *sehen* wir ganz *deutlich* an dem was Du da im Beitrag zeigst. Da kannst Du was anderes behaupten solange Du magst, es macht aber keinen Sinn gegen Fakten zu argumentieren.
ANSI ist ”falsch”, denn das ist keine offizielle Kodierung. Python akzeptiert diesen Unsinn auch nur unter Windows. Der offizielle Name der Kodierung ist CP1252, und den sollte man auch verwenden.
*Welche* Datensätze willst Du einzeln verarbeiten? Über *diese* Datensätze musst Du halt eine Schleife schreiben.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.