Lesen UTF-8-Dateien korrekt mit PowerShell
Folgende situation:
- Ein PowerShell-Skript erstellt eine Datei mit UTF-8-Codierung
- Der Benutzer kann oder kann nicht die Datei Bearbeiten, eventuell zu verlieren, die Stückliste, aber behalte die Codierung als UTF-8, und ändert dabei möglicherweise das line Separatoren
- Das gleiche PowerShell-Skript liest die Datei ein, fügt etwas mehr Inhalt und schreibt ihn alle als UTF-8 wieder auf die gleiche Datei
- Diese Durchlaufen werden können, viele Male
Mit Get-Content
und Out-File -Encoding UTF8
ich habe Probleme beim Lesen es richtig. Es ist das stolpern über die BOM hat es geschrieben, bevor (Sie Sie in den Inhalt, brechen meine parsing, regex), nicht UTF-8-Codierung und sogar löscht Zeilenumbrüche im original content part.
Brauche ich eine Funktion, die Lesen können eine Datei mit UTF-8-Codierung, ignorieren und löschen Sie die Stückliste und nicht den Inhalt ändern. Was sollte ich verwenden?
Update
Ich habe soeben einen kleinen test-Skript, das zeigt, was ich versuche zu tun, und was passiert stattdessen.
# Read data if exists
$data = ""
$startRev = 1;
if (Test-Path test.txt)
{
$data = Get-Content -Path test.txt
if ($data -match "^[0-9-]{10} - r([0-9]+)")
{
$startRev = [int]$matches[1] + 1
}
}
Write-Host Next revision is $startRev
# Define example data to add
$startRev = $startRev + 10
$newMsgs = "2014-04-01 - r" + $startRev + "`r`n`r`n" + `
"Line 1`r`n" + `
"Line 2`r`n`r`n"
# Write new data back
$data = $newMsgs + $data
$data | Out-File test.txt -Encoding UTF8
Nachdem Sie ein paar mal, neue Abschnitte Hinzugefügt werden sollte an den Anfang der Datei, die bestehenden Inhalte sollten nicht in irgendeiner Weise verändert werden (derzeit verliert Zeilenumbrüche) und keine neuen Zeilen Hinzugefügt werden sollte an das Ende der Datei (scheint manchmal zu passieren).
Statt, der zweite Lauf gibt mir eine Fehlermeldung.
- Ich bin nicht groß mit der ganzen Codierung Thema, aber würden Sie nicht haben, zu re-injizieren der Stückliste, wenn es sich wieder entfernt, um ihn richtig Lesen? Ich bin ein wenig verwirrt von der Frage. Warum möchten Sie die UTF-8-BOM?
- Mein text editor ist dumm, und entfernt es. Trotzdem weiß man nie, was text-Editoren, die mit UTF-8 Dateien. Mein script soll einfach nur intelligent genug sein, es zu handhaben. Wie die StreamReader-Klasse tut es ziemlich gut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Datei sollte UTF8 sein, warum nicht Sie versuchen, es zu Lesen Dekodierung von UTF8 :
Wirklich JPBlanc richtig ist. Wenn Sie wollen, Lesen Sie es als UTF8 dann angeben, wenn die Datei gelesen wird.
On a side note, Sie verlieren die Formatierung, hier mit der [String]+[String] Zeug. Nicht zu schweigen von Ihrem regex-match funktioniert nicht. Überprüfen Sie heraus die regex-Suche änderungen, und die änderungen an den $newMsgs, und die Art und Weise bin ich die Ausgabe Ihrer Daten in die Datei.
Get-Content
's fault. Es gibt mir ein array von Zeilen, die nicht einem einzelnen mehrzeiligen string. Das bewirkt, dass alle Arten von chaos. Ich habe eingeschaltet, um[System.IO.File]::ReadAllText()
und[System.IO.File]::WriteAllText()
und jetzt bekomme ich viel mehr vorhersagbare Ergebnisse.Get-Content -raw
gibt Ihnen die einzelne mehrzeilige Zeichenfolge, die Sie suchen.Get-Content scheint nicht zu behandeln UTF-Dateien ohne BOM (und lassen Sie die Encoding-flag). System.IO.Datei.ReadLines scheint zu sein, eine alternative, Beispiele: