テキストファイルを文字列変数に読み込む最も簡単な方法は何ですか?
これは、個々のバイトを読み込んでそれを文字列に変換するなど、いくつかの方法で実行できることがわかります。私は最小限のコーディングでメソッドを探していました。
どうですか?
string contents = File.ReadAllText(@"C:\temp\test.txt");
C#ファイル処理からのFile.ReadAllLines
とStreamReader ReadLine
のベンチマーク比較
結果。 StreamReaderは10,000行を超える大きなファイルの場合ははるかに高速ですが、小さなファイルの場合の違いはごくわずかです。いつものように、さまざまなサイズのファイルを計画し、パフォーマンスが重要でない場合にのみFile.ReadAllLinesを使用してください。
File.ReadAllText
アプローチが他の人に提案されているので、あなたはまたより速いを試みることができます(私は量的にパフォーマンスへの影響をテストしませんでした、File.ReadAllText
より速いようです(比較 below))パフォーマンスの 違い は、大きなファイルの場合にのみ表示されます。
string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
readContents = streamReader.ReadToEnd();
}
表示コードを ILSpy で表示するFile.ReadAllLines
、File.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;
}
string contents = System.IO.File.ReadAllText(path)
これが MSDNドキュメントです
File.ReadAllText() メソッドを見てください。
いくつかの重要な発言:
このメソッドは、ファイルを開き、ファイルの各行を読み取り、各行を文字列の要素として追加します。その後、ファイルを閉じます。行は、一連の文字とそれに続くキャリッジリターン( '\ r')、ラインフィード( '\ n')、またはキャリッジリターンとそれに続くラインフィードとして定義されます。結果の文字列には、終了キャリッジリターンやラインフィードは含まれません。
このメソッドは、バイトオーダーマークの存在に基づいてファイルのエンコードを自動的に検出しようとします。エンコーディング形式UTF-8およびUTF-32(ビッグエンディアンとリトルエンディアンの両方)が検出できます。
認識されない文字が正しく読み取られない可能性があるため、インポートされたテキストを含む可能性があるファイルを読み取るときはReadAllText(String、Encoding)メソッドオーバーロードを使用してください。
たとえ例外が発生したとしても、ファイルハンドルはこのメソッドによって閉じられることが保証されています。
string text = File.ReadAllText("Path");
1つの文字列変数にすべてのテキストがあります。各行が個別に必要な場合はこれを使用できます。
string[] lines = File.ReadAllLines("Path");
@クリス申し訳ありません。これは引用です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()
結果
このテストではFileStream
が明らかに高速です。 StreamReader
が小さなファイルを読み取るのにさらに50%時間がかかります。大きなファイルの場合は、さらに27%の時間がかかりました。
StreamReader
は特に改行を探していますが、FileStream
は探していません。これは余分な時間の一部を説明します。
おすすめ
アプリケーションがデータのセクションを処理するために必要なことによっては、追加の解析時間が必要になる場合があります。ファイルにデータの列があり、行がCR/LF
で区切られているシナリオを考えます。 StreamReader
はCR/LF
を探すためにテキストの行を下っていき、その後アプリケーションはデータの特定の場所を探すために追加の解析を行います。 (あなたは文字列だと思いました。SubStringは値段なしで来ますか?)
一方、FileStream
はチャンクでデータを読み取るため、プロアクティブ開発者はストリームを使用するためのロジックをもう少し書くことができます。必要なデータがファイル内の特定の位置にある場合、これは確かにメモリ使用量を抑えるための道です。
FileStream
はスピードを向上させるメカニズムですが、より多くのロジックが必要になります。
この記事を面白くておもしろいと思う人にとって、ほとんどの場合、ファイル全体を文字列に読み込む最も早い方法は( これらのベンチマークによると )、次のとおりです。
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に対しても含めて、ほとんどの場合勝ちです。
あなたが使用することができます:
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);
}
}
あなたがアプリケーションのBinフォルダからファイルを選びたいなら、あなたは以下を試すことができ、例外処理をすることを忘れないでください。
string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));
System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
最も可能性の低いC#コードを使用した場合の最も簡単な意味は、おそらく次のとおりです。
string readText = System.IO.File.ReadAllText(path);
こんな感じで使えます
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 "";
}
}
これがお役に立てば幸いです。
string content = System.IO.File.ReadAllText( @"C:\file.txt" );
次のようにテキストファイルからテキストを文字列に読み込むこともできます。
string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
str = str + sr.ReadLine();
}
2MBのcsvについてReadAllTextとStreamBufferを比較しましたが、違いはかなり小さいようでしたが、ReadAllTextは関数を完了するのに要した時間から優位を占めるようでした。
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);
}
}
}
}
}
}