none
Strings in Array aufteilen OHNE Delimeter zu verlieren. RRS feed

  • Frage

  • Hallo ich schreibe gerade ein Script und hänge gerade daran, dass ich Strings aufteilen muss ohne den Delimeter zu verlieren.

    Bsp. String:

    <mso:tab id="mso_c1.179B9A" label="TestUser" insertBeforeQ="mso:TabInsert">
    		<mso:group id="mso_c2.1779A" label="Vorlagen" imageMso="AppointmentColor2" autoScale="true">			
    			<mso:button idQ="x1:main_0_101BBF" label="BuchAnz" imageMso="AppointmentColor10" onAction="BuchAnz" visible="true"/>
    		</mso:group>
    
    		<mso:group id="mso_c1.112545" label="TestUser3" autoScale="true">
    			<mso:button idQ="x1:MailVersenden_0_1146ED" label="Mailversenden" imageMso="ShapeCloud" onAction="MailVersenden" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_MH_0_113335" label="Mailversenden_MH" imageMso="ShapeCloud" onAction="MailVersenden_MH" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_PB_1_113335" label="MailVersenden_PB" imageMso="ShapeCloud" onAction="MailVersenden_PB" visible="true"/>
    		</mso:group>
    </mso:tab>
    	
    	<mso:tab idQ="mso:TabMailings" visible="false"/>
    	<mso:tab idQ="mso:TabReviewWord" visible="false"/>

    Momentan benutze ich hierzu noch -Split:

    "$UserTabsSplit = $UserTabs -split "</mso:tab>" -replace "`t","" -replace "`n","""

    Ich muss die Tabs als einzellne haben und dachte mir ich Splitte bei </mso:Tab>

    Dies schneidet </mso:Tab> leider raus.

    Ich benötige aber das </mso:Tab> zwingend immernoch genau dort wo es ist. Der einfachste weg wäre wenn es wie gesagt die Möglichkeit gäbe zu -Splitten ohne den Delimeter zu entfernen.

    Ich hoffe ich habe mein Problem gut genug beschrieben.

    Hat jemand hierzu Ideen?

    Gruß

    TimTimBS




    Dienstag, 16. April 2013 10:26

Antworten

  • Ganz ruhig brauner..... Wir meinen es ja nur gut! ;-)
    Ich denke ich habe die Lösung mit -split oben schon gepostet!? Hast du dies übersehenoder verstehe ich nun etwas nicht?

    Man muss im -split den look-behind ?<= Operator nutzen, dann wird der Delimiter nicht aufgefressen!
    Hier noch einmal:

    $Text =  @'
    <mso:tab id="mso_c1.179B9A" label="TestUser" insertBeforeQ="mso:TabInsert">
    		<mso:group id="mso_c2.1779A" label="Vorlagen" imageMso="AppointmentColor2" autoScale="true">			
    			<mso:button idQ="x1:main_0_101BBF" label="BuchAnz" imageMso="AppointmentColor10" onAction="BuchAnz" visible="true"/>
    		</mso:group>
    
    		<mso:group id="mso_c1.112545" label="TestUser3" autoScale="true">
    			<mso:button idQ="x1:MailVersenden_0_1146ED" label="Mailversenden" imageMso="ShapeCloud" onAction="MailVersenden" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_MH_0_113335" label="Mailversenden_MH" imageMso="ShapeCloud" onAction="MailVersenden_MH" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_PB_1_113335" label="MailVersenden_PB" imageMso="ShapeCloud" onAction="MailVersenden_PB" visible="true"/>
    		</mso:group>
    </mso:tab>
    	
    	<mso:tab idQ="mso:TabMailings" visible="false"/>
    	<mso:tab idQ="mso:TabReviewWord" visible="false"/>
    '@
    
    $Text -split '(?<=</mso:tab>)'



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Mittwoch, 17. April 2013 08:48
    • Als Antwort markiert Timbble Mittwoch, 17. April 2013 09:34
    Mittwoch, 17. April 2013 08:46

