2016-07-05 6 views
1

Leider war ich mir nicht sicher, wie ich die Frage formulieren sollte.Ändern der Ausgabe mit exportierten Excel/CSV-Daten, wenn innerhalb von 'foreach' Nullwerte gefunden werden

Dies ist ein Follow-on aus einer früheren Frage hier: Take Excel cell content and place it into a formatted .txt file

Die Funktion Import-XLS ich benutze hier ist: https://gallery.technet.microsoft.com/office/17bcabe7-322a-43d3-9a27-f3f96618c74b

Mein aktueller Code sieht wie folgt aus:

. .\Import-XLS.ps1 

$OutFile = ".\OutTest$(get-date -Format dd-MM).txt" 

$Content = Import-XLS '.\DummyData.xlsx' 

$Content | foreach-object{ 

$field1 = $("{0},{1},{2},{3},{4},{5},{6}" -f "Field1", $_."Value1", $_."Value2", $_."Value3", $_."Value4", $_."Value5", $_."Value6") 
$field1.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries) -join "," 

$field2 = $("{0},{1}" -f "Field2", $_."Value1") 
$field2.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries) -join "," 

} | Out-File $OutFile 

Mein Dummydata ist im wesentlichen das (ich habe null eingefügt $ die Leerwerte, darauf hinzuweisen)

Entries Value1 Value2 Value3 Value4 Value5 Value6 Value7 Value8 
Entry 1 1 2 $null 4 5 6 7 8 
Entry 2 $null B A B A B A B 

So habe ich es geschafft, den Code 'Ignorieren/Überspringen' einen Nullwert innerhalb eines Satzes.

Meine Ausgabe sieht wie folgt aus

Field1,1,2,4,5,6 
Field2,1 
Field1,B,A,B,A,B 
Field2 

Was würde ich Hilfe gerne mit nun, wie entweder entfernen „Field2“, weil es keinen Wert hat, oder kommentieren Sie mit;.

So würde meine Ausgabe aussehen

Field1,1,2,4,5,6 
Field2,1 
Field1,B,A,B,A,B 

oder

Field1,1,2,4,5,6 
Field2,1 
Field1,B,A,B,A,B 
;Field2 

Wesentlichen, wenn eine Zeile keine Daten in irgendetwas davon hat den Feldern, die für diese Zeile geschrieben werden, sollte es ignoriert werden .

Vielen Dank für Ihre Hilfe.

EDIT:

Ich habe entdeckt, ich brauche das Komma "" zwischen dem {0}, {1} zu entfernen und stattdessen einen Raum nutzen. So verwende ich

$field2 = $("{0} {1}" -f "Field 2", $_."Value1") 
$field2 = $field2.Split(" ",[System.StringSplitOptions]::RemoveEmptyEntries) 
if ($field2.Count -le 1) { ";$field2" } else { $field2 -join "`t`t" } 

Welche funktioniert für "die meisten" meiner Felder.

Allerdings gibt es einige Felder und Werte, die Leerzeichen enthalten. Zusätzlich gibt es einige Werte wie "TEST TEXT"

So, jetzt bin ich immer

Field1 3,B,A,B,A,B 
Field  2  TEST  TEXT 

statt (Angebote für Klarheit)

"Field1" 3,B,A,B,A,B 
"Field 2" "TEST TEXT" 

Ich bin glücklich, eine Art einfach zu bedienen Ausnahme nur für diese wenigen Felder. Ich habe ein paar andere Dinge versucht, aber ich am Ende brechen die IF-Anweisung, und es, Kommentare Felder mit Werten, oder nicht, kommentieren Sie Felder ohne Werte.

+1

Sie brauchen also nur eine einfache 'If' Aussage? 'If ​​($ _. Value1) {$ Field2.Split ...' – TheMadTechnician

Antwort

0

Next-Code-Snippet könnte helfen:

### … … … ### 
$Content | foreach-object{ 

    $field1 = $("{0},{1},{2},{3},{4},{5},{6}" -f "Field1", $_."Value1", $_."Value2", $_."Value3", $_."Value4", $_."Value5", $_."Value6") 
    $auxarr = $field1.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries) 
    if ($auxarr.Count -le 1) { ";$auxarr" } else { $auxarr -join "," } 

    $field2 = $("{0},{1}" -f "Field2", $_."Value1") 
    $auxarr = $field2.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries) 
    if ($auxarr.Count -le 1) { ";$auxarr" } else { $auxarr -join "," } 

} | Out-File $OutFile 

bearbeiten zusätzlich zu beantworten (Erweiterung) Teilfrage Ich brauche das Komma "" zwischen den {0},{1} zu entfernen und einen Raum anstelle:

$field2 = $("{0},{1}" -f "Field 2", $_."Value1") 
    ### keep comma ↑  ↓ or any other character not contained in data 
    $field2 = $field2.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries) 
    if ($field2.Count -le 1) { ";$field2" } else { $field2 -join "`t`t" } 

Wenn Ihre Daten enthalten ein signifikantes Komma verwende dann Split(String(), StringSplitOptions) form von String.Split Verfahren z. wie folgt:

$burstr = [string[]]'#-#-#' 
    $field2 = $("{0}$burstr{1}" -f "Field 2", $_."Value1") 
    $field2 = $field2.Split($burstr,[System.StringSplitOptions]::RemoveEmptyEntries) 
    if ($field2.Count -le 1) { ";$field2" } else { $field2 -join "`t`t" } 
+0

Hey nochmal JosefZ. Das funktioniert! Sie rocken! :) Ich benutze $ field1 & $ field2 anstelle von $ auxarr Es scheint zu funktionieren, aber wollte überprüfen, ob das in Ordnung ist? oder schlechte Praxis? Ich möchte einfach die Variablen für das jeweilige Feld identifizieren. Ich könnte stattdessen $ field1x oder etwas verwenden, wenn das empfohlen wird? – XViper

+0

Ich habe die Frage mit einem Problem aktualisiert, mit dem ich feststellen musste, wie ich den Code optimieren musste. Danke nochmal! (Ich fühle, dass es eng genug verwandt ist, um zu garantieren, dass es Teil derselben Frage ist). – XViper

Verwandte Themen