2

これは私がファイルを読む方法です:

    public static string readFile(string path)
    {
        StringBuilder stringFromFile = new StringBuilder();
        StreamReader SR;
        string S;
        SR = File.OpenText(path);
        S = SR.ReadLine();
        while (S != null)
        {
            stringFromFile.Append(SR.ReadLine());
        }
        SR.Close();
        return stringFromFile.ToString();
    }

問題は長すぎることです (.txt ファイルは約 2.5 MB です)。5分以上かかりました。より良い方法はありますか?

取った解決策

    public static string readFile(string path)
    {

       return File.ReadAllText(path);

    }

1秒もかかりませんでした... :)

4

11 に答える 11

8
S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(SR.ReadLine());
}

ここで注目すべきは、Sがその initial の後に設定されることはないReadLine()ため、S != nullwhile ループに入った場合に条件がトリガーされることはありません。試す:

S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(S = SR.ReadLine());
}

または他のコメントのいずれかを使用します。

改行を削除する必要がある場合は、string.Replace(Environment.NewLine, "") を使用します

于 2008-10-17T13:34:23.140 に答える
6

恐ろしい変数名と using ステートメントの欠如 (例外があればファイルを閉じません) は別として、問題はなく、2.5 MB を読み取るのに 5 分もかからないはずです。

ファイルはどこにありますか? 不安定なネットワーク共有上にありますか?

ところで、実行していることと File.ReadAllText を使用していることの唯一の違いは、改行が失われていることです。これは意図的なものですか?ReadAllText にはどのくらいの時間がかかりますか?

于 2008-10-17T13:25:03.987 に答える
6
return System.IO.File.ReadAllText(path);
于 2008-10-17T13:26:53.017 に答える
3

マーカス・グリープはそれを正しく理解しています。あなたは無限ループを持っているので、それはとても時間がかかります. あなたのコードをコピーして変更を加えたところ、2.4 M のテキスト ファイルが 1 秒もかからずに読み取られました。

しかし、ファイルの最初の行を見逃す可能性があると思います。これを試して。


S = SR.ReadLine();
while (S != null){
    stringFromFile.Append(S);
    S = SR.ReadLine();
}

于 2008-10-17T13:39:12.647 に答える
2

一度に 2.5 Mb 全体のメモリが必要ですか?

そうでない場合は、必要なものを処理しようとします。

于 2008-10-17T13:25:15.750 に答える
1

ところで、次回同様の状況に陥ったときは、メモリの事前割り当てを試してください。これにより、使用する正確なデータ構造に関係なく、ランタイムが大幅に改善されます。ほとんどのコンテナーには (StringBuilder同様に)、メモリーを予約できるコンストラクターがあります。このようにして、読み取りプロセス中に必要な時間のかかる再割り当てが少なくて済みます。

たとえば、ファイルから にデータを読み込みたい場合は、次のように記述できますStringBuilder

var info = new FileInfo(path);
var sb = new StringBuilder((int)info.Length);

(要キャストですのでSystem.IO.FileInfo.Lengthlong

于 2008-10-17T13:44:48.753 に答える
1

ReadAllText は、私にとって非常に優れたソリューションでした。3.000.000 行のテキスト ファイルに次のコードを使用しましたが、すべての行を読み取るのに 4 ~ 5 秒かかりました。

string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split('\n');
于 2012-12-05T11:21:14.520 に答える
1

代わりに System.IO.File.RealAllLines を使用してください。

http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx

または、文字数を見積もり、それを容量として StringBuilder のコンストラクターに渡すと、速度が向上します。

于 2008-10-17T13:26:46.683 に答える
1

これを試してみてください。はるかに高速になるはずです:

var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");
于 2008-10-17T13:27:51.127 に答える
0

ループとStringBuilder冗長かもしれません。ReadToEndを使用してみてください 。

于 2008-10-17T13:27:51.533 に答える
-1

テキストファイルを最速で読み取るには、次のようなものを使用できます

public static string ReadFileAndFetchStringInSingleLine(string file)
    {
        StringBuilder sb;
        try
        {
            sb = new StringBuilder();
            using (FileStream fs = File.Open(file, FileMode.Open))
            {
                using (BufferedStream bs = new BufferedStream(fs))
                {
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        string str;
                        while ((str = sr.ReadLine()) != null)
                        {
                            sb.Append(str);
                        }
                    }
                }
            }
            return sb.ToString();
        }
        catch (Exception ex)
        {
            return "";
        }
    }

これがあなたを助けることを願っています。詳細については、次のリンクにアクセスしてください- テキストファイルを読むための最速の方法

于 2016-06-23T07:48:31.173 に答える