2016-03-23 11 views
1

File.WriteAllLines()を使用してファイルに書き込もうとしているリストがあります。リスト内の文字列の1つはrichTextBoxからのもので、新しい行には\nが含まれています。しかしwriteAllLinesは、それが文字列リスト内の別個の項目であるかのように新しい行に書き込むと解釈しているようです。私は自分のコードを検査して、文字列が分割される前にコードのすべての行を最後に書き込むことができることがわかります。私も文字列の'@'サインを使ってみましたが、それもうまくいきませんでした。c#File.WriteAllLines新しい行バックスラッシュ

writeAllLinesはエスケープシーケンスを無視する方法を知っていますか?

+2

'WriteAllLines' *はエスケープシーケンスを無視します。私はあなたのラインに本当に*が含まれていることを確かめていますが、これはデバッガで '\ n'と表示されるかもしれません。 – Heinzi

答えて

1

ファイル内の各エントリを1行にするとします。したがって、問題は、ファイルに書き込んでいる1つ以上の文字列に改行が含まれていることです。この改行は、WriteAllLinesが書き出す改行に加えてファイルに書き込まれます。

唯一の方法は、プログラムでWriteAllLinesの入力データの改行をエスケープすることです。改行を含む可能性のある値ごとにこれを行います。

string escapedValue = originalValue.Replace("\r", "\\r").Replace("\n", "\\n"); 

ファイルを読み込むときは、各行をエスケープする必要があります。

string unescapedValue = escapedValue.Replace("\\r", "\r").Replace("\\n", "\n"); 

注:コードサンプルは完全ではありません。元の文字列にバックスラッシュとそれに続く 'r'または 'n'が含まれている場合、エスケープ論理はそれらを改行に変換します。これを避けるには、おそらく '\'文字をエスケープする必要があります。

+0

ありがとうございました。 ( "\\ n"、 "\ n")。置換( "\\ r"、 "\ r")置換( "〜"、 "\\"); – aljowen

+0

読み込み= content.Replace置換( "\ r"、 "\\ r")); – aljowen

+0

保存= content.Replace( "\\"、 "〜")置換( "\ n"、 "\\ n" – aljowen

1

richTextBoxからテキストで\nないエスケープシーケンスである、それは実際の<LF>文字です。デバッガでは\nのように見えますが、文字列には対応する位置に1文字しか含まれていません。

ファイルに文字列のカンマ区切りリストを記述する必要があることを想像し、文字列のいずれかにコンマが含まれています

"quick,brown", "fox", "jumps" 

quick,brown,fox,jumps 
を次のようにリストが書き出されます

となり、文字列からどのカンマが来たかを知る方法はありません。

ファイルを書き込むときに\nを他の文字に置き換え、読み込み時に置き換えることで問題を回避できます。

// Writing 
File.WriteAllLines(@"c:\lines.txt", lines.Select(s => s.Replace('\n', '~'))); 

// Reading back 
var lines = File.ReadAllLines(@"c:\lines.txt") 
    .Select(s => s.Replace('~', '\n'))) 
    .ToArray(); 

選択した文字は、文字列内の他の場所に存在してはいけません。

0

を考えると、このリスト:

var lines = new List<string>(3) { 
    "Here's a line", 
    "Line \n with a newline character", // \n here is a newline character 
    "Line with a \r character" // \r here is a carriage return character 
}; 

は次のように読み取るためにテキストファイルを取得するには:

Here's a line 
Line \n with a newline character 
Line with a \r character 

あなたはこのような何かをしたいと思う:

var escapedLines = lines.Select(l => l.Replace("\n", "\\n").Replace("\r", "\\r")).ToList(); 
File.WriteAllLines("file.txt", escapedLines);