ubuntuusers.de

Liste aktualisieren

Status: Gelöst | Ubuntu-Version: Kubuntu 11.04 (Natty Narwhal)
Antworten |

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Habe Dein Miniscript verwendet, bei diff wird aber nichts ausgegeben, sollte also ok sein.

Habe auch die Spalte Hersteller in der Lieferantenliste nach Leerzeichen vor bzw. hinter dem Namen geschaut, ist aber auch ok.

Die einzelnen Lieferantendateien, haben unterschiedliche Kodierungen, die ich zuerst in das utf-8 Format kodiere.

Anschließend kommen die Daten der einzelne Lieferantendateien in eine Hauptdatei "liste.txt".

Könnte es an der Konvertierung evtl. liegen und daß ich diese dann in eine Datei speichere?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Nobuddy schrieb:

...\ Könnte es an der Konvertierung evtl. liegen und daß ich diese dann in eine Datei speichere?

Das war auch mein Verdacht. Dass da Zeichen auftauchen, an denen er sich verschluckt.

Vielleicht ergibt ja so ein Versuch etwas:

grep -n '[^[:alnum:][:punct:][:space:]]'  liste.txt

oder

LANG=C  grep -n '[^[:alnum:][:punct:][:space:]]'  liste.txt

- das sollte alle ungewöhnlichen Zeichen finden.

track

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

track, wir kommen der Sache näher.

Erster Befehl gab keine Meldung aus.

Beim zweiten Befehl, hakelt es aber gerade zu Meldungen.

Auf den ersten Blick, ist es ein Umlaute-Problem, die in der liste.txt zwar richtig angezeigt wird, aber wie im Terminal zu sehen ist, falsch interpretiert wird.

Hier gerade mal ein Beispiel.

Aus liste.txt

028	G29438	VITALGEBÄCK 6G 110103160 GRATIS V.FH			110103160	STK	1	2	1											17	050			LAGER

Ausgabe Terminal

028       G29438  VITALGEB��CK 6G 110103160 GRATIS V.FH                  110103160        STK     1       2       1                              17       050                     LAGER

Hilft da wenn ich die liste.txt von utf-8 auf isoXYZ konvertiere und dann wieder zu utf-8 zurück?

Oder gibt es da eine andere Lösung?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Nobuddy schrieb:

Oder gibt es da eine andere Lösung?

Die Lösung nennt sich Unicode 😉 Aber das können die Bash-Tools vermutlich nicht, wie auch, wenn der kleinste gemeinsame Nenner in der Shell immer die Datei ist? Aber der Hinweis zu einer universellen Programmiersprache wurde ja schon zig Mal gemacht 😈

Prinzipiell gilt: Wenn Deine Tools auf eine spezielle Codierung zugeschnitten sind, dann musst Du diesen als Eingabe auf immer Daten in diesem Encoding liefern.

Ich denke schon, dass es empfehlenswert ist, die Scripte auf UTF-8 auszulegen. Dann musst Du vorher die Eingabedaten eben in dieses Encoding wandeln.

Wenn Du in Deiner Toolchain anfängst zu mischen, wirst Du immer im Chaos enden...

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Vorsicht ... bei dem 2. Test habe ich mit "LANG=C" die utf-8 Codierung abgeschaltet !

Klar, dass er dann utf-8-Umlaute ohne Ende schmeißt, denn die sind ja kein Standard ASCII.

Und bei dem Test ging es ja um die Hersteller-Datei, nicht die normalen Lieferanten-Listen.
Wir wollten ja die Test-Herstellerdatei mit der echten Herstellerdatei vergleichen, oder ...?

Oder verstehe ich das falsch ?

track

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Lysander, ich kenne Deinen Vorschlag, aber bis ich mich da hinein gearbeitet habe, dauert es im Moment etwas zu lange.

Ich habe mir vorgenommen, mir die Programmierung von relationalen Datenbanken zu erlernen, muß aber noch warten ...

-

track, dann habe ich Dich falsch verstanden.

