0

正しい考えかどうかわからないので、テキストファイルの読み取りについて質問があります。特定の文字列から特定の文字に読みたい。

私のテキストは次のようになります。

... 
...
CM_ "Hello, how are you?

Rules: Don't smoke!
      - love others

End";
...
CM_ "Why you?";
...// Many CM_
...

分割後は次のようになります。

1. CM_
2. "Hello, how are you?

    Rules: Don't smoke!
      - love others

    End"
3. CM_
4. "Why you?"
... // many CM_

"CM_"まで読みたい";"

私がこれまでに試した私のコード:

StreamReader fin = new StreamReader("text.txt");
string tmp = "";
tmp = fin.ReadToEnd();

if (tmp.StartsWith("CM_ ") && tmp.EndWith(";"))
{
var result = tmp.Split(new[] { '"' }).SelectMany((s, i) =>
                    {
                        if (i % 2 == 1) return new[] { s };
                        return s.Split(new[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries);
                    }).ToList();
}
foreach (string x in result)
{
   Console.WriteLine(x);
}
4

5 に答える 5

1
    static void PRegex()
    {
        using (StreamReader fin = new StreamReader("text.txt"))
        {
            string tmp = fin.ReadToEnd();

            var matches = Regex.Matches(tmp, "(CM_) ([^;]*);", RegexOptions.Singleline);
            for (int i = 0; i < matches.Count; i++)
                if (matches[i].Groups.Count == 3)
                    Console.WriteLine((2 * i + 1).ToString() + ". " + matches[i].Groups[1].Value + "\r\n" + (2 * (i + 1)).ToString() + ". " + matches[i].Groups[2].Value);
        }

        Console.ReadLine();
    }

    static void PLineByLine()
    {
        using (StreamReader fin = new StreamReader("text.txt"))
        {
            int index = 0;
            string line = null;
            string currentCMBlock = null;
            bool endOfBlock = true;
            while ((line = fin.ReadLine()) != null)
            {
                bool endOfLine = false;
                while (!endOfLine)
                {
                    if (endOfBlock)
                    {
                        int startIndex = line.IndexOf("CM_ ");
                        if (startIndex == -1)
                        {
                            endOfLine = true;
                            continue;
                        }
                        line = line.Substring(startIndex + 4, line.Length - startIndex - 4);
                        endOfBlock = false;
                    }

                    if (!endOfBlock)
                    {
                        int startIndex = line.IndexOf(";");
                        if (startIndex == -1)
                        {
                            currentCMBlock += line + "\r\n";
                            endOfLine = true;
                            continue;
                        }
                        currentCMBlock += line.Substring(0, startIndex);
                        if (!string.IsNullOrEmpty(currentCMBlock))
                            Console.WriteLine((++index) + ". CM_\r\n" + (++index) + ". " + currentCMBlock);
                        currentCMBlock = null;
                        line = line.Substring(startIndex + 1, line.Length - startIndex - 1);
                        endOfBlock = true;
                    }
                }
            }
        }

        Console.ReadLine();
    }
于 2012-10-25T09:04:25.017 に答える
0

ファイル全体を読む:

string FileToRead = File.ReadAllText("Path");

string GetContent(string StartAt, string EndAt, bool LastIndex)
{
string ReturnVal;

if(LastIndex)
{
ReturnVal = FileToRead.Remove(FileToRead.IndexOf(StartAt), FileToRead.IndexOf(EndAt));
Return ReturnVal;
}
else
{ 
ReturnVal = FileToRead.Remove(FileToRead.LastIndex(StartAt), FileToRead.LastIndex(EndAt));
Return ReturnVal;
}
}

-ここで何も悪いことをしなかったといいのですが。(フリーマインドタイピング)

ファイルを読み取ると、最初のインデックスの前にあるすべてのコンテンツが削除されます。そしてその後すべて。見つかった最初の結果を返す場合に設定できます。または最後。

注:StringReaderを使用する方が良いと思います。(私が間違ったことを覚えていない場合...)アプリケーションのメモリ使用量について考える場合。

于 2012-10-25T08:48:08.743 に答える
0

他のものを試しましたが、これが良いかどうかはわかりません。それはまだ最初の行を読んでいます、私がここで間違ったことを知りません

私のコード:

        while ((tmp = fin.ReadLine()) != null)
        {
            if (tmp.StartsWith("CM_ "))
            {

                //string[] tmpList = tmp.Split(new Char[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries);
                var result = tmp.Split(new[] { '"' }).SelectMany((s, i) =>
                {
                    if (i % 2 == 1) return new[] { s };
                    return s.Split(new[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries);
                }).ToList();

                if (tmp.EndsWith(";")) break;

                fin.ReadLine();

                if (tmp.EndsWith(";"))
                {
                    result.ToList();
                    break;
                }
                else
                {
                    result.ToList();
                    fin.ReadLine();
                }

                foreach (string x in result)
                {
                    Console.WriteLine(x);
                }
            } 
于 2012-10-25T09:00:57.533 に答える
0

ファイル全体を tmp に読み込んでいます。したがって、「CM_」の前にテキストがある場合、条件ステートメントは入力されません。

代わりに、すべての行のループで fin.ReadLine を使用して行ごとに読み取ってみてください。

于 2012-10-25T08:42:22.957 に答える
0

正規表現の使用を検討することをお勧めします。これはまさに必要なものであり、Split() よりもはるかに柔軟です。

于 2012-10-25T11:23:47.297 に答える