1

不明なエンコーディング (UTF-8、UTF-16 など) のテキスト ファイルを取得し、行ごとに特定の変更を加えながらコピーできるようにする必要があります。この例では、エンコーディングを変更していますが、この種の処理には他の用途があります。

私が理解できないのは、最後の行に改行があるかどうかを判断する方法です! 一部のプログラムは、次のレコードを持つファイルの違いを気にします。

Rec1<newline>
Rec2<newline>

そして、これらのファイル:

Rec1<newline>
Rec2

適切なアクションを実行できるように、コードの違いをどのように見分けることができますか?

using (StreamReader reader = new StreamReader(sourcePath))
using (StreamWriter writer = new StreamWriter(destinationPath, false, outputEncoding))
{
    bool isFirstLine = true;

    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();

        if (isFirstLine)
        {
            writer.Write(line);
            isFirstLine = false;
        }
        else
        {
            writer.Write("\r\n" + line);
        }
    }


    //if (LastLineHasNewline)
    //{
    //  writer.Write("\n");
    //}

    writer.Flush();
}

コメントアウトされたコードは私ができるようにしたいことですが、条件を設定する方法がわかりません lastInputLineHadNewline! 覚えておいてください、私は入力ファイルのエンコーディングについてアプリオリな知識を持っていません.

4

2 に答える 2

0

よくあることですが、助けを求めに行った瞬間に答えが浮かび上がります。コメントアウトされたコードは次のようになります。

if (LastLineHasNewline(reader))
{
    writer.Write("\n");
}

関数は次のようになります。

private static bool LastLineHasNewline(StreamReader reader)
{
    byte[] newlineBytes = reader.CurrentEncoding.GetBytes("\n");
    int newlineByteCount = newlineBytes.Length;

    reader.BaseStream.Seek(-newlineByteCount, SeekOrigin.End);

    byte[] inputBytes = new byte[newlineByteCount];
    reader.BaseStream.Read(inputBytes, 0, newlineByteCount);
    for (int i = 0; i < newlineByteCount; i++)
    {
        if (newlineBytes[i] != inputBytes[i])
            return false;
    }
    return true;
}
于 2014-01-07T20:14:31.107 に答える