2016-10-05 19 views
0

に、ある時点までのファイルそれでは、私はこのテキストファイルとしましょう:読み取り、文字列

(********************************************* 

    Import-Export 
    Version := v24.00 
    Owner  := 
    Exported := Wed Oct 05 09:22:48 2016 

    Note: File encoded in UTF-8. Only edit file in a program 
     which supports UTF-8 (like Notepad, not Wordpad). 

**********************************************) 
IE_VER := 2.15; 

CONTROLLER controllerName (ProcessorType := "1756-L71", 
          Major := 24, 
          TimeSlice := 20, 
          ShareUnusedTimeSlice := 1, 
          RedundancyEnabled := 0, 
          KeepTestEditsOnSwitchOver := 0, 
          DataTablePadPercentage := 50, 
          SecurityCode := 0, 
          ChangesToDetect := 16#ffff_ffff_ffff_ffff, 
          SFCExecutionControl := "CurrentActive", 
          SFCRestartPosition := "MostRecent", 
          SFCLastScan := "DontScan", 
          SerialNumber := 16#0000_0000, 
          MatchProjectToController := No, 
          CanUseRPIFromProducer := No, 
          InhibitAutomaticFirmwareUpdate := 0, 
          PassThroughConfiguration := EnabledWithAppend, 
          DownloadProjectDocumentationAndExtendedProperties := Yes) 
    MODULE Local (Parent := "Local", 
        ParentModPortId := 1, 
        CatalogNumber := "1756-L71", 
        Vendor := 1, 
        ProductType := 14, 
        ProductCode := 92, 
        Major := 24, 
        Minor := 11, 
        PortLabel := "RxBACKPLANE", 
        ChassisSize := 10, 
        Slot := 0, 
        Mode := 2#0000_0000_0000_0001, 
        CompatibleModule := 0, 
        KeyMask := 2#0000_0000_0001_1111) 
    END_MODULE 
... 

をそして「...」テキストファイルの継続をマークします。もし私がちょうど "END_MODULE"を含むすべてのものを読み込みたいのであれば、その文字列にどうすればいいでしょうか?

私の考えは: ファイル全体を文字列に読み込み、改行で解析し、それらの配列要素のうちの1つが "END_MODULE"を含むまでそれらの配列要素を連結するdo whileループを作成しますが、 ?私は文字列を配列に分割し、それを再び単一の文字列に連結するためです。私の考えよりも速い方法がありますか?テキストファイルは超大型でない場合

+1

「END_MODULE」という行が表示されるまで、1行ずつ読むことができます。 – Evk

+0

または単にregex: '。*?END_MODULE'を使用してください。しかし、一行修飾子を使用するようにしてください。 – ThePerplexedOne

+0

@ Evkあなたは私にそれの構文を教えてもらえますか?いくつかのサンプルコード?本当に助けてください! –

答えて

2

あなたはラインによって読み取ら行をしたい場合は、ここではサンプルコードです:

var builder = new StringBuilder(); 
using (var file = File.OpenRead("your file")) { 
    using (var reader = new StreamReader(file)) { 
     string line;      
     while ((line = reader.ReadLine()) != "END_MODULE") { 
      builder.AppendLine(line); 
     } 
    }     
} 
string final = builder.ToString(); 

利点は、あなたがいないということですファイル全体をメモリに読み込み、必要な部分だけを読み込みます(本当に大きなファイルがある場合に役立ちます)。

0

は、あなたは単にEND_MODULEの場所にすべてのテキストとストリングを読むことができる:

var contents = File.ReadAllText("$path_to_file"); 
var sentinel = "END_MODULE"; 
var idx = contents.IndexOf(sentinel); 
if (idx < 0) 
{ 
    // error 
    return; 
} 

contents = contents.Substring(0, idx + sentinel.Length); 
1

私が言ったように、あなたはあなたの目標を達成するために正規表現を使用することができます。

.*?END_MODULEを使用します。

これは、END_MODULEまですべてを取得しますが、それも含みます。この例を参照してください:https://regex101.com/r/AzIR4y/1

あなたがそうのようにこれを実装することができます

var source = ""; //Whatever the really big file contains. 
var chunk = Regex.Match(source, ".*?END_MODULE", RegexOptions.Singleline).Groups[0].Value; 
+0

これは本当にクールな感謝私はこの1つを覚えている –

関連する問題