2014-02-18 56 views
0

我有一個包含大量文本,其中有像串一串..如何從指定的子閱讀下一子

1 . 1 To Airtel Mobile 
1 03/MAR/2013 16:06:31 9845070641 05:44 1.80 ** 
2 04/MAR/2013 10:00:29 9845096416 00:14 0.30 ** 
3 04/MAR/2013 20:02:35 9845096416 08:12 2.70 ** 
4 06/MAR/2013 21:20:03 9632176702 00:37 0.30 ** 
5 09/MAR/2013 11:40:45 9845444042 01:29 0.60 ** 
6 11/MAR/2013 18:59:08 9900054971 01:14 0.60 ** 
7 12/MAR/2013 13:43:01 9686568009 03:57 1.20 ** 
8 13/MAR/2013 17:38:18 7760995045 00:48 0.30 ** 
9 21/MAR/2013 09:26:20 9845444043 02:47 0.90 ** 
10 21/MAR/2013 11:02:39 9845444043 00:15 0.30 ** 
11 22/MAR/2013 18:00:00 9845096416 00:11 0.30 ** 
Total 25:28 9.30 

現在按我的要求,我要讀這個子後的行「1.1 to Airtel Mobile」到這個子字符串「Total 25:28 9.30」。這裏是我在c#中的代碼,它將檢查字符串中是否存在「1.1 To Airtel Mobile」。現在根據我的要求,如何讀取直到指定子字符串的行,即「總計25:28 9.30」。 這是我在C#代碼..

if(currentText.Contains("1 . 1 To Airtel Mobile")) 
{ 
     using (StringReader reader = new StringReader(currentText)) 
        { 
         // 
        } 
+0

您是否正在閱讀文件文件? –

+0

@SergeyBerezovskiy是的,它是PDF文件,我正在使用itext逐頁閱讀它 – Adi

+0

可能的重複[在.net中拆分新行上的字符串的最簡單方法](http://stackoverflow.com/questions/1547476/easiest除了他想要讀取'1之間的所有行之外的所有行。 – Cheesebaron

回答

1

我想這應該爲你工作

if (currentText.Contains("1 . 1 To Airtel Mobile") && currentText.Contains("Total")) 
{ 
    int startPosition = currentText.IndexOf("1 . 1 To Airtel Mobile"); 
    int endPosition = currentText.IndexOf("Total"); 

    string result = currentText.Substring(startPosition, endPosition-startPosition); 
    // result will contain everything from and up to the Total line 
    } 
+0

謝謝你,先生..一個小查詢我不得不採取「總」行也結果..然後如何做到這一點? – Adi

+0

[IndexOf](http://msdn.microsoft.com/en-us/library/7cct0x33%28v=vs.110%29.aspx)需要一個開始位置,我想你可以用它來查找下一個'newline'在endPosition索引之後。 – Default

0

你可以在這裏使用字符串分割函數用於處理呼叫的詳細信息。

var txt ="1 03/MAR/2013 16:06:31 9845070641 05:44 1.80 **"; 
string [] split = txt.Split(new Char [] {' '}); 

//現在你有任何你想要的數據

split[0] = 1; 
split[1]="03/MAR/2013"; 
split[2]="16:06:31"; 
split[3]="9845070641"; 
split[4]="05:44"; 
split[5]="1.80"; 
split[6]="*"; 

做的。你需要一些更多的邏輯在這裏處理比有呼叫細節

+2

除非他想讀取'1之間的所有行。 1到Airtel Mobile'和'總計25:28 9.30'。 – Prix

+0

@Prix是的我知道這就是爲什麼我提到他需要更多的邏輯來處理這些線。並且已經提供了通話詳細信息解決方案。 –

+0

是的,我想閱讀「1.1到Airtel Mobile」和這個「總計25:28 9.30」之間的所有行,而不是將每條線分成什麼解決方案.. – Adi

0

假設你已經有了所有必要的文字,你可以做類似的其他線路:

var lines = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); 

現在只要跳過lines第一和最後一個項目。

+0

也許'lines = lines.Skip(1 ).Take(lines.Count - 1)'? – scheien

0

您可以使用SkipWhile跳過所有行,直到To Airtel Mobile頭。然後跳過這個標題。然後用TakeWhile採取下一行,直到總線路:

var options = StringSplitOptions.RemoveEmptyEntries; 
var lines = text.Split(new [] { Environment.NewLine }, options) 
       .SkipWhile(s => !s.Contains("1 . 1 To Airtel Mobile")) 
       .Skip(1) 
       .TakeWhile(s => !s.Contains("Total")); 
3

我已經創建了下面的代碼示例項目和測試與給定的輸入,它給了你所需要的結果。

string strStartString = "1 . 1 To Airtel Mobile"; 
     string strEndString = "Total 25:28 9.30"; 

     if (strRawData.StartsWith(strStartString) && strRawData.EndsWith(strEndString)) 
     { 
      int startIndex = strRawData.IndexOf("1 . 1 To Airtel Mobile"); 
      int endIndex = strRawData.IndexOf("Total 25:28 9.30"); 

      int whereReadingStarts = strStartString.Length; 
      int whereReadingStops = endIndex - whereReadingStarts; 

      string strDesiredOutput = strRawData.Substring(whereReadingStarts, whereReadingStops); 
      textBox1.Text = strDesiredOutput; 
     }