Jump to content

epsodus

Members
  • Gesamte Inhalte

    28
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von epsodus

  1. Hallo zusammen,

    ich habe mal eine Frage zum Thema Powershell und Get-ChildItem und match.

     

    Ich habe mehrere Dateien, welche mit .csv enden. Aus diesen möchte ich bestimmte Dateinamen mit bestimmten Merkmalen identifizieren und umbenennen.

    Hier mal drei Beispiele:

    TEST.BARN.G1T3F.02983100.B200225.T014508.X02.CSV
    TEST.BARN.G1B53.02983104.D200225.T014508.C02.0400.CSV
    TEST.BARN.G9T3F.02981185.B200225.T014508.X02.CSV

     

    Ich möchte Dateinamen identifizieren und umbenennen die z.B. das Merkmal G1T3F und 3100 haben.

    Dies mache ich wie folgt:

    Get-ChildItem $DTCC_ROOT | where { $_.Name -match "G[0-9]{1}T[A-Z0-9]{2}" -and $_.Name -match "31[0-9]{2}" } | Rename-Item -NewName { $_.name -Replace '\.CSV$', '.XML' }

    Da das Merkmal G1T3F variieren kann, ebenso 3100 matche ich wie folgt:

    G1T3F mit "G[0-9]{1}T[A-Z0-9]{2}

    und

    3100 mit "31[0-9]{2}""

     

    Wenn beide Bedingungen erfüllt sind, soll dewr Dateiname von der Endung .csv nach .xml umbenannt werden. Leider funktioniert das nicht.

    Es wird z.B. auch der Dateiname TEST.BARN.G9T3F.02981185.B200225.T014508.X02.CSV umbenannt.

    Kann mir jemand erklären warum es so nicht funktioniert und hätte einen Lösungsvorschlag ?

  2. Hallo,

     

    einige Errormeldungen kann ich abfangen und dazu Aktionen ausführen. Jetzt meine Frage,

    Wenn ich eine Datei verschieben möchte und diese im Zielverzeichnis vorhanden ist, bekomme ich die folgende Fehlermeldung:

    ERROR: Rename-Item : Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.
    ERROR:
    ERROR: In C:\XXXX TEST\XXXXRepPS_V4_0_xml_csv.ps1:434 Zeichen:4
    ERROR: +             Rename-Item -Path $XXXX_YYYYYYYXMLFILE -NewName $VVVVVVVV ...
    ERROR: +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ERROR:     + CategoryInfo          : WriteError: (C:\XXXX TEST\im...54.C02.0335.xml:String) [Rename-Item], IOException
    ERROR:     + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand
    ERROR:

    wie kann ich diese Meldung in ein Log schreiben ?

  3. Hallo, hat etwas gedauert, habe das Programm mal aufgeräumt und dokumentiert. das Überschreiben mit einer gefundenen und doppelten Lei habe ich jetzt auch gelöst.

    Jetzt muss ich die erstellten Files nur noch gegen das Excelsheet abgleichen ( Spalte C ) und bei einer Übereinstimmung renamen, Wert aus Excelsheet Spalte (A) in der gleichen Zeile wie der gefundene Wert aus Spalte C.

    Das File soll dann mit dem Wert aus Spalte A anfangen.

    Da happert es noch.

     

    #--------------------------------------------------------------------------------------------------------------------------------------------
    # ROOTVERZEICHNIS, wo die zu verarbeitende Quell Datei liegt
    $Gaudet_ROOT = "C:\TEMP"
    $Gaudet_ROOTFILE = $Gaudet_ROOT + "\" + $XML_FILE
    #--------------------------------------------------------------------------------------------------------------------------------------------
    # Verzeichnis wo die neu erstellten Files abgelegt werden
    $Gaudet_RSRXML = "C:\TEMP\TESTARCHIV"
    $Gaudet_RSRXMLFILE = $Gaudet_RSRXML + "\" + $XML_FILE
    #--------------------------------------------------------------------------------------------------------------------------------------------
    # Verzeichnis wo das Excel File liegt
    $ExcelMappe = "C:\TEMP\ExcelArchiv"
    #--------------------------------------------------------------------------------------------------------------------------------------------
    function gaudet_RSRXML
    {# Das XML File wird extrahiert, aus jedem Knoten ( LEI) wird ein separates File erstellt, die LEI des Knoten vorangestellt
    	"function gaudet_RSRXML"
    	$inputXMLFile = Join-Path -Path $Gaudet_ROOT -ChildPath $XML_FILE
    	$xml = [xml](Get-Content $inputXMLFile)
    	
    	Foreach ($ChildNode in $xml.SctiesFincgRptgMssngCollReq.TxId)
    	{
    		$CurrentXMLFileName = Join-Path -Path $Gaudet_RSRXML -ChildPath ($ChildNode.RptgCtrPty.lei.ToString() + "." + $XML_FILE)
    		
    		$NewXML = New-Object System.Xml.XmlDocument
    		$declaration = $NewXML.CreateXmlDeclaration("1.0", "UTF-8", $null)
    		$NewXML.AppendChild($declaration)
    		$RootNode = $NewXML.CreateNode('element', 'SctiesFincgRptgMssngCollReq', $null)
    		$NewXML.AppendChild($RootNode)
    		
    		$NewElement = $NewXML.ImportNode($ChildNode, $true)
    		$Root = $NewXML.SelectSingleNode('SctiesFincgRptgMssngCollReq')
    		$Root.AppendChild($NewElement)
    		
    		#$File1.DocumentElement.AppendChild($File1.ImportNode($XmlNode, $true))
    		
    		$FILE = ($ChildNode.RptgCtrPty.lei + "." + $XML_FILE)
    		# Überschreiben einer doppelten Lei wird verhindert, kommt ein File zweimal vor, dann wird ein datum hinten dran gehängt
    		$TESTPATH = Test-Path -path ($Gaudet_RSRXML + "\" + $FILE)
    		
    		
    		if ($TESTPATH -eq $TRUE)
    		{
    			rename-item -Path ($Gaudet_RSRXML + "\" + $FILE) -NewName ($FILE + "_" + (get-date).ToString("yyyyMMdd_HHmmss"))
    			#$File.DocumentElement.AppendChild($File.ImportNode($ChildNode, $true))
    			
    		
    			
    			
    		}
    		
    		$NewXML.Save($CurrentXMLFileName)
    			
    		Write-Host $ChildNode.RptgCtrPty.lei
    		Write-Host $CurrentXMLFileName
    		
    	}
    	
    }
    
    #H A U P T S C R I P T für  XML  Dateien ############################################################################################
    	#----------------------------------------------------------------------- 
    	
    	#Liste der Dateinamen *.XML, die angeliefert wurden
    	if ($Gaudet_FILELIST = get-childitem $Gaudet_ROOT -filter *.xml)
    	{
    		$Gaudet_COUNT = (get-childitem $Gaudet_ROOT -filter *.xml).count
    		"Im Ordner " + $Gaudet_ROOT + " liegen folgende " + $Gaudet_COUNT + " Dateien: " + $Gaudet_FILELIST
    		<#
    		#Jede der angelieferten Dateien .xml in netroot\import\dtcc wird bearbeitet. Die erste Zeile in der Datei wird ausgeschnitten.
    		# Die angelieferte Datei entspricht nicht der XML Struktur, durch XXXX wird eine zusätzliche Zeile eingefügt, welche entfernt wird.
    		$file = "$Gaudet_ROOT\*.xml"
    		Get-ChildItem -Path $file -File -Filter *.xml |
    		ForEach-Object {
    			(Get-Content -Path $_.FullName | Select-Object -Skip 1) | Set-Content -Path $_.FullName -Encoding UTF8
    	#>
    		}
    
    		#Jede der angelieferten Dateien in netroot\import\dtcc wird nach mehreren Mustern durchsucht. 
    		foreach ($XML_FILE in $Gaudet_FILELIST)
    		{
    			#Datei in netroot\import\DTCC 
    			$Gaudet_ROOTFILE = $Gaudet_ROOT + "\" + $XML_FILE
    			
    			#Dateiinhalt einlesen aus Datei in netroot\import\DTCC
    			[array]$Gaudet_FILECONTENT = get-content (get-childitem $Gaudet_ROOTFILE)
    			
    			#Anzahl der Zeilen in der Datei netroot\import\DTCC
    			$Gaudet_FILELINECOUNT = $Gaudet_FILECONTENT.count
    			"Zeilen in der Datei: " + $Gaudet_FILELINECOUNT
    			
    			# S U C H M U S T E R für XML  Dateien 
    			
    			#-----------------------------------------------------------------------
    			
    			#Suchmuster für RSRXML-Dateien (3105 im Dateinamen )
    	        $PATTERN_RSRXML = "YYY\d{1}\.XXXX\.T[A-Z0-9]{4}\.[A-Z0-9]{4}3105\.D[A-Z0-9]*\.Z[A-Z0-9]*\.K[\w\d\W]*\.XML" # YYY4.XXXX.TV9V9.55553105.D111111.Z999999.K02.0396.xml
    	       #$PATTERN_XLSXML = "[A-Z0-9]{20}\.YYY\d{1}\.XXXX\.T[A-Z0-9]{4}\.[A-Z0-9]{4}3105\.D[A-Z0-9]*\.Z[A-Z0-9]*\.K[\w\d\W]*\.XML" # 664400KX2BNAYXBQMT50.YYY4.XXXX.TV9V9.55553105.D111111.Z999999.K02.0396.XML
    		    #-----------------------------------------------------------------------
    		
    		if ($XML_FILE -match $PATTERN_RSRXML)
    		{
    			"HS_if1"
    			gaudet_RSRXML
    		}
    		#else
    		#{
    		#	"else error"
    		#	dtcc_error
    		#}
    	}

     

  4. Hi BOFH_666,

     

    mal eine ganz blöde Frage, was passiert wenn es in einem XML File, 2 identische Lei's gibt, im Knoten aber ein anderer Inhalt ist. Dann überschreibt die eine Datei die andere.

    Kann Du es beim Script so machen, wenn eine identische bzw. schon vorhandene Leigefunden wird, das im dann schon erstelleten XML File, dieser Knoten hinzugefügt wird ? ? Anbei eine neues XML File

    Jetzt verlange ich wohl zuviel....

     

     

     

    TestneuXML.XML

  5. Hallo,

    es geht so für den Hausgebrauch, mein Problem ist das arbeiten mit XML Dateien

    Was ich wollte ist, die mitgelieferte XML Datei ( TestXML.XML als Beispiel )parsen, im unteren Script mit einem Vorschlag von Martin.

    Finde ich beim parsen eine LEI, dann eine neue XML Datei erstellen, mit dem Namen der gefundenen Lei. Den Knoten

    mit der gefundenen Lei in die erzeugt XML Datei einfügen.

    Das schaffe ich nicht

     

    Hier der Knoten mit der LEI 324400KX2BNAYXBQMT36

     

     <TxId>
            <RptgCtrPty>
                <LEI>324400KX2BNAYXBQMT36</LEI>
            </RptgCtrPty>
            <OthrCtrPty>
                <LEI>OTHER</LEI>
            </OthrCtrPty>
            <UnqTradIdr>OTHER</UnqTradIdr>
            <MstrAgrmt>
                <TP>
                    <TP>OTHER</TP>
                </TP>
                <OthrMstrAgrmtDtls>OTHER</OthrMstrAgrmtDtls>
            </MstrAgrmt>
        </TxId>

     

    Zugleich erstelle ich eine XML Datei

    $xml = [xml](Get-Content "C:\XMLDatei\TestXML.xml")
    
    Foreach ($Node in $xml.SctiesFincgRptgMssngCollReq.TxId.RptgCtrPty)
    {
    	$Node.InnerXml
    	#$Node.OuterXml
    	#$OutFileId = $Node.LEI
    }
    
    # XML Dokument erstellen
    # Set The Formatting
    $xmlsettings = New-Object System.Xml.XmlWriterSettings
    $xmlsettings.Indent = $true
    $xmlsettings.IndentChars = "    "
    
    # Erzeuge Filename vom Dokument
    $XmlWriter = [System.XML.XmlWriter]::Create("C:\XML_Test\TestXML.xml", $xmlsettings)
    
    # Schreibe XML-Deklaration - Struktur festlegen
    $xmlWriter.WriteStartDocument()
    #$xmlWriter.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='style.xsl'")
    
    # Start Wurzelelement
    $xmlWriter.WriteStartElement("SctiesFincgRptgMssngCollReq")
    
    $xmlWriter.WriteStartElement("TxId") # <-- Start <Object - TxID>
    
    
    $xmlWriter.WriteStartElement("RptgCtrPty") # <-- Start <SubObject - RptgCtrPty> 
    $xmlWriter.WriteElementString("LEI", "324400KX2BNAYXBQMT37")
    $xmlWriter.WriteEndElement() # <-- Ende <SubObject>
    
    $xmlWriter.WriteStartElement("OthrCtrPty") # <-- Start <SubObject - OthrCtrPty> 
    $xmlWriter.WriteElementString("LEI", "OTHER")
    $xmlWriter.WriteEndElement() # <-- Ende <SubObject>
    
    $xmlWriter.WriteElementString("UnqTradIdr", "OTHER")
    
    $xmlWriter.WriteStartElement("MstrAgrmt") # <-- Start <Object - MstrAgrmt>
    
    $xmlWriter.WriteStartElement("TP") # <-- Start <SubObject - TP> 
    $xmlWriter.WriteElementString("TP", "OTHER")
    $xmlWriter.WriteEndElement() # <-- Ende <SubObject>
    
    $xmlWriter.WriteElementString("OthrMstrAgrmtDtls", "OTHER")
    
    $xmlWriter.WriteEndElement() # <-- Ende <SubObject>
    
    $xmlWriter.WriteEndElement() # <-- Ende <Object>
    
    # Beenden, finalisieren und schließen des XML-Dokument
    $xmlWriter.WriteEndDocument()
    $xmlWriter.Flush()
    $xmlWriter.Clos

     

    TestXML.xml

  6. HM, bekomme immer hier einen Fehler. Muss mir mal den $Node anschauen, den ich mir geschrieben habe

     

    $OutFileId = $Node.TechRcrdId
    
    
    ERROR: In C:\DTCC TEST\Sta_Einlesen_Test.ps1:48 Zeichen:31
    ERROR: +     $OutFileId = $Node.TechRcrdId
    ERROR: +                                  ~
    ERROR: Unerwartetes Token "" in Ausdruck oder Anweisung.
    ERROR:     + CategoryInfo          : ParserError: (:) [], ParseException
    ERROR:     + FullyQualifiedErrorId : UnexpectedToken
    ERROR:

     

    Hallo Nils, alte Herren ????? Du bezeichnest Dich als alter Herr ? Wenn Du möchtest bzw. willst, nenne mal Dein Alter. Dann kann ich was dazu sagen.

  7. Hi, leider nicht. Ich werde jetzt wie folgt vorgehen.

    1. Importdatei ( XML ) parsen nach Merkmal.

    2. Neue Xml Dateien erstellen, nur mit den identifizierten Knoten, Merkmal im Dateinamen einfügen ( Dateiname umbenennen )

    3. Neue Dateien mit dem Excelshheet abgleichen, bei Treffer, Datei umbenennen, vorne User im Dateinamen

     

    Wenn das grob funktioniert, werde ich das Script verfeinern. Kämpfe mich gerade durch das parsen und erstellen einer neuen XML Datei ( Struktur )

  8. Hi, 

    das File wird dann automatisch verarbeitet

    Solange es xml Fomat hat

    Genau, (höchstens für Sadisten und Masochisten  )

     

    Das XML Format ist ja mein Problem

    Mein Problem ist es mit XLM umzugehen. Wenn man jetzt den Knoten identifiziert hat, wie erstelle ich dann für jeden Knoten ein XLM File, mit dem Knoten als Inhalt, wie oben beschrieben und setze die Nummer vorne als Namensbestandteil dran. 

     

  9. Hallo,

    Du meinst dazu ?

    Was würde passieren, wenn man nur eine Datei zum validieren versenden würde? Vielleicht kann man das Aufsplitten in einzelne User-Dateien ja vermeiden, wenn man dem Validator nur einzelne User-Dateien verfüttert!?

     

    Die Dateien werden getrennt auf verschiedenen Rechnern erstellt und versendet. Gesammelt wird auf der Gegenseite,

    dann nur ein XML File erstellt.

    Hier mal eine Beispiel Exceldatei, man darf hier wohl keine csv Datei ablegen , also xlsx

    Zuordnung.xlsx

  10. Hi, wie soll ich das erklären, ich versuche es mal.

     

    Es wird ein XML File zur Validierung verschickt ( exportiert ), für jeden User ein File, es können 100 user sein. Als Antwort

    kommt eine Responesdatei ( Importdatei ) zurück. Jetzt kommt der Knackpunkt, in diesem File sind keine Userkennungen mehr drin. Sondern für jeden User gibt es eine Nummer die jedem User fest vergeben ist  ( z.B. ERTHUTDREPxxSCDxxSFTRxxSFTxx487331 ).

    Daher muss ich das Importfile splitten, nach diesen Nummern und neu erstellen. Also beim schreiben des neuen Files, wird der Dateiname um diese besagte Nummer erweitert.

     

    Anhand der Nummer kann ich einen Abgleich mit einem Excelsheet vornehmen, so das jeder User sein eigenes Responsesfile bekommt.

     

    ich habe hier mal den Begriff User genommen, zur Erklärung

  11. Hallo,

     

    Danke für den Hinweis, ich hätte es jetzt so gemacht. Deine Lösung ist eleganter.

    $StatTradDataXmlData = [xml](Get-Content "D:\sample\test.xml")
    $node = $StatTradDataXmlData.SctiesFincgRptgTxStatRpt.TradeData
    $Statnames = @()
    
    foreach ($entry in $node)
    {
    	$Statnames = $Statnames + $entry.Stat
    }
    
    Write-host $Statnames

    Ich möchte für jeden extrahierten Knoten ein neues XML File erstellen, wo nur der gefunden Knoten enthallten ist

     

    Als Beispiel:

     

    <?xml version="1.0"?>
    <SctiesFincgRptgTxStatRpt>
        <TradData>
            <Stat>
                <TechRcrdId>ERTHUTDREPxxSCDxxSFTRxxSFTxx487331</TechRcrdId>
            </Stat>
        </TradData>
    </SctiesFincgRptgTxStatRpt>

    Ja, XML ist für mich schwer, habe mich in der Zwischenzeit über den XML Aufbau etwas eingelesenen.

  12. Hallo zusammen,

    ich hoffe mir kann jemand einen Denkanstoß geben oder auch helfen, Scripting PowerShell.

    Ich habe eine XML Datei, dort sind mehrere Knoten vorhanden, Auszug aus der Datei:

    Ich meine mit Knoten:     -<Stat>     bis     </Stat>

     

     

    -<SctiesFincgRptgTxStatRpt>
      -<TradData>
         -<Stat>
              <TechRcrdId>ERTHUTDREPxxSCDxxSFTRxxSFTxx487331</TechRcrdId>
             +<CtrPtyData>
             +<LnData>
             +<CollData>
             +<CtrctMod>
          </Stat>
         -<Stat>
              <TechRcrdId>WKTHUTDREPxxSCDxxSFTRxxSFTxx487335</TechRcrdId>
             +<CtrPtyData>
             +<LnData>
             +<CollData>
             +<CtrctMod>
          </Stat>
         -<Stat>
              <TechRcrdId>KRTHUTDEKDxxSCDxxSFTRxxSFTxx487339</TechRcrdId>
             +<CtrPtyData>
             +<LnData>
             +<CollData>
             +<CtrctMod>
          </Stat>

     

    Ich möchte die XML Datei nach allen Knoten durchsuchen, wenn einer gefunden wurde, soll dieser in einer neuen XML Datei abgespeichert werden.

    So das ich für jeden Knoten eine separate Datei bekomme.

    Zum durchsuchen der Datei, dachte ich an eine Schleife, aber meine XML Kenntnisse zum Aufbau sind wohl nicht gut genug. Bekomme noch keine Ergebnisse.

    Kann mir jemand bei dem oben geschrieben helfen ?

    $StatXmlData = [xml](Get-Content "D:\test.xml")
    $node = $StatXmlData.Backups.Stat
    $Statnames = @()
    
    foreach ($entry in $node)
    {
    	$Statnames = $Statnames + $entry.TechRcrdId
    }
    
    Write-host $Statnames

     

  13. Hallo,

     

    ich bin wirklich blö…..  Mit eurem Script konnte ich meinen Wunsch umsetzen.

    Mein Fehler war, dass ich euer Script im Funktionsblock eingesetzt habe, wo die Abarbeitung jedes einzelnen Files erfolgte.

     

    Ich habe euer Script jetzt an den Anfang des Funktionsaufrufes gesetzt, hier liegen alle Dateien gesammelt im Verzeichnis. Euer Scriptteil wird dann einmalig aufgerufen und

    alle Dateien werden abgearbeitet. Erst danach rufe ich meinen Funktionsblock auf.

     

    Einen riesen Dank, habe jetzt was dazugelernt und danke für Eure Hilfe

     

     

    • Haha 1
  14. Hm, also, wenn ich ein Verzeichnis habe, wo alle Dateien vorhanden sind, dann funktioniert MurdocX Script wunderbar.

     

    In meinem Script wird jede Datei auf den Dateinamen geprüft, gibt es eine Übereinstimmung mit einem Platzhalter,

    dann wird die Datei verschoben und umbenannt. An diesem Punkt setze ich euer Script ein.

    Move-Item -path $DTCC_ROOTFILE -Destination $DTCC_ACKNACKXML -Force			
    			Rename-Item -Path $DTCC_ACKNACKXMLFILE -NewName $ACKNACKXML_NEWFILE
    			"Die Datei " + $DTCC_FILE + " wurde nach " + $DTCC_ACKNACKXML + " verschoben und umbenannt in: " + $ACKNACKXML_NEWFILE
    			
    			$file = "$DTCC_ROOT\*.xml"
    			Get-ChildItem -Path $file -File -Filter *.xml |
    			ForEach-Object {
    				(Get-Content -Path $_.FullName | Select-Object -Skip 1) | Set-Content -Path $_.FullName -Encoding UTF8
    			}
    			
    			$TESTPATH_ACKNACKXMLFILE = Test-Path $DTCC_ACKNACKXMLNEWFILE
    			
    			if ($TESTPATH_ACKNACKXMLFILE -eq $TRUE)
    			{
    			
    				Copy-Item -Path $DTCC_ACKNACKXMLNEWFILE -Destination $DTCC_SAMMELCOPY
    				"Die Datei " + $ACKNACKXML_NEWFILE + " wurde kopiert nach " + $DTCC_SAMMELCOPY
    				
    			}

    Dabei kommt jetzt folgendes raus, die original Dateigröße ist 726, nach dem Scriptlauf sieht die Größe jetzt wie folgt aus:

    Datei1 wird zuerst überprüft und verschoben, dann Rename und dann kommt Euere Scriptteil zum Einsatz. Danach noch ein copy ins andere Verzeichnis

    jetzt wird Datei2 dann 3 dann 4 behandelt.

     

    Datei1    726

    Datei2    606

    Datei3    549

    Datei4    482

     

     

×
×
  • Neu erstellen...