IT story

C #을 사용하여 전체 파일을 문자열로 읽는 방법은 무엇입니까?

hot-time 2020. 5. 11. 08:05
반응형

C #을 사용하여 전체 파일을 문자열로 읽는 방법은 무엇입니까?


텍스트 파일을 문자열 변수로 읽는 가장 빠른 방법은 무엇입니까?

개별 바이트를 읽은 다음 문자열로 변환하는 등 여러 가지 방법으로 수행 할 수 있음을 이해합니다. 최소한의 코딩으로 방법을 찾고있었습니다.


어때요?

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

의 벤치 마크 비교 File.ReadAllLinesStreamReader ReadLine에서 C #을 파일 처리

파일 읽기 비교

결과. StreamReader는 10,000 줄 이상인 큰 파일의 경우 훨씬 빠르지 만 작은 파일의 차이는 무시할 수 있습니다. 항상 그렇듯이 다양한 크기의 파일을 계획하고 성능이 중요하지 않은 경우에만 File.ReadAllLines를 사용하십시오.


StreamReader 접근

는 AS File.ReadAllText접근 방식이 다른 사람에 의해 제안되었다, 당신은 또한 시도 할 수 있습니다 빨리 (내가 테스트하지 않았습니다 정량적 성능에 미치는 영향을하지만보다 빠른 것으로 보인다 File.ReadAllText(참조 비교 ) 아래). 차이 성능하지만 단지 큰 파일의 경우에 볼 수 있습니다.

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


File.Readxxx ()와 StreamReader.Readxxx ()의 비교

를 통해 나타내는 코드보기 ILSpy 나는에 대해 다음과 같은 발견을 File.ReadAllLines, File.ReadAllText.

  • File.ReadAllText- StreamReader.ReadToEnd내부적으로 사용
  • File.ReadAllLines-또한 읽기 행으로 리턴하고 파일 끝까지 반복 StreamReader.ReadLine하도록 List<string>to 를 작성하는 추가 오버 헤드로 내부적으로 사용 합니다.


따라서 두 방법 모두 위에 구축 된 편의성추가 계층 입니다 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 (big-endian 및 little-endian)를 감지 할 수 있습니다.

인식 할 수없는 문자를 올바르게 읽을 수 없으므로 가져온 텍스트를 포함 할 수있는 파일을 읽을 때 ReadAllText (String, Encoding) 메서드 오버로드를 사용하십시오.

예외가 발생하더라도이 방법으로 파일 핸들을 닫을 수 있습니다.


string text = File.ReadAllText("Path");하나의 문자열 변수에 모든 텍스트가 있습니다. 각 줄이 개별적으로 필요한 경우 다음을 사용할 수 있습니다.

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

System.IO.StreamReader myFile =
   new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();

@Cris 죄송합니다. 이것은 인용입니다 MSDN Microsoft

방법론

이 실험에서는 두 클래스를 비교합니다. StreamReader와이 FileStream클래스는 응용 프로그램 디렉토리에서 전체가 10K와 200K의 두 파일을 읽을 이동합니다.

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 is obviously faster in this test. It takes an additional 50% more time for StreamReader to read the small file. For the large file, it took an additional 27% of the time.

StreamReader is specifically looking for line breaks while FileStream does not. This will account for some of the extra time.

Recommendations

Depending on what the application needs to do with a section of data, there may be additional parsing that will require additional processing time. Consider a scenario where a file has columns of data and the rows are CR/LF delimited. The StreamReader would work down the line of text looking for the CR/LF, and then the application would do additional parsing looking for a specific location of data. (Did you think String. SubString comes without a price?)

On the other hand, the FileStream reads the data in chunks and a proactive developer could write a little more logic to use the stream to his benefit. If the needed data is in specific positions in the file, this is certainly the way to go as it keeps the memory usage down.

FileStream is the better mechanism for speed but will take more logic.


well the quickest way meaning with the least possible C# code is probably this one:

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

if you want to pick file from Bin folder of the application then you can try following and don't forget to do exception handling.

string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));

you can use :

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

string content = System.IO.File.ReadAllText( @"C:\file.txt" );

For the noobs out there who find this stuff fun and interesting, the fastest way to read an entire file into a string in most cases (according to these benchmarks) is by the following:

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 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 str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
  str = str + sr.ReadLine();
}

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

                  }
              }
          }
      }
    }

2Mb csv에 대해 ReadAllText와 StreamBuffer를 비교 한 결과 차이가 매우 작지만 ReadAllText는 함수를 완료하는 데 걸리는 시간보다 우위에있는 것으로 보입니다.

참고 URL : https://stackoverflow.com/questions/7387085/how-to-read-an-entire-file-to-a-string-using-c

반응형