2016-04-29 207 views
0

我正在讀取XLS文件的內容。某些舊版本的Excel添加了我認爲是單元格內的轉義序列,這會在嘗試創建該名稱的SQL列時導致出現問題。c#替換字符串中的反斜槓

例字符串我有作爲

\ 0 \ 0 K \ 0傳遞\ B \ 0Job

我想返回此字符串 「作業」 工作。在下面的工作的替代序列中沒有做出改變,並將其返回作爲

\ 0 \ 0K \ 0 \ B \ 0Job

C#不允許該字符串被手動創建,而不脫離它與「\\」,它擊敗了我所需要的目的。

有什麼建議嗎?

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

我不明白。你不能這樣做Col.Replace(@「\\ 0K」,「」)? – raven

+0

@Robert它應該是因爲@已經逃脫它,不明白爲什麼它不會工作。 –

+2

@RobertoDeLaParra他不需要雙反斜槓,因爲他的字符串定義之前有@字符。 – ManoDestra

回答

0

有什麼建議嗎?

我有一個,因爲string進來爲"\0\0K\0\b\0Job"您的字符串替換方法_Col.Replace應該不需要用文字語法。在C#\是一個轉義字符,以下字符創建一個escape sequence

問題是語法字符串爲@。刪除它,你會得到「Job」。看到這個工作.NET Fiddle - 它有幾個示範,將很容易地告訴你發生了什麼。看看@MSDN's reference on string literals瞭解更多詳情。

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

在這種情況下應該沒有理由使用它們。

更新

OP改變問題的很少,所以這裏是一個更新.NET Fiddle

+0

也許問題是在他們使用Console.WriteLine(CleanupHeaders(「\ 0 \ 0K \ 0 \ b \ 0Job」))的例子中。輸入字符串應該使用@「」,所以斜槓不會被當作轉義字符。 – Marc

+0

或者作爲你的例子,替換字符串使用斜槓作爲轉義。兩個地方的字符串都需要同樣處理以替換才能工作。 – Marc

+0

@Marc,提問者特別聲明他的字符串是以'\ 0 \ 0K \ 0 \ b \ 0Job「的形式出現的 - 但我更新了我的答案和.NET小提琴以更好地解釋它 - 謝謝 –

0

這有可能是你的報告實際零個字符作爲\0易讀性是的報告字符串的內容的東西。

嘗試從您替換的字符串中刪除@

0

您提供的代碼應完全按照預期工作as seen in this example

這一切都在它怎麼叫

既然你提到了你的初始字符串不被改變,但值得注意的是,您的替代函數實際上返回一個字符串,並且不執行在線更換,所以你需要通過調用它:

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

如果你想執行內聯替換現有的字符串,只需更新您的CleanupHeaders()方法使用ref參數來執行更新對實際參考這是PAS sed的在:

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

,然後你可以使用簡單的稱之爲:

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

你可以see an updated example that uses the ref approach here

+0

使用'ref'增加了複雜性,改變了方法的簽名和調用。在這種特殊情況下最好避免這種情況。 –

+0

這是一個公平點。我並不是說這是理想的方法,我只是表示這是OP *可能使用的另一種選擇。由於我們不知道他/她是如何稱呼這件​​事開始的,或者他們如何嘗試使用它,我認爲它不會受到傷害。 –

0

如果你有一個調試器,我首先會建議看看_Col字符串傳遞到CleanupHeaders()方法的值是多少。

根據其中的字符串:

「\ 0 \ 0 K \ 0 \ B \ 0Job」

是從哪裏來的;我會想象到它到達您的代碼時已經逃脫了。

字符串看起來像這樣:"\\0\\0K\\0\\b\\0Job"當它到達你的方法。

我建議1 2的東西:

1:替換所有與-字符串或您選擇的任何字符\

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

,然後更換您匹配的字符串,現在有在-前綴:

// 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; 

或者

2:\0被識別爲逃脫的角色;所以它沒有被打印/輸出。嘗試更改您的.Replace(@"\0", "");.Replace(@"\\0", "");像這樣:

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; 
}