web-dev-qa-db-ja.com

C#を使用して文字列にファイル全体を読み上げる方法は?

テキストファイルを文字列変数に読み込む最も簡単な方法は何ですか?

これは、個々のバイトを読み込んでそれを文字列に変換するなど、いくつかの方法で実行できることがわかります。私は最小限のコーディングでメソッドを探していました。

187
Shamim Hafiz

どうですか?

string contents = File.ReadAllText(@"C:\temp\test.txt");
338
marc_s

C#ファイル処理からのFile.ReadAllLinesStreamReader ReadLineのベンチマーク比較

File Read Comparison

結果。 StreamReaderは10,000行を超える大きなファイルの場合ははるかに高速ですが、小さなファイルの場合の違いはごくわずかです。いつものように、さまざまなサイズのファイルを計画し、パフォーマンスが重要でない場合にのみFile.ReadAllLinesを使用してください。


StreamReaderのアプローチ

File.ReadAllTextアプローチが他の人に提案されているので、あなたはまたより速いを試みることができます(私は量的にパフォーマンスへの影響をテストしませんでした、File.ReadAllTextより速いようです(比較 below))パフォーマンスの 違い は、大きなファイルの場合にのみ表示されます。

string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
     readContents = streamReader.ReadToEnd();
}


File.Readxxx()とStreamReader.Readxxx()の比較

表示コードを ILSpy で表示するFile.ReadAllLinesFile.ReadAllTextについて、以下のことがわかりました。

  • File.ReadAllText - 内部でStreamReader.ReadToEndを使用します
  • File.ReadAllLines - 内部的にStreamReader.ReadLineを使用し、読み取り行として戻るためのList<string>を作成してファイルの終わりまでループするという追加のオーバーヘッドもあります。


したがって、どちらのメソッドもStreamReaderの上に構築された追加の便利なレイヤーです。これは、この方法の指示的本体によって明らかである。

File.ReadAllText() ILSpyによって逆コンパイルされた実装

public static string ReadAllText(string path)
{
    if (path == null)
    {
        throw new ArgumentNullException("path");
    }
    if (path.Length == 0)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
    }
    return File.InternalReadAllText(path, Encoding.UTF8);
}   

private static string InternalReadAllText(string path, Encoding encoding)
{
    string result;
    using (StreamReader streamReader = new StreamReader(path, encoding))
    {
        result = streamReader.ReadToEnd();
    }
    return result;
}
159
string contents = System.IO.File.ReadAllText(path)

これが MSDNドキュメントです

16
Neil Barnwell

File.ReadAllText() メソッドを見てください。

いくつかの重要な発言:

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

このメソッドは、バイトオーダーマークの存在に基づいてファイルのエンコードを自動的に検出しようとします。エンコーディング形式UTF-8およびUTF-32(ビッグエンディアンとリトルエンディアンの両方)が検出できます。

認識されない文字が正しく読み取られない可能性があるため、インポートされたテキストを含む可能性があるファイルを読み取るときはReadAllText(String、Encoding)メソッドオーバーロードを使用してください。

たとえ例外が発生したとしても、ファイルハンドルはこのメソッドによって閉じられることが保証されています。

6
sll

string text = File.ReadAllText("Path"); 1つの文字列変数にすべてのテキストがあります。各行が個別に必要な場合はこれを使用できます。

string[] lines = File.ReadAllLines("Path");
4
Dilshod

@クリス申し訳ありません。これは引用ですMSDN Microsoft

方法論

この実験では、2つのクラスを比較します。 StreamReaderクラスとFileStreamクラスは、アプリケーションディレクトリから全体で10Kと200Kの2つのファイルを読み取るように指示されます。

StreamReader (VB.NET)

sr = New StreamReader(strFileName)
Do
  line = sr.ReadLine()
Loop Until line Is Nothing
sr.Close()

FileStream (VB.NET)

Dim fs As FileStream
Dim temp As UTF8Encoding = New UTF8Encoding(True)
Dim b(1024) As Byte
fs = File.OpenRead(strFileName)
Do While fs.Read(b, 0, b.Length) > 0
    temp.GetString(b, 0, b.Length)
Loop
fs.Close()

結果

enter image description here

このテストではFileStreamが明らかに高速です。 StreamReaderが小さなファイルを読み取るのにさらに50%時間がかかります。大きなファイルの場合は、さらに27%の時間がかかりました。

