2016-04-29 8 views
0

私はXLSファイルの内容を読んでいます。いくつかの古いバージョンのExcelは、その名前のSQL列を作成しようとすると問題を引き起こす、セル内のエスケープシーケンスと思われるものを追加します。私は "仕事" としてこの文字列を返したい\ 0Jobc#文字列にバックスラッシュを置き換えます。

B \私が仕事をしなければならない

例文字列が

\ 0 \ 0K \ 0として渡されます。次の仕事で置き換えるシーケンスのいずれも変更をしないと\ 0Job

C#はその文字列をエスケープせずに手動で作成することはできません.B \それは

\ 0 \ 0K \ 0として返します。それは私が必要とする目的を破る "\\"である。

提案がありますか?

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

あなたの文字列がメソッド_Col.Replaceを交換"\0\0K\0\b\0Job"としてstringリテラル構文を使用する必要はありませんで来るので、私は、1つを持っています。 C#\はエスケープ文字で、次の文字はescape sequenceです。

問題は@という構文の逐語的な文字列です。それを取り除くと、あなたは "仕事"を得る。この作業を参照してください.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

例として、Replace文字列はスラッシュをエスケープとして使用しています。両方の場所の文字列は、置換が機能するためには同じ扱いをする必要があります。 – Marc

+0

@Marc、Askerは、文字列が '" \ 0 \ 0 \ 0 \ b \ 0Job ""となっていると具体的に述べましたが、私の答えと.NETのフィドルを改善してくれました - ありがとう –

0

それはあなたに、文字列の内容を報告しています事は人間の可読性のため\0として実際のゼロ文字を報告している可能性があります。

ここで置換文字列から@を削除してみます。

0

あなたが提供したコードは、正確に予想どおりに動作するはずですas seen in this example。それは実際ので、文字列を返すと、インラインの交換を行っていないあなたがあなたの最初の文字列が変更されていないことを述べているので、それはあなたが関数を置き換えることは注目に値します

と呼ばれていますどのようにすべてだ

あなたはそれを介してコールする必要があります:あなたはあなたの既存の文字列のインライン交換を実行したいならば、単にだった実際の参照に更新を実行するrefパラメータを使用するようにCleanupHeaders()方法を更新

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

パス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()メソッドに渡されたときの値を確認することをお勧めします。

文字列場所によって:

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

から来ました。私はそれがあなたのコードに到達したときに既にエスケープされていると思います。

文字列は、メソッドに到達すると"\\0\\0K\\0\\b\\0Job"のようになります。

Iは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", "");に変更してみてください。

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; 
} 
関連する問題