Bei beiden Dateien ("orignalHerstellerDatei.txt" "originalHerstellerDatei.test"), wird das Gleiche angezeigt, hier ein Auszug

VARTA       VARTA-GER�TEBATTERIE-GMBH
G�SS        G�SS-VERLAG-GMBH

Hier ein Beispiel aus der liste.txt

SCHL��SSELANH��NGER

Bei der liste.txt, werden die Umlaute wie Ü und Ä, mit zwei Fehlerzeichen angezeigt, während bei der "originalHerstellerDatei.txt" und "originalHerstellerDatei.test", nur ein Fehlerzeichen angezeigt wird.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Nobuddy schrieb:

Lysander, ich kenne Deinen Vorschlag, aber bis ich mich da hinein gearbeitet habe, dauert es im Moment etwas zu lange.

Ich habe mir vorgenommen, mir die Programmierung von relationalen Datenbanken zu erlernen, muß aber noch warten ...

Hier meinte ich wirklich eine Programmiersprache, nicht eine DB.

Bei beiden Dateien ("orignalHerstellerDatei.txt" "originalHerstellerDatei.test"), wird das Gleiche angezeigt, hier ein Auszug

VARTA       VARTA-GER�TEBATTERIE-GMBH
G�SS        G�SS-VERLAG-GMBH

Hier ein Beispiel aus der liste.txt

SCHL��SSELANH��NGER

Bei der liste.txt, werden die Umlaute wie Ü und Ä, mit zwei Fehlerzeichen angezeigt, während bei der "originalHerstellerDatei.txt" und "originalHerstellerDatei.test", nur ein Fehlerzeichen angezeigt wird.

Verwechsle "angezeigt" nicht mit dem Encoding. Du kannst das Encoding nicht raten, du musst es wissen. Die Anzeige kann bedeuten, dass der Betrachter diese Zeichen nicht darstellen kann. Öffne das doch einfach mit einem Editor, der so ziemlich alle Encodings anzeigen kann.

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo Lysander,

ich habe die vom Lieferant erhaltene Datei, die meistens als Textdatei geliefert wird, mit kate geöffnet und geschaut, unter welcher Kodierung die Texte richtig angezeigt werden.

Danach konvertiere ich die Datei z.B.

1
iconv -f ISO8859-1 -t UTF-8 028work.csv -o 028utf8.txt

Das mache ich mit allen Lieferantendateien so.

Die Daten werden dann auch mit kate korrekt angezeigt, warum das Problem mit der Konvertierung weiterhin da ist, verstehe ich momentan nicht ganz.

Mache ich da etwas falsch in der Vorgehensweise?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Nobuddy schrieb:

Mache ich da etwas falsch in der Vorgehensweise?

Eigentlich nicht, außer: Du kannst eben doch ein falsches Encoding geraten haben. Wenn allerdings alle Zeichen der alten Konvertierung auch in der neuen angezeigt werden, ist zumindest diese Untermenge so konvertierbar. Generell gilt eben: Du musst Encodings wissen; raten kann man zwar, aber es bleibt eine Unsicherheit.

Allerdings sehe ich dann Dein Problem nicht. Wo hapert es denn jetzt noch?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Nobuddy schrieb:

Bei der liste.txt, werden die Umlaute wie Ü und Ä, mit zwei Fehlerzeichen angezeigt, während bei der "originalHerstellerDatei.txt" und "originalHerstellerDatei.test", nur ein Fehlerzeichen angezeigt wird.

Dann sieht das doch sehr nach einem Codierungsproblem aus, dass da für die Umlaute verschiedenes kommt.

Was bekommst Du, wenn Du die fraglichen Zeilen ganz normal mit utf-8 anguckst:

grep 'VARTA-GER'  orignalHerstellerDatei.txt

und

grep 'SSELANH'  liste.txt

Wenn beide korrekten Text, ohne Fehlerzeichen anzeigen, dann solltest Du Dir den Code noch genauer ansehen:

grep 'VARTA-GER'  orignalHerstellerDatei.txt  |  hd
grep 'SSELANH'  liste.txt  |  hd

Postest Du das Ergebnis der HEX-Darstellung dann mal ? - dann kann ich Dir vielleicht direkt sagen, was da los ist.

Denn das was Lysander sagt, vermute ich auch: dass Du irgendwo noch eine andere Codierung als utf-8 drin hast.

track

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo, bin heute nicht ganz so schnell ... 😉

Habe festgestellt, daß die Herstellerliste noch in ISO8859-15 war. 😳

Diese habe ich jetzt in UTF-8 konvertiert.

Jetzt erhalte ich bei

1
LANG=C  grep -n '[^[:alnum:][:punct:][:space:]]'  hersteller.txt

die gleiche Anzahl der Fehlerzeichen,

G��SS       G��SS
VARTA       VARTA-GER��TEBATTERIE-GMBH

wie bei der liste.txt

SCHL��SSELANH��NGER

Bei

1
grep 'VARTA-GER'  orignalHerstellerDatei.txt  |  hd

kommt folgendes

00000000  56 41 52 54 41 09 56 41  52 54 41 2d 47 45 52 c3  |VARTA.VARTA-GER.|
00000010  84 54 45 42 41 54 54 45  52 49 45 2d 47 4d 42 48  |.TEBATTERIE-GMBH|
00000020  0d 0a                                             |..|
00000022

Bei

1
grep 'SSELANH'  liste.txt  |  hd

kommt folgendes (kleiner Auszug)

00008e70  09 09 09 09 09 09 09 09  39 39 09 30 39 38 09 09  |........99.098..|
00008e80  09 4c 41 47 45 52 0a 30  32 38 09 47 32 36 37 31  |.LAGER.028.G2671|
00008e90  31 09 53 43 48 4c c3 9c  53 53 45 4c 41 4e 48 c3  |1.SCHL..SSELANH.|
00008ea0  84 4e 47 45 52 20 43 4c  45 41 52 20 47 52 41 54  |.NGER CLEAR GRAT|
00008eb0  49 53 20 56 2e 20 46 48  09 09 09 31 31 35 32 30  |IS V. FH...11520|
00008ec0  36 09 53 54 4b 09 31 09  32 09 31 09 30 2c 37 39  |6.STK.1.2.1.0,79|
00008ed0  09 31 2c 31 30 09 09 09  09 09 09 09 09 09 39 39  |.1,10.........99|
00008ee0  09 30 39 38 09 09 09 4c  41 47 45 52 0a           |.098...LAGER.|
00008eed

Ich werde jetzt nochmals die einzelnen Lieferantendateien auf die Kodierung hin überprüfen, evtl. gibt es da eine Änderung.

Eins steht fest, die Lieferanten können mir nicht sagen, wie Ihre Dateien kodiert sind, da habe ich schon vor längerem nachgefragt.

Nun zur Ausgabe

1
grep 'VARTA-GER' LISTEGRUND_HERSTELLER.txt

liefert

VARTA   VARTA-GERÄTEBATTERIE-GMBH

und

1
grep 'SSELANH'

liefert

028     G26711  SCHLÜSSELANHÄNGER CLEAR GRATIS V. FH                    115206 STK      1       2       1                                              99       098                     LAGER

Leider besteht das Problem weiterhin, daß das awk-Script, die Herstellerspalte nicht aktualisiert.

Wie gesagt, werde jetzt nochmals die Kodierung der Lieferantendateien überprüfen.

Wenn Ihr eine Idee habt, oder ich Euch eine Ausgabe posten soll, nur zu!

Grüße Nobuddy

grepliste.txt (176.4 KiB)
Download grepliste.txt

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Da die meisten ja aus der Windowswelt kommen, würde ich ja "cp1252" tippen. Fakt ist, Du musst das Encoding richtig erraten, bevor Du es sinnvoll konvertieren kannst.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Nobuddy schrieb:

$ grep 'VARTA-GER'  orignalHerstellerDatei.txt  |  hd
00000000  56 41 52 54 41 09 56 41  52 54 41 2d 47 45 52 c3  |VARTA.VARTA-GER.|
00000010  84 54 45 42 41 54 54 45  52 49 45 2d 47 4d 42 48  |.TEBATTERIE-GMBH|
00000020  0d 0a                                             |..|