StreamReaderは特に改行を探していますが、FileStreamは探していません。これは余分な時間の一部を説明します。

おすすめ

アプリケーションがデータのセクションを処理するために必要なことによっては、追加の解析時間が必要になる場合があります。ファイルにデータの列があり、行がCR/LFで区切られているシナリオを考えます。 StreamReaderCR/LFを探すためにテキストの行を下っていき、その後アプリケーションはデータの特定の場所を探すために追加の解析を行います。 (あなたは文字列だと思いました。SubStringは値段なしで来ますか?)

一方、FileStreamはチャンクでデータを読み取るため、プロアクティブ開発者はストリームを使用するためのロジックをもう少し書くことができます。必要なデータがファイル内の特定の位置にある場合、これは確かにメモリ使用量を抑えるための道です。

FileStreamはスピードを向上させるメカニズムですが、より多くのロジックが必要になります。

4
MinhVuong

この記事を面白くておもしろいと思う人にとって、ほとんどの場合、ファイル全体を文字列に読み込む最も早い方法は( これらのベンチマークによると )、次のとおりです。

using (StreamReader sr = File.OpenText(fileName))
{
        string s = sr.ReadToEnd();
}
//you then have to process the string

ただし、テキストファイル全体を読むための最も速い方法は、次のようになります。

using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
               //do what you have to here
        }
}

他のいくつかのテクニックに対して我慢できます 、BufferedReaderに対しても含めて、ほとんどの場合勝ちです。

3
Thrawn Wannabe

あなたが使用することができます:

 public static void ReadFileToEnd()
{
    try
    {
    //provide to reader your complete text file
        using (StreamReader sr = new StreamReader("TestFile.txt"))
        {
            String line = sr.ReadToEnd();
            Console.WriteLine(line);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }
}
3
Erwin Draconis

あなたがアプリケーションのBinフォルダからファイルを選びたいなら、あなたは以下を試すことができ、例外処理をすることを忘れないでください。

string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));
3
Deeps
System.IO.StreamReader myFile =
   new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
3
Maxim V. Pavlov

最も可能性の低いC#コードを使用した場合の最も簡単な意味は、おそらく次のとおりです。

string readText = System.IO.File.ReadAllText(path);
3
Davide Piras

こんな感じで使えます

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 "";
        }
    }

これがお役に立てば幸いです。

2
Amit Kumawat
string content = System.IO.File.ReadAllText( @"C:\file.txt" );
2
Paul Mitchell

次のようにテキストファイルからテキストを文字列に読み込むこともできます。

string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
  str = str + sr.ReadLine();
}

2MBのcsvについてReadAllTextとStreamBufferを比較しましたが、違いはかなり小さいようでしたが、ReadAllTextは関数を完了するのに要した時間から優位を占めるようでした。

0
public partial class Testfile : System.Web.UI.Page
{
    public delegate void DelegateWriteToDB(string Inputstring);
    protected void Page_Load(object sender, EventArgs e)
    {
        getcontent(@"C:\Working\Teradata\New folder");
    }

      private void SendDataToDB(string data)
    {
        //InsertIntoData
          //Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=kannan;Data Source=jaya;
        SqlConnection Conn = new SqlConnection("Data Source=aras;Initial Catalog=kannan;Integrated Security=true;");
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = Conn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "insert into test_file values('"+data+"')";
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();
    }

      private void getcontent(string path)
      {
          string[] files;
          files = Directory.GetFiles(path, "*.txt");
          StringBuilder sbData = new StringBuilder();
          StringBuilder sbErrorData = new StringBuilder();
          Testfile df = new Testfile();
          DelegateWriteToDB objDelegate = new DelegateWriteToDB(df.SendDataToDB);
          //dt.Columns.Add("Data",Type.GetType("System.String"));


          foreach (string file in files)
          {
              using (StreamReader sr = new StreamReader(file))
              {
                  String line;
                  int linelength;
                  string space = string.Empty;

                  // Read and display lines from the file until the end of 
                  // the file is reached.
                  while ((line = sr.ReadLine()) != null)
                  {
                      linelength = line.Length;
                      switch (linelength)
                      {
                          case 5:
                              space = "     ";
                              break;

                      }
                      if (linelength == 5)
                      {
                          IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line + space, null, null);
                      }
                      else if (linelength == 10)
                      {
                          IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line , null, null);
                      }

                  }
              }
          }
      }
    }
0
JAY