Abschneiden von Zeichenketten<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich habe mehrere Datentabellen, die eine Spalte namens "Gefunden in Version" enthalten.Die Hauptversionen sind normalerweise 4-stellig – die Nebenversionen hängen manchmal ein Alpha-Zeichen an das Ende einer Hauptversionsnummer an.Für die Zwecke der grafischen Darstellung möchte ich die Nebenversionen nicht zeigen – stattdessen möchte ich die Nebenversionen mit den zugehörigen Hauptversionen zusammenführen.Zum Beispiel...Wenn eine Hauptversion 5.1.2.1 ist, möchte ich, dass die Nebenversion 5.1.2.1a auch 5.1.2.1 heißt ...
Um eine weitere Falte in die Mischung zu werfen ---- Ich möchte vielleicht auch alle 5.1.2.x in 5.1.2 konvertieren ---- also 5.1.2.0, 5.1.2.2a, 5.1.2.3, 5.1.2.4a , etc ... würde Version 5.1.2 werden
Die aktuelle Spalte ist 'Charakter', 'Nominal'......Ich dachte daran, die Zeichenfolgen in der Spalte auf 7 oder 5 Zeichen zu "kürzen", je nach benötigter/gewünschter Detailebene --- aber ich bin mir nicht sicher, wie das geht oder ob es einen besseren Ansatz gibt.
Außerdem --- ich erhalte Datentabellen von verschiedenen Teams --- jedes scheint ein anderes Versionierungsschema zu haben --- also muss Flexibilität eingebaut werden ----- ich bin mir nicht sicher, ob ich alle Daten analysieren muss Element s, und vergleichen Sie gemeinsame Zeichen, um zu sehen, ob sie zur selben Version 'gehören' ???

Betreff: Abschneiden von ZeichenkettenDie Antworten hier waren sehr hilfreich und ließen mich glauben, dass ich das vielleicht zu kompliziert gemacht habe - also habe ich die Zeichenfunktion "Links" ausprobiert, konnte sie aber letzte Woche nicht zum Laufen bringen ....meine Syntax muss 'off' gewesen sein --- weil es heute für mich funktioniert hat..
| Für jede Reihe (: Gefunden in Vers Truncated = Left(:Gefunden in Version, 7)); |
---- dies schneidet einfach die Zeichenkette ganz links ab ... wodurch die Zeichen der kleineren Version entfernt werden --- da die Versionsnummern verschiedener Teams nicht konsistent sind (einige Teams verwenden 4 Ziffern mit angehängten Alpha-Zeichen, einige verwenden 3 Ziffern ohne angehängte Alphazeichen) Ich denke, diese Methode könnte funktionieren, aber ich muss testen, welches Versionsschema verwendet wird, um den Grad der Kürzung zu bestimmen ....
Betreff: Abschneiden von ZeichenkettenIch denke, ein regulärer Ausdruck (regex()) könnte das Problem lösen.
Newcolumn("Found in Version Major",character,nominal,
formula(regex(:Gefunden in Version, ".*?(\d+\.\d+\.\d+).*","\1")
);
".*?(\d+\.\d+\.\d+).*" bedeutet gerade genug von allem finden, .*?, gefolgt von einer beliebig langen Zahl, \d+, einmal dezimal, \., eine Zahl beliebiger Länge, \d+, einmal dezimal, \. , eine Zahl beliebiger Länge, \d+, gefolgt von irgendetwas. Geben Sie nur den Teil in Klammern zurück, die Zahlen und Dezimalstellen, \1.
Ändern Sie für die Nebenversion den regulären Ausdruck (regex()) so, dass er eine Dezimalstelle und eine Zahl mehr enthält.
Newcolumn("Found in Version Minor",character,nominal,
formula(regex(:Gefunden in Version, ".*?(\d+\.\d+\.\d+\.\d+).*","\1")
);
Betreff: Abschneiden von ZeichenkettenAuf der anderen Seite ist dies die Atomwaffe von ETL, die garantiert alles erledigt, aber mehr Arbeit. Möglicherweise stellen Sie fest, dass dies die einzige Option ist, wenn Ihre verschiedenen Lieferanten erheblich unterschiedliche Prozesse verfolgen.
Erstellen Sie einfach eine eindeutige Konformitätstabelle für jeden Lieferanten:
Daten haben;
Länge FoundInVersion $32;
Eingabe FoundInVersion $;
Karten;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9seltsam
laufen;
Datenmaster_conversion;
Länge FoundInVersionGood FoundInVersion $32;
Eingabe FoundInVersionGood $ FoundInVersion $;
Karten;
5.1.2 5.1.2.1
5.1.2 5.1.2.2
5.2.2 5.2.2.2a
5.2.2 5.2.2.3
5.2.2 5.2.2.3x
5.2.2 5.2.2.9
5.2.2 5.2.2.9seltsam
laufen;
proc sql;
Tabelle erstellen wollen als
Wählen Sie FoundInVersionGood als FoundInVersion aus
von master_conversion Inner Join
have on (master_conversion.FoundInVersion = have.FoundInVersion);
aufhören;
Tom
Betreff: Abschneiden von ZeichenkettenEntschuldigung für die Verwendung von SAS-Code, da ich kein JMP-Benutzer bin ... vielleicht existieren die entsprechenden Funktionen in JMP?
Das ist sehr einfach und sehr dumm, also müssen die Daten ziemlich konform sein:
Daten haben;
Länge FoundInVersion $32;
Eingabe FoundInVersion $;
Karten;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9seltsam
laufen;
Daten wollen;
Länge FoundInVersionGood $32;
haben;
/* Verwenden Sie einen Punkt als Trennzeichen, suchen Sie nach dem ersten, zweiten und dritten Wort (SCAN) und verketten Sie sie dann mit Punkten dazwischen (CATX). */
/* geht davon aus, dass es immer mindestens drei Ebenen gibt */
FoundInVersionGood = catx(".", scan(FoundInVersion,1,"."), scan(FoundInVersion,2,"."), scan(FoundInVersion,3,"."));
laufen;
Tom
Betreff: Abschneiden von ZeichenkettenDies wird den Trick tun.Durchläuft alle Werte und verwendet reguläre Ausdrücke, um jeden Wert zu testen.
dt = aktuelle Datentabelle () ;
dt << neue Spalte ( "Gefunden in Vers abgeschnitten" , Charakter , nominell ) ;
für ( ich = 1 , ich <= näht ( dt ) , ich ++,
Testwert = Spalte ( dt , "Gefunden in Version" )[ ich ] ;
// Prüfen, ob das letzte Zeichen eines von a bis z ist
Wenn ( wird vermisst ( regulärer Ausdruck ( Testwert , "[az]$" )) ,
// Dann
Spalte ( dt , "Gefunden in Vers abgeschnitten" )[ ich ] = Testwert ;
,
// anders
eine_länge = Länge ( Testwert ) ;
Spalte ( dt , "Gefunden in Vers abgeschnitten" )[ ich ] = Substr ( Testwert , 1 , ( eine_länge - 1 )) ;
) ;
) ;
Betreff: Abschneiden von ZeichenkettenHallo,
Ich bin mir nicht sicher, ob Sie das wollen:
Daten haben;
Eingabe alt: $10.;
Karten;
5.1.2
5.1.2.1
5.1.2.1e
;
Daten wollen;
Länge neu 5 $;
haben;
neu=alt;
laufen;
proc print;run;
Haikuo