C # का उपयोग करके स्ट्रिंग को पूरी फाइल कैसे पढ़ें?


214

एक स्ट्रिंग चर में पाठ फ़ाइल को पढ़ने का सबसे तेज़ तरीका क्या है?

मैं समझता हूं कि इसे कई तरीकों से किया जा सकता है, जैसे व्यक्तिगत बाइट्स को पढ़ना और फिर उन लोगों को स्ट्रिंग में बदलना। मैं कम से कम कोडिंग वाली एक विधि की तलाश में था।


जवाबों:


373

कैसे के बारे में File.ReadAllText:

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

3
हालांकि उपयोग करने के लिए सबसे अच्छा कार्य नहीं है। जैसा कि देवेंद्र डी। चव्हाण अपने जवाब में बताते हैं, StreamReader.ReadToEndअधिक कुशल है।
ओवेन ब्लैकर

40
@OwenBlacker यह इस बात पर निर्भर करता है कि "त्वरित" का अर्थ "निष्पादित करने के लिए कम से कम समय" या "समझने का कम से कम समय है।"
bon

2
File.ReadAllText निश्चित रूप से उपयोग करने के लिए सबसे आसान है, लेकिन जैसा कि "देवेंद्र डी। चव्हाण" बताते हैं, यह सबसे तेज़ नहीं है। इसलिए यदि आप छोटी फाइलें पढ़ रहे हैं, तो यह FileReadAllText.it का उपयोग करने के लिए एक बेहतर विकल्प होगा। यह वास्तव में इस बात पर निर्भर करता है कि आप कितनी बड़ी टेक्स्टफाइल्स पढ़ रहे हैं।
मान

करने के लिए सर्वर से पढ़ा जाँच इस आशा किसी को मदद मिलती है।
शाइजुत

1
@OwenBlacker - क्या आपको यकीन है? बेंचमार्क दिखाता है कि StreamReader.ReadToEndकी तुलना में अधिक कुशल है ReadAllLines। जिसकी उम्मीद की जानी चाहिए, क्योंकि उत्तर भी पाठ को लाइनों में विभाजित करता है। लेकिन हम एक अलग तरीके के बारे में बात कर रहे हैं ReadAllText। वास्तव में आपके द्वारा दिए गए उत्तर से पता चलता है कि ReadAllTextबस StreamReader.ReadToEndआंतरिक रूप से कॉल करता है।
एड एविस

169

File.ReadAllLinesबनाम सी # फ़ाइल हैंडलिंगStreamReader ReadLine से एक बेंचमार्क तुलना

फ़ाइल तुलना पढ़ें

परिणाम। 10,000+ लाइनों वाली बड़ी फ़ाइलों के लिए स्ट्रीमराइज़र बहुत तेज़ है, लेकिन छोटी फ़ाइलों के लिए अंतर नगण्य है। हमेशा की तरह, फ़ाइलों के अलग-अलग आकार की योजना बनाएं, और File.ReadAllLines का उपयोग केवल तब करें जब प्रदर्शन महत्वपूर्ण न हो।


StreamReader दृष्टिकोण

जैसा कि 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>रीड लाइन बनाने और फाइल के अंत तक लूपिंग करने के लिए उपयोग करता है।


तो दोनों विधियाँ सुविधा के ऊपर निर्मित एक अतिरिक्त परत हैं 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;
}

2
क्या आपने तुलना की File.ReadAllText, भी ??
marc_s

2
ILSpy सुझाव है कि File.ReadAllText()बस एक आवरण पर है StreamReader.ReadToEnd()। मैं अनुमान लगा रहा हूं कि अतिरिक्त परत की तुलना में थोड़ा धीमा प्रदर्शन करना चाहिए StreamReader.ReadToEnd()
देवेंद्र डी। चव्हाण

बहुत बढ़िया जवाब। शायद उन लोगों के लिए थोड़ा बहुत स्पष्टीकरण जो बस ठीक की तलाश कर रहे हैं, लेकिन यह कम से कम उतने ही वोटों का हकदार है जितना चुना गया उत्तर।
सैंडी जिफोर्ड

@ देवेंद्र डी। चव्हाण: ऑफटॉपिक, लेकिन मैं ILSpy के लिए संदर्भ या प्रलेखन कहां पा सकता हूं?
वायरल जैन

1
आप यहां कोड भी पा सकते हैं: Referenceource.microsoft.com/#mscorlib/system/io/… । मुझे जो नहीं मिलता है, वह यह है कि गति में यह महत्वपूर्ण अंतर क्यों है यदि ReadAllTextसिर्फ एक आवरण है streamReader.ReadToEnd();?
ओलिवियर जैकोट-डेसकॉम्ब्स


6

File.ReadAllText () विधि पर एक नज़र डालें

कुछ महत्वपूर्ण टिप्पणियां:

यह विधि एक फ़ाइल खोलता है, फ़ाइल की प्रत्येक पंक्ति को पढ़ता है, और फिर एक स्ट्रिंग के तत्व के रूप में प्रत्येक पंक्ति को जोड़ता है। यह तब फ़ाइल को बंद कर देता है। एक पंक्ति को वर्ण वापसी ('\ r'), एक पंक्ति फ़ीड ('\ n'), या एक गाड़ी वापसी के बाद वर्ण रेखा के रूप में परिभाषित किया जाता है। परिणामस्वरूप स्ट्रिंग में समाप्ति कैरिज रिटर्न और / या लाइन फीड शामिल नहीं है।