Alle Antworten

  • Hi,

    was willst Du denn wirklich erreichen? XML läßt sich über das XML Object Model normalerweise einfacher bearbeiten, als über String Funktionen.


    -Raimund

    Dienstag, 16. April 2013 14:44
  • Ich gebe Raimund recht man sollte gerade bei XML Daten einen besseren Weg finden als Split.
    -split nutzt Regular Expressions (Regex), dort gibt es den look behind Operator ?<= der zeigt auch das Suchmuster mit an:

    $Text =  @'
    <mso:tab id="mso_c1.179B9A" label="TestUser" insertBeforeQ="mso:TabInsert">
    		<mso:group id="mso_c2.1779A" label="Vorlagen" imageMso="AppointmentColor2" autoScale="true">			
    			<mso:button idQ="x1:main_0_101BBF" label="BuchAnz" imageMso="AppointmentColor10" onAction="BuchAnz" visible="true"/>
    		</mso:group>
    
    		<mso:group id="mso_c1.112545" label="TestUser3" autoScale="true">
    			<mso:button idQ="x1:MailVersenden_0_1146ED" label="Mailversenden" imageMso="ShapeCloud" onAction="MailVersenden" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_MH_0_113335" label="Mailversenden_MH" imageMso="ShapeCloud" onAction="MailVersenden_MH" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_PB_1_113335" label="MailVersenden_PB" imageMso="ShapeCloud" onAction="MailVersenden_PB" visible="true"/>
    		</mso:group>
    </mso:tab>
    	
    	<mso:tab idQ="mso:TabMailings" visible="false"/>
    	<mso:tab idQ="mso:TabReviewWord" visible="false"/>
    '@
    
    $Text -split '(?<=</mso:tab>)'
    Oder So um alle stellen im Dokument zu finden:
    $Text =  @'
    <mso:tab id="mso_c1.179B9A" label="TestUser" insertBeforeQ="mso:TabInsert">
    		<mso:group id="mso_c2.1779A" label="Vorlagen" imageMso="AppointmentColor2" autoScale="true">			
    			<mso:button idQ="x1:main_0_101BBF" label="BuchAnz" imageMso="AppointmentColor10" onAction="BuchAnz" visible="true"/>
    		</mso:group>
    
    		<mso:group id="mso_c1.112545" label="TestUser3" autoScale="true">
    			<mso:button idQ="x1:MailVersenden_0_1146ED" label="Mailversenden" imageMso="ShapeCloud" onAction="MailVersenden" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_MH_0_113335" label="Mailversenden_MH" imageMso="ShapeCloud" onAction="MailVersenden_MH" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_PB_1_113335" label="MailVersenden_PB" imageMso="ShapeCloud" onAction="MailVersenden_PB" visible="true"/>
    		</mso:group>
    </mso:tab>
    	
    	<mso:tab idQ="mso:TabMailings" visible="false"/>
    	<mso:tab idQ="mso:TabReviewWord" visible="false"/>
    '@
    
    $Text | Select-String '(?s)<mso:tab.+</mso:tab>' -AllMatches |
            Foreach {$_.Matches} | Foreach {$_.Value}



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!




    Dienstag, 16. April 2013 16:05
  • Das mit Select-String und Matches zu machen hatte ich auch probiert, aber dann habe ich in jedem Text[n] Arraywert nur einen Char.

    Ich möchte aber den Text von beispielsweiße "<mso:tab " bis zum Anfang vom nächsten "<mso:tab " pro Array haben.

    Da ich aber nicht sicher gehen kann das jeder Eintrag mit "</mso:tab> endet, habe ich angefangen mit -split zu arbeiten.

    Meine Lösung wäre jetzt das ich bei "<mso:tab " und nicht bei "</mso:tab " splitte dann das Array durchlaufe und "<mso:tab " wieder an den Anfang setze. Ich glaube zwar nicht dass, das die eleganteste Lösung ist aber naja.

    Ich dachte mir schon das splitten es nicht umbedingt der beste weg ist.

    Wenn man meine Frage liest, sieht man ja das mir das aufgefallen ist und deshalb frage ich ja nach einem anderen weg...

    Mittwoch, 17. April 2013 06:17
  • Nochmal: Du hast hier XML Daten. In XML Daten mit String Funktionen zu hantieren ist gewiß möglich, aber selten der beste Weg.

    Was willst Du erreichen? willst Du Werte im der XML Datei lesen, ersetzten oder erweitern?


    -Raimund

    Mittwoch, 17. April 2013 07:10
  • Es ist keine XML DATEI. Es ist eine .officeui Datei. Ja mir ist klar das sie einen XML Aufbau hat.

    Warum bekomm ich nicht einfach eine Antwort?Ich habe dir schon gesagt was ich erreichen will.

    Hier die gesammte Datei:

    <mso:customUI xmlns:x1="http://schemas.microsoft.com/office/2009/07/customui/macro" xmlns:mso="http://schemas.microsoft.com/office/2009/07/customui">
    <mso:ribbon>
    <mso:qat>
    <mso:sharedControls>
    <mso:control idQ="mso:SpellingAndGrammar" visible="false" insertBeforeQ="mso:FileNewDefault"/>
    <mso:control idQ="mso:TableDrawTable" visible="false" insertBeforeQ="mso:FileNewDefault"/>
    <mso:control idQ="mso:FileOpenRecentFile" visible="false" insertBeforeQ="mso:FileNewDefault"/>
    <mso:control idQ="mso:FileNewDefault" visible="true"/>
    <mso:control idQ="mso:FileOpen" visible="true"/>
    <mso:control idQ="mso:FileSave" visible="true"/>
    <mso:control idQ="mso:FileSendAsAttachment" visible="true"/>
    <mso:control idQ="mso:FilePrintQuick" visible="true"/>
    <mso:control idQ="mso:PrintPreviewAndPrint" visible="true"/>
    <mso:control idQ="mso:Undo" visible="true"/>
    <mso:control idQ="mso:RedoOrRepeat" visible="true"/>
    <mso:control idQ="mso:NavigationPaneFind" visible="true"/>
    </mso:sharedControls>
    </mso:qat>
    <mso:tabs>
    <mso:tab id="mso_c1.1779B9A" label="Bla Vorlagen" insertBeforeQ="mso:TabInsert">
    <mso:group id="mso_c2.1779B9A" label="Vorlagen" imageMso="AppointmentColor2" autoScale="true">
    <mso:button idQ="x1:main_0_D05F62" label="Brief" imageMso="EnvelopesAndLabelsDialog" onAction="Brief" visible="true"/>
    <mso:button idQ="x1:main_0_DF75BF" label="KurzBrief" imageMso="RmsSendBizcardDesign" onAction="Kurzbrief" visible="true"/>
    <mso:button idQ="x1:main_0_E7F3E4" label="Mitteilung" imageMso="PersonaStatusAway" onAction="Mitteilung" visible="true"/>
    <mso:button idQ="x1:main_1_F16886" label="GLBrief" imageMso="AppointmentColor6" onAction="GLBrief" visible="true"/>
    <mso:button idQ="x1:main_0_FE25BD" label="Angebot" imageMso="AppointmentColor7" onAction="Angebot" visible="true"/>
    <mso:button idQ="x1:main_1_FE25BD" label="AB" imageMso="AppointmentColor3" onAction="AB" visible="true"/>
    <mso:button idQ="x1:main_0_1059448" label="Rechnung" imageMso="Bullets" onAction="Rechnung" visible="true"/>
    <mso:button idQ="x1:main_1_1059448" label="Rechnung_VS" imageMso="Calculator" onAction="Rechnung_VS" visible="true"/>
    <mso:button idQ="x1:main_0_10F1BBF" label="BuchAnz" imageMso="AppointmentColor10" onAction="BuchAnz" visible="true"/>
    </mso:group>
    <mso:group id="mso_c1.112E545" label="MailVersand" autoScale="true">
    <mso:button idQ="x1:MailVersenden_0_11436ED" label="Mailversenden" imageMso="ShapeCloud" onAction="MailVersenden" visible="true"/>
    <mso:button idQ="x1:MailVersenden_MH_0_1153335" label="Mailversenden_MH" imageMso="ShapeCloud" onAction="MailVersenden_MH" visible="true"/>
    <mso:button idQ="x1:MailVersenden_PB_1_1153335" label="MailVersenden_PB" imageMso="ShapeCloud" onAction="MailVersenden_PB" visible="true"/>
    </mso:group>
    </mso:tab>
    <mso:tab id="mso_c1.11FF4DE" label="Bla Etiketten" insertBeforeQ="mso:TabInsert">
    <mso:group id="mso_c2.11FF4DE" label="Adress-Etiketten" autoScale="true">
    <mso:button idQ="x1:EtikettEK_0_1464E83" label="EtikettEK" imageMso="ViewSlideSorterView" onAction="EtikettEK" visible="true"/>
    <mso:button idQ="x1:EtikettGLS_1_1464E83" label="EtikettGLS" imageMso="ViewSlideSorterView" onAction="EtikettGLS" visible="true"/>
    <mso:button idQ="x1:EtikettNOD_2_1464E83" label="EtikettNOD" imageMso="ViewSlideSorterView" onAction="EtikettNOD" visible="true"/>
    <mso:button idQ="x1:EtikettPW_3_1464E83" label="EtikettPW" imageMso="ViewSlideSorterView" onAction="EtikettPW" visible="true"/>
    <mso:button idQ="x1:EtikettVK_4_1464E83" label="EtikettVK" imageMso="ViewSlideSorterView" onAction="EtikettVK" visible="true"/>
    <mso:button idQ="x1:EtikettVS_5_1464E83" label="EtikettVS" imageMso="ViewSlideSorterView" onAction="EtikettVS" visible="true"/>
    </mso:group>
    <mso:group id="mso_c3.12196D8" label="Etiketten" autoScale="true">
    <mso:button idQ="x1:main_1_10F1BBF" label="EtikettenKD" imageMso="ViewSlideSorterView" onAction="EtikettenKD" visible="true"/>
    <mso:button idQ="x1:main_0_11CA893" label="AngEtikett" imageMso="ViewSlideSorterView" onAction="AngEtikett" visible="true"/>
    <mso:button idQ="x1:Etikett_Oerlikon_0_B023A9" label="Etikett_Oerlikon" imageMso="ViewSlideSorterView" onAction="Etikett_Oerlikon" visible="true"/>
    </mso:group>
    </mso:tab>
    <mso:tab id="mso_c1.74ED1E" label="Bla Sonder" insertBeforeQ="mso:TabInsert">
    <mso:group id="mso_c2.74ED1E" label="Einkauf" autoScale="true">
    <mso:button idQ="x1:main_1_B023A9" label="LiefArch" imageMso="CreateMailRule" onAction="LiefArch" visible="true"/>
    <mso:button idQ="x1:AbEkArch_0_16768A8" label="AbEkArch" imageMso="Folder" onAction="AbEkArch" visible="true"/>
    </mso:group>
    <mso:group id="mso_c1.155CAC4" label="Kundendienst" autoScale="true">
    <mso:button idQ="x1:MAIN_0_1573DC1" label="Adresse" imageMso="GridSettings" onAction="Adresse" visible="true"/>
    <mso:button idQ="x1:main_1_1573DC1" label="Speditionsauftrag_Adresse" imageMso="GridSettings" onAction="Speditionsauftrag_Adresse" visible="true"/>
    </mso:group>
    <mso:group id="mso_c1.152FF0D" label="Rechnungswesen" autoScale="true">
    <mso:button idQ="x1:main_2_B023A9" label="RechArch" imageMso="Folder" onAction="RechArch" visible="true"/>
    </mso:group>
    <mso:group id="mso_c1.15CB89B" label="Vetrieb" autoScale="true">
    <mso:button idQ="x1:Nachfass_0_15D4BA6" label="Nachfass" imageMso="Breakpoint" onAction="Nachfass" visible="true"/>
    <mso:button idQ="x1:BausteinErstellen_0_164F53D" label="BausteinErstellen" imageMso="BlackAndWhiteInverseGrayscale" onAction="BausteinErstellen" visible="true"/>
    <mso:button idQ="x1:BausteinEinfügen_1_164F53D" label="BausteinEinfügen" imageMso="BlackAndWhiteGrayscale" onAction="BausteinEinfügen" visible="true"/>
    </mso:group>
    <mso:group id="mso_c1.DB92C1" label="Fax" autoScale="true">
    <mso:button idQ="x1:main_0_DC9FFA" label="Fax" imageMso="FrameCreateAbove" onAction="Fax" visible="true"/>
    </mso:group>
    </mso:tab>
    </mso:tabs>
    </mso:ribbon>
    </mso:customUI>

    Ich möchte immer den gesammten Text zwischen (einschließlich) "<mso:tab..." und "</mso:tab>" haben. Und jeweils den gesammten Text in einem Arraywert haben, damit ich dieses "TAB" dann überprüfen kann.

    Um es genau zu sagen schaue ich ob es genau dieses TAB in einer anderen OfficeUI Datei gibt

    Es kann aber durchaus vorkommen das es Tabs gibt die nicht auf "</mso:tab>" sondern einfach mit "/>" enden also habe ich nicht immer alle Tabs.

    Hier als Beispiel

    	<mso:tab idQ="mso:TabMailings" visible="false"/>
    	<mso:tab idQ="mso:TabReviewWord" visible="false"/>
    Nochmal:

    Gibt es die Möglichkeit:

    - einen String wie bei Split

    - an einer bestimmten Stelle

    - in ein Array aufzuteilen

    - ohne dabei den Delimeter zu verlieren? 

    Diese Frage wurmt mich einfach ich möchte wissen ob das irgendwie möglich ist. XML hin oder her...



    • Bearbeitet Timbble Mittwoch, 17. April 2013 07:36
    Mittwoch, 17. April 2013 07:32
  • MSO: deutet darauf hin das dies ein Dokument ist, das mit Microsoft Office erstellt wurde. Richtig !?
    Wenn es so ist, ist es XML!
    In XML MUSS ein geöffnetes Element auch IMMER geschlossen werden. Dies kann jedoch Textuell anders gestaltet werden.

    Wenn dir das ganze Dokument vorliegt, ist das XML auch vollständig!
    Dann kannst du es mit Import-XML einlesen und auf die Daten einfach zugreifen.

    Wie Raimund schon geschrieben hat: Was willst Du erreichen?


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Mittwoch, 17. April 2013 07:38
  • Um zu zeigen das ich mir zu Herzen nehme was man mir schreibt.

    Die Lösung mit XML Object Model wäre

    $xml = [xml](get-content "C\Word.officeUI")
    
    
    $xml.customUI.ChildNodes[0].ChildNodes[1].ChildNodes[1].InnerXML

    so bekomme ich den Inhalt zwischen dem ersten Childnode <Tab>.

    Gut natürlich müsste ich noch ein paar anfragen und for eaches einbauen damit es immer klappt. Raimund du hast sicher recht damit ist es einfacher und eleganter ;), aber das ist nicht meine Frage.

    Mittwoch, 17. April 2013 07:52
  • Ich weiß, daß das nicht Deine Frage war. Nur manchmal führen bestimmte Fragen und Antworten in die falsche Richtung und man muß die eigentliche Problemstellung kennen, um wirklich einen nützlichen Beitrag leisten zu können.

    XML == Select-XML und XPath. Das hat mir wichtig viel Arbeit erspart.


    -Raimund

    Mittwoch, 17. April 2013 07:56
  • Raimund verstehe ich alles. Select-XML schau ich mir grad schon an und XPath danach auch.

    Jedoch habe ich immernoch keine Antwort auf meine Frage.Vergesst doch mal das ganze XML Zeug ich hab schon beim ersten Hinweis darauf verstanden das es auch anderst geht.

    @Peter:

    Nochmal:

    Gibt es die Möglichkeit:

    - einen String wie bei Split

    - an einer bestimmten Stelle

    - in ein Array aufzuteilen

    - ohne dabei den Delimeter zu verlieren? 

    Diese Frage wurmt mich einfach ich möchte wissen ob das irgendwie möglich ist. XML hin oder her...

    Mittwoch, 17. April 2013 08:12
  • Ganz ruhig brauner..... Wir meinen es ja nur gut! ;-)
    Ich denke ich habe die Lösung mit -split oben schon gepostet!? Hast du dies übersehenoder verstehe ich nun etwas nicht?

    Man muss im -split den look-behind ?<= Operator nutzen, dann wird der Delimiter nicht aufgefressen!
    Hier noch einmal:

    $Text =  @'
    <mso:tab id="mso_c1.179B9A" label="TestUser" insertBeforeQ="mso:TabInsert">
    		<mso:group id="mso_c2.1779A" label="Vorlagen" imageMso="AppointmentColor2" autoScale="true">			
    			<mso:button idQ="x1:main_0_101BBF" label="BuchAnz" imageMso="AppointmentColor10" onAction="BuchAnz" visible="true"/>
    		</mso:group>
    
    		<mso:group id="mso_c1.112545" label="TestUser3" autoScale="true">
    			<mso:button idQ="x1:MailVersenden_0_1146ED" label="Mailversenden" imageMso="ShapeCloud" onAction="MailVersenden" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_MH_0_113335" label="Mailversenden_MH" imageMso="ShapeCloud" onAction="MailVersenden_MH" visible="true"/>
    			<mso:button idQ="x1:MailVersenden_PB_1_113335" label="MailVersenden_PB" imageMso="ShapeCloud" onAction="MailVersenden_PB" visible="true"/>
    		</mso:group>
    </mso:tab>
    	
    	<mso:tab idQ="mso:TabMailings" visible="false"/>
    	<mso:tab idQ="mso:TabReviewWord" visible="false"/>
    '@
    
    $Text -split '(?<=</mso:tab>)'



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Mittwoch, 17. April 2013 08:48
    • Als Antwort markiert Timbble Mittwoch, 17. April 2013 09:34
    Mittwoch, 17. April 2013 08:46
  • Wie peinlich.

    Danke an euch beide.

    Man muss den look-behind Operator benutzen ?<=.

    So klappts wunderbar, ich kann wieder ruhig schlafen.

    Mittwoch, 17. April 2013 09:34