8

「ファイルを文字列に読み込む方法」という質問をすると、答えは明らかです。ただし、これがCR/​​LFが保持されているキャッチです。

問題は、File.ReadAllTextそれらの文字を取り除くことです。StreamReader.ReadToEndLFをCRに変換しただけで、かなり明白なコードにバグがある長い調査につながりました;-)

つまり、を含むファイルがある場合、、、、またはではなく、foo\n\r\nbar取得したいfoo\n\r\nbar(つまり、まったく同じコンテンツ)。.Netスペースですぐに使用できる方法はありますか?foo barfoobarfoo\n\n\nbar

結果は、ファイル全体を含む常に単一の文字列である必要があります。

4

6 に答える 6

10

それらの方法があなたのキャラクターを剥奪している犯人であると確信していますか?

簡単なテストを書いてみました。StreamReader.ReadToEndすべての改行文字を保持します。

string str = "foo\n\r\nbar";
using (Stream ms = new MemoryStream(Encoding.ASCII.GetBytes(str)))
using (StreamReader sr = new StreamReader(ms, Encoding.UTF8))
{
    string str2 = sr.ReadToEnd();
    Console.WriteLine(string.Join(",", str2.Select(c => ((int)c))));
}

// Output: 102,111,111,10,13,10,98,97,114
//           f   o   o \n \r \n  b  a   r

一時ファイルへの書き込みおよび一時ファイルからの読み取りでも、同じ結果が得られます。

string str = "foo\n\r\nbar";
string temp = Path.GetTempFileName();
File.WriteAllText(temp, str);
string str2 = File.ReadAllText(temp);
Console.WriteLine(string.Join(",", str2.Select(c => ((int)c))));

あなたの改行は他の場所で失われているようです。

于 2012-11-22T22:19:01.747 に答える
6

このコードはLRとCRを保持します

string r = File.ReadAllText(@".\TestData\TR120119.TRX", Encoding.ASCII);
于 2014-04-11T13:28:56.840 に答える
2

結果は、ファイル全体を含む常に単一の文字列である必要があります。

2ホップかかります。1つ目はFile.ReadAllBytes()で、ファイル内のすべてのバイトを取得します。これは何も翻訳しようとはしませんが、ファイル内の生データを取得するため、奇妙な行末はそのまま保持されます。

しかし、それはバイトです、あなたは文字列を求めました。したがって、2番目のホップは、Encoding.GetString()を適用して、バイトを文字列に変換することです。あなたがしなければならないことの一つは、ファイルを書いたプログラムによって使用されるエンコーディングと一致する正しいエンコーディングクラスを選ぶことです。ファイルにシーケンスが含まれているとファイルがかなり混乱し\n\r\n、ファイルについて他に何も文書化していない場合、最善の策はEncoding.Defaultを使用することです。必要に応じて微調整します。

于 2012-11-22T22:14:04.577 に答える
1

を使用してファイルの内容を読み取ることができますFile.ReadAllLines。これにより、行の配列が返されます。次に、を使用String.Joinして、セパレータを使用して行をマージします。

string[] lines = File.ReadAllLines(@"C:\Users\User\file.txt");
string allLines = String.Join("\r\n", lines);

これにより、実際のラインターミネータ文字の精度が失われることに注意してください。たとえば、行が\nまたはで終わる場合\r、結果の文字列allLinesはそれらを\r\n行末記号に置き換えます。

もちろん、真のEOLターミネータを失うことなくこれを実現する方法は他にもありますが、ReadAllLinesそれ自体で多くの種類のテキストエンコーディングを検出でき、コードの行数も非常に少ないという点で便利です。

于 2012-11-22T22:21:04.703 に答える
0

ReadAllTextはキャリッジリターンを返しません。

このメソッドは、ファイルを開き、ファイルの各行を読み取り、各行を文字列の要素として追加します。次に、ファイルを閉じます。行は、文字のシーケンスの後にキャリッジリターン('\ r')、ラインフィード('\ n')、またはキャリッジリターンの直後にラインフィードが続くものとして定義されます。結果の文字列には、終了キャリッジリターンや改行が含まれていません

MSDNから-https ://msdn.microsoft.com/en-us/library/ms143368( v=vs.110 ).aspx

于 2016-10-29T07:36:17.233 に答える
0

これは受け入れられた答えに似ていますが、もっと要点を述べたかったのです。sr.ReadToEnd()必要に応じてバイトを読み取ります。

string myFilePath = @"C:\temp\somefile.txt";
string myEvents = String.Empty;

FileStream fs = new FileStream(myFilePath, FileMode.Open);
StreamReader sr = new StreamReader(fs);
myEvents = sr.ReadToEnd();
sr.Close();
fs.Close();

usingカスケードされたステートメントでそれらを行うこともできます。しかし、そもそもそのファイルへの書き込み方法によって、myEvents文字列からコンテンツを読み取る方法がどのように決まるのか、そして実際に問題がどこにあるのかを説明したいと思います。私は次のようにファイルに書き込みました:

using System.Reflection;
using System.IO;

private static void RecordEvents(string someEvent)
{
    string folderLoc = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    if (!folderLoc.EndsWith(@"\")) folderLoc += @"\";
    folderLoc = folderLoc.Replace(@"\\", @"\"); // replace double-slashes with single slashes
    string myFilePath = folderLoc + "myEventFile.txt";

    if (!File.Exists(myFilePath))
        File.Create(myFilePath).Close(); // must .Close() since will conflict with opening FileStream, below

    FileStream fs = new FileStream(myFilePath, FileMode.Append);
    StreamWriter sr = new StreamWriter(fs);
    sr.Write(someEvent + Environment.NewLine);
    sr.Close();
    fs.Close();
}

次に、上記のコードを使用して、コンテンツの文字列を取得できます。さらに進んで個々の文字列を探していたので、このコードをそのコードの後に​​配置しました。

if (myEvents != String.Empty) // we have something
{
    // (char)2660 is ♠  -- I could have chosen any delimiter I did not
    // expect to find in my text
    myEvents = myEvents.Replace(Environment.NewLine, ((char)2660).ToString());
    string[] eventArray = myEvents.Split((char)2660);
    foreach (string s in eventArray)
    {
        if (!String.IsNullOrEmpty(s))
            // do whatever with the individual strings from your file
    }
}

そして、これはうまくいきました。つまり、文字を置き換えて、その文字を使用してその文字列を実行し、個々のセグメントに分割することができたので、文字を保持する必要があったことを私は知ってmyEventsいます。Environment.NewLine(char)2660.Split()

于 2016-11-23T23:53:24.407 に答える