2016-04-29 59 views
0

Ich lese den Inhalt einer XLS-Datei. Einige ältere Versionen von Excel fügen hinzu, was ich vermute, sind Escape-Sequenzen innerhalb der Zelle, die mich Probleme beim Versuch, eine SQL-Spalte mit diesem Namen zu erstellen verursacht.C# Backslash in String ersetzen

Beispiel string, mit dem ich arbeiten als

\ 0 \ 0 K \ 0 \ geben b \ 0Job

Ich mag würde diese Zeichenfolge als "Job" zurückzukehren. Keiner der ersetzen Sequenzen im folgenden Job machen eine Änderung und kehrt als

\ 0 \ 0 K \ 0 \ b \ 0Job

C# erlaubt es nicht, die Zeichenfolge manuell erstellt werden, ohne zu entkommen es mit "\\", was den Zweck von dem, was ich brauche, besiegt.

Irgendwelche Vorschläge?

public static string CleanupHeaders(string _Col) 
{ 
    // Replace your @"\" parameter with double-escaped: @"\\" 
    _Col = _Col.Replace(@"\\0K", ""); 
    _Col = _Col.Replace(@"\\b", ""); 
    _Col = _Col.Replace(@"\\0", ""); 
    return _Col; 
} 
+0

verstehe ich nicht. Darfst du das nicht Col.Replace (@ "\\ 0K", "")? – raven

+0

@Robert Es sollte sein, da @ es bereits entgeht, sehe nicht wirklich, warum es nicht funktionieren würde. –

+2

@RobertoDeLaParra Er benötigt den doppelten Backslash nicht, da er vor seiner Stringdefinition das Zeichen @ hat. – ManoDestra

Antwort

0

Irgendwelche Vorschläge?

Ich habe ein, da die string in als "\0\0K\0\b\0Job" kommt Ihre String-Methoden ersetzen _Col.Replace sollte nicht die wörtliche Syntax verwenden müssen. In C# ist das \ ein Escape-Zeichen und die folgenden Zeichen erstellen ein escape sequence.

Das Problem ist die Verbatim-Zeichenfolge mit der @-Syntax. Entfernen Sie das und Sie erhalten "Job".Sehen Sie diese Arbeit .NET Fiddle - es hat mehrere Demonstrationen, die Ihnen leicht zeigen, was passiert. Werfen Sie einen Blick auf @MSDN's reference on string literals für weitere Details.

public static string CleanupHeaders(string _Col) 
{ 
    _Col = _Col.Replace("\0K", ""); 
    _Col = _Col.Replace("\b", ""); 
    _Col = _Col.Replace("\0", ""); 
    return _Col; 
} 

Es sollte keinen Grund geben, sie in dieser Situation zu verwenden.

Aktualisiert

Die OP die Frage ein wenig verändert, so dass hier ein Update .NET Fiddle.

+0

Möglicherweise ist das Problem, dass sie in dem Beispiel Console.WriteLine (CleanupHeaders ("\ 0 \ 0K \ 0 \ b \ 0Job")) verwenden. Die Eingabezeichenfolge sollte @ "" verwenden, damit die Schrägstriche nicht als Escape-Zeichen behandelt werden. – Marc

+0

Oder als Beispiel verwenden die Replace-Strings den Schrägstrich als Escape. Strings an beiden Stellen müssen gleich behandelt werden, damit Replace funktioniert. – Marc

+0

@Marc, der Fragesteller gab ausdrücklich an, dass seine Zeichenfolge als "\ 0 \ 0K \ 0 \ b \ 0Job" 'kommt - aber ich habe meine Antwort und .NET-Fiedel aktualisiert, um es besser zu erklären - danke –

0

Es ist möglich, dass die Sache, die den Inhalt des Strings ist die Berichterstattung an Sie tatsächlich Null-Zeichen als \0 für die menschliche Lesbarkeit berichtet.

Versuchen Sie, die @ s aus Ihren Ersatzzeichenfolgen dort zu entfernen.

0

Der von Ihnen bereitgestellte Code sollte genau wie erwartet funktionieren as seen in this example.

Es ist alles, wie es

genannt Da Sie erwähnt, dass Ihre erste Zeichenfolge nicht geändert wird, ist es erwähnenswert, dass Ihre Ersetzen-Funktion tatsächlich eine Zeichenfolge zurückgibt, und führen Sie keine Inline-Ersatz, so Sie nennen es müssen durch:

// This will set your original string to the result of your CleanupHeaders() method 
yourColumnVariable = CleanupHeaders(yourColumnVariable); 

Wenn Sie einen Inline-Ersatz der vorhandenen Zeichenfolge ausführen wollen, müssen Sie nur Ihre CleanupHeaders() Methode aktualisieren, um einen ref Parameter zu verwenden, um ein Update auf die aktuelle Referenz auszuführen, war pas sed in:

// Notice the ref keyword 
public static void CleanupHeaders(ref string _Col) 
{ 
    _Col = _Col.Replace(@"\0K", ""); 
    _Col = _Col.Replace(@"\b", ""); 
    _Col = _Col.Replace(@"\0", ""); 
} 

und dann könnte man sie einfach mit nennen:

// This will update the yourColumnVariable to reflect any changes made in the method 
CleanupHeaders(ref yourColumnVariable); 

Sie können see an updated example that uses the ref approach here.

+0

Die Verwendung von 'ref' erhöht die Komplexität und ändert die Signatur und den Aufruf der Methode. Am besten, das in dieser speziellen Situation zu vermeiden. –

+0

Das ist ein guter Punkt. Ich behaupte nicht, dass es der ideale Ansatz ist, ich habe nur angedeutet, dass es eine andere Option ist, die OP * möglicherweise verwenden könnte. Da wir nicht wissen, wie er das anfängt oder wie es versucht, es zu benutzen, dachte ich, es könnte nicht schaden. –

0

Wenn Sie einen Debugger haben, würde ich vor allem vorschlagen, zu sehen, welchen Wert die _Col Zeichenfolge ist, wenn es in Ihre CleanupHeaders() Methode weitergegeben wird.

Abhängig davon, wo der String:

"\ 0 \ 0 K \ 0 \ b \ 0Job"

herkam; Ich könnte mir vorstellen, dass es bereits entkommt, wenn es Ihren Code erreicht.

Die Zeichenfolge würde etwa so aussehen: "\\0\\0K\\0\\b\\0Job", wenn es Ihre Methode erreicht.

würde ich 1 von 2 Dinge vorschlagen:

1: Ersetzen Sie alle Ihre \ in der Zeichenfolge mit - oder einem beliebigen Zeichen Ihrer Wahl:

_Col = _Col.Replace(@"\\", "-"); 

und dann passende Strings ersetzen, die jetzt haben die - prefix:

// Replace all your escaped backslashes 
    _Col = _Col.Replace(@"\\", "-"); 

// Now replace your new prefix + values you are looking to replace 
    _Col = _Col.Replace("-0K", ""); 
    _Col = _Col.Replace("-0", ""); 
    _Col = _Col.Replace("-b", ""); 
    return _Col; 

Oder

2: \0 Wird als Zeichen erkannt, da es ausgeblendet wurde; Es wird also nicht gedruckt/ausgegeben. Versuchen Sie, Ihre .Replace(@"\0", ""); mit .Replace(@"\\0", ""); wie das Ändern so:

public static string CleanupHeaders(string _Col) 
{ 
    _Col = _Col.Replace(@"\\0K", ""); // Replaces the exact already escaped \\ value. 
    _Col = _Col.Replace(@"\\b", ""); 
    _Col = _Col.Replace(@"\\0", ""); 
    return _Col; 
}