Hier sieht man 2 Dinge wunderschön:

  1. Das "Ä" ist korrekt in utf-8 codiert. Das ist also schon mal in Ordnung. Vergleiche:

    echo "Ä"  |  hd
    00000000  c3 84 0a                                          |...|
  2. Am Ende der Zeile steht [0d][0a] - und das ist das Win..- Zeilenende.
    Das heißt, das [0d] wird unter *nix als Bestandteil des letzten Wortes aufgefasst, und dann steht dort natürlich "VARTA-GERÄTEBATTERIE-GMBH\r"
    - klar, dass er unter diesem Stichwort nichts findet ... 😉

Du hast diese Liste also unter Win.. erstellt und nicht konvertiert. Dann ist das ein Fall für dos2unix oder ersatzweise tr -d '\r' oder so.

LG,

track

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

So, was lange währt, währt endlich gut 👍

In 3 Lieferantenlisten hat sich anscheinend die Kodierung geändert.

Einmal von IBM850 zu ISO8859-15, CP1252 zu ISO8859-15 und ISO8859-1 zu ISO8859-15.

Nachdem ich den Link dos2unix von track mir angeschaut habe, habe ich dann die Lieferantendateien mit

1
cat DOS-Textdatei | dos2unix > Unix-Textdatei

auf das UNIX-Format gebracht und anschließend dann noch auf UTF-8 kodiert.

Das awk-Script funktioniert jetzt prima. ☺

War jetzt ein längerer Weg bis zum Ziel ..., aber es hat sich gelohnt!

Bei Dir track und Dir Lysander, möchte ich mich für Eure Ausdauer und Hilfestellung, recht herzlich bedanken. 👍

Wünsche Euch noch einen schönen Abend!

Grüße Nobuddy

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Habe eine weitere Frage zu dem awk-Script.

Ist es möglich dieses awk-Script

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#! /usr/bin/awk -f
	
BEGIN { FS="\t";					      	# Eingabe-Trenner
	OFS="\t";					      	# Ausgabe-Trenner

	while(getline < "LISTEGRUND_HERSTELLER.txt")  {		# lies zeilenweise die Hersteller-Datei
		hersteller[$2]= $1;				# in ein Array, mit der gekürzten EAN als Index
		}
	}									


FILENAME ~ "liste28.txt"	{
		bezH= $3;				# Benennungspalte
		if ( (hersteller[bezH] != "") )  {
			$5= hersteller[bezH];			# wenn Hersteller in Benennung gefunden wird, dann Array in Feld 5 einsetzen
			}
	print $0;						# drucken
	}

END { exit 0 }

zu verwenden (umzubauen), daß anhand der Herstellerliste in der Benennungsspalte gesucht wird und bei positivem Ergebnis, den Hersteller in die Herstellerspalte einträgt?

Lieferantendatei (Auszug)

002908	STABILO ROLLERBALL 2018/36 GN			2018-36	STK	10	2	1			10							0000042119180	12	054	546	F	LAGER
028	003343	SAMSUNG TONER CLP510D7K/ELS SCHWARZ			CLP510D7K/ELS	STK	1	2	1			3							8808979362868	01	064	34	

Die Herstellerliste (Auszug), wäre dann in diesem Format

SAMSUNG	SAMSUNG
STABILO	SCHWAN STABILO
STABILO	STABILO
STABILO	STABILO INTERNATIONAL GMBH
STABILO	STABILOS

Wäre dies möglich?

Wenn ja, wie bekomme ich es in dem awk-Script hin, daß ich einen Vergleich mit der Herstellerliste (zweite Spalte) und der Benennungsspalte der Lieferantenliste zustande bekomme?

Der Vergleich soll nur vom Anfang der Benennungsspalte ausgehen, also

SAMSUNG TONER BLABLA BLABLA ENDE
SCHWAN STABILO DER ULTIMATIVE STIFT ENDE

Grüße Nobuddy