यह विधि बाइट ऑर्डर के निशान की उपस्थिति के आधार पर किसी फ़ाइल की एन्कोडिंग का स्वचालित रूप से पता लगाने का प्रयास करती है। एन्कोडिंग प्रारूप UTF-8 और UTF-32 (दोनों बड़े-एंडियन और छोटे-एंडियन) का पता लगाया जा सकता है।

ReadAllText (String, Encoding) मेथड ओवरलोड का उपयोग तब करें जब आयात की जा सकने वाली पाठ फ़ाइलों को पढ़ सकें, क्योंकि अपरिचित वर्णों को सही ढंग से पढ़ा नहीं जा सकता है।

फ़ाइल हैंडल को इस विधि द्वारा बंद करने की गारंटी है, भले ही अपवाद उठाए गए हों


6

string text = File.ReadAllText("Path");आपके पास एक स्ट्रिंग चर में सभी पाठ हैं। यदि आपको व्यक्तिगत रूप से प्रत्येक पंक्ति की आवश्यकता है तो आप इसका उपयोग कर सकते हैं:

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


4

@ क्रिस क्षमा करें। यह उद्धरण है 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जाहिर है कि इस परीक्षण में तेजी है। StreamReaderछोटी फ़ाइल को पढ़ने के लिए अतिरिक्त 50% अधिक समय लगता है । बड़ी फ़ाइल के लिए, इसने 27% समय लिया।

StreamReaderविशेष रूप से लाइन ब्रेक की तलाश में है जबकि FileStreamऐसा नहीं है। यह कुछ अतिरिक्त समय के लिए जिम्मेदार होगा।

अनुशंसाएँ

डेटा के एक खंड के साथ एप्लिकेशन को क्या करना है, इसके आधार पर, अतिरिक्त पार्सिंग हो सकती है जिसके लिए अतिरिक्त प्रसंस्करण समय की आवश्यकता होगी। एक परिदृश्य पर विचार करें जहां एक फ़ाइल में डेटा के कॉलम हैं और पंक्तियों को CR/LFसीमांकित किया गया है। StreamReaderनीचे की तलाश में पाठ की पंक्ति काम करेगा CR/LF, और फिर आवेदन अतिरिक्त पार्स डेटा की एक विशिष्ट स्थान देख करना होगा। (क्या आपने सोचा था कि स्ट्रिंग। सबस्ट्रिंग एक मूल्य के बिना आता है?)

दूसरी ओर, FileStreamविखंडू में डेटा पढ़ता है और एक प्रोएक्टिव डेवलपर अपने लाभ के लिए स्ट्रीम का उपयोग करने के लिए थोड़ा और तर्क लिख सकता है। यदि आवश्यक डेटा फ़ाइल में विशिष्ट स्थिति में है, तो यह निश्चित रूप से जाने का तरीका है क्योंकि यह मेमोरी के उपयोग को कम रखता है।

FileStream गति के लिए बेहतर तंत्र है, लेकिन अधिक तर्क लेगा।


लेकिन इससे क्या StreamReader.ReadToEnd?
ओवेन ब्लैकर

3

कम से कम संभव सी # कोड के साथ सबसे तेज़ तरीका अर्थ शायद यह एक है:

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

3

यदि आप एप्लिकेशन के बिन फ़ोल्डर से फ़ाइल चुनना चाहते हैं तो आप निम्नलिखित का प्रयास कर सकते हैं और अपवाद हैंडलिंग करना न भूलें।

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

3

आप उपयोग कर सकते हैं :

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


2

इस सामग्री को मज़ेदार और रोचक बताने वाले नोब्स के लिए, ज्यादातर मामलों में एक स्ट्रिंग में एक पूरी फ़ाइल पढ़ने का सबसे तेज़ तरीका ( इन बेंचमार्क के अनुसार ) निम्नलिखित है:

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

कई अन्य तकनीकों के खिलाफ रखो , इसने अधिकांश समय जीत लिया, जिसमें बफ़रड्रेडर के खिलाफ भी शामिल था।


टिप्पणी देर से मुझे पता है, लेकिन यहाँ और बेंचमार्क पर अपने बेंचमार्क पर थोड़ा उलझन में है। यह केवल पढ़ने की गति का परीक्षण करने के लिए प्रतीत होता है और संपूर्ण स्ट्रिंग में लोड नहीं होता है। दूसरा कोड स्निपेट एक समय में एक पंक्ति पढ़ रहा है और कोई भी ऐसा नहीं कर रहा है जिससे "आपको यहाँ क्या करना है" डेटा रखने के लिए एक स्ट्रिंग बिल्डर या स्ट्रिंग की आवश्यकता होगी। किस बिंदु पर अधिक डेटा जोड़ने के लिए उपयोग की जाने वाली मेमोरी परीक्षा परिणामों को बदल देती है। तो आमतौर पर एक ही आकार एक निश्चित चौड़ाई की फ़ाइल होगी, इसलिए मेमोरी को एक लाइन के आकार के लिए सेट किया जाएगा और डेटा को नई मेमोरी में कॉपी करने की आवश्यकता नहीं होगी।
चार्ल्स बर्न

2

आप इस तरह का उपयोग कर सकते हैं

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

आशा है कि यह आपकी मदद करेगा।



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

मैंने एक ReadAllText और StreamBuffer के बीच 2Mb सीएसवी के लिए तुलना की और ऐसा लगा कि यह अंतर काफी छोटा है लेकिन रीडअलैक्ट को लगता है कि ऊपरी कार्यों को पूरा करने में लगने वाले समय से ऊपरी हाथ लगेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.