2017-07-19 4 views
0

Ich bin neu in C#. Ich parse für eine Losnummer in einem 2D-Barcode. Die tatsächliche Chargennummer 'A2351' ist in dieser Barcode-Zeichenfolge "+ M727PP011/$$ 3201001A2351S" verborgen. Ich möchte diesen Barcode in separaten String-Blöcken aufteilen, aber die Trennzeichen sind nicht konsistent.Parsen einer Zeichenfolge, um einen bestimmten Wert zu erhalten

Der Buchstabe vor der 4-stelligen Lotnummer kann ein "A", "P" oder ein "D" sein. Nach der Lot-Nummer gibt es einen Buchstaben, der ignoriert werden kann.

string Delimiter = "/$$3"; 

//barcode format:M###PP###/$$3 ddmmyy lotnumprefix 'A' followed by lotNum  
string lotNum= "+M727PP011/$$3201001A2351S"; 

string[] split = lotNum.Split(new[] {Delimiter}, StringSplitOptions.None); 

Wie extrahiere ich die Chargennummer nach dem Datum?

+2

Es sieht (von Ihrem Formatkommentar) so aus, dass der String immer eine konsistente Länge bis zum 'A' hat, also warum nicht einfach einen Teilstring von diesem Punkt nehmen? – pstrjds

+0

Wenn die Chargennummer immer mit einem A beginnt, können Sie vielleicht danach suchen und die Werte danach nehmen? – Twtheo

+0

Wenden Sie sich an die für den Versand des Barcodes verantwortliche Person und fragen Sie, wie Sie die Chargennummer extrahieren können. –

Antwort

0

Wenn Sie nur versuchen, die Lot-Nummer zu erhalten, ist es wirklich abhängig vom Format der Eingabezeichenfolge (ist es eine konsistente Länge, gibt es zuverlässige Präfixe/Suffixe relativ zu den Daten, die Sie analysieren möchten auf die Sie verweisen können, usw.). Es scheint, dass Ihre Daten durch ihre statische Position in der Zeichenfolge definiert werden können. Es sieht also so aus, als könnten Sie die Methode substring (mit einem Index von 20?) Verwenden, um das zu erreichen, was Sie wollen.

1

Ausgehend von Ihrem ersten Beispiel und der anschließenden Bearbeitung, in der Sie gezeigt haben, wie Sie das Problem lösen, klingt die Losnummer immer an der gleichen Stelle. Es wäre sauberer (und mehr im Einklang mit dem Standard-C# -Code), einen einzigen Aufruf an string.Substring(int,int) statt der zwei Zeilen, die Sie verwenden, zu verwenden, die auch das Ziehen der VB-Bibliothek erfordern. Sie müssen nur Substring anrufen und geben Sie den Startindex und die Länge.

Also dieser Code:

string lotNum = barcode.Substring(barcode.Length - 6, 5); 

bearbeiten
Nur eine weitere Klärung, warum es um den Anruf zu verwenden, könnte besser sein:

string lotNum = Strings.Right(barcode, 6); 
lotNum = lotNum.Remove((lotNum.Length - 1), 1); 

kann mit diesem einzelnen Teilzeichen Anruf erfolgen Substring. In C# string Objekte sind unveränderlich. Das heißt, wenn Sie den Aufruf an Strings.Right vornehmen, erhalten Sie ein neues Zeichenfolgenobjekt zurück. Wenn Sie dann lotNum.Remove aufrufen, "entfernen" Sie kein Zeichen aus der vorhandenen Zeichenfolge, wird eine neue Zeichenfolge mit den entfernten Zeichen zugeordnet und Ihnen zurückgegeben. Mit Ihrem Code gibt es also zwei neue String-Zuweisungen, wenn Sie versuchen, die Lot-Nummer zu extrahieren. Wenn Sie den Aufruf an Substring tätigen, erhalten Sie eine neue Zeichenfolge zurück, aber anstatt eine neue Zeichenfolge zu erhalten, die Sie sofort ändern und eine zweite neue Zeichenfolge abrufen, müssen Sie nur eine neue Zeichenfolge zuweisen, um die Losnummer zu extrahieren. In dem Beispiel, das Sie angegeben haben, würde es wahrscheinlich kein merkliches Performance-/Speicherproblem geben, aber es könnte etwas zu Problemen führen, wenn dieser Code in einer engen Schleife oder ähnlichem wäre.

Verwandte Themen