web-dev-qa-db-ja.com

ファイル内の文字を1つずつ読み取る方法c#

プログラムでテキストファイルをすべての文字を1つずつ読み取り、逆コンマ( ")が見つかると、その逆コンマの前にセミコロンを追加します。たとえば、テキストファイルに次のような段落があります。

これは、たくさんの文字といくつかの名前と日付を含む段落です。私の名前は「サム」です。私は「12:00」「正午」に生まれました。私は「どこにでも」住んでいます。

今、私は出力を次のようにしたいと思います:

これは、たくさんの文字といくつかの名前と日付を含む段落です。私の名前; "サム;"私は; "12:00;"に生まれました;"正午;"。私は; "どこにでも;"に住んでいます。

ファイルストリームを使用してファイルを開き、文字を読み取り、反転したカンマを見つける場所にセミコロンを追加する必要があります。また、出力はtextbox1.textと等しくなければなりません。

私が作ったコード:-

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1 {
    class Program
    {
        static void Main(string[] args)
        {

            char ch;
            int Tchar = 0;
            StreamReader reader;
            reader = new StreamReader(@"C:\Users\user1\Documents\data.txt");
            do
            {
                ch = (char)reader.Read();
                Console.Write(ch);
                if (Convert.ToInt32(ch) == 34)
                {
                    Console.Write(@";");
                }
                Tchar++;
            } while (!reader.EndOfStream);
            reader.Close();
            reader.Dispose();
            Console.WriteLine(" ");
            Console.WriteLine(Tchar.ToString() + " characters");
            Console.ReadLine();
        }
    }
}

出力:-

これは、たくさんの文字といくつかの名前と日付を含む段落です。私の名前 ";サム";私は "; 12:00";に生まれました。 ";正午";。私は「;どこでも」に住んでいます。 。 154文字

逆コンマの前にセミコロンが必要です。どんな助けでもいただければ幸いです。ありがとう

7
Sam

操作の順序を入れ替えます。

    if (Convert.ToInt32(ch) == 34)
    {
        Console.Write(@";");
    }
    Console.Write(ch);

例えばセミコロンを出力するかどうかを決定するまで、元の文字を書き込まないでください。

7
Marc B

ch = (char)reader.Peek();を試してください

これは、それを読まずに次の文字を教えてくれます。次に、これを使用して、それが「挿入」であるかどうかを確認できます。

if (Convert.ToInt32((char)read.Peek()) == 34) Console.Write(@";")
1
SkeetJon

あなたは持っている文字ごとに読みますか?次のコードは、すべてをブロックとして実行し、すべての行を含むリストを返します。

var contents = File.ReadAllLines (@"C:\Users\user1\Documents\data.txt")
                   .Select (l => l.Replace ("\"", ";\""));
1
Andrew