2013-05-18 5 views
1
System.IO.StreamReader file = new System.IO.StreamReader(@"data.txt"); 
List<String> Spec= new List<String>(); 
while (file.EndOfStream != true) 
{ 
    string s = file.ReadLine(); 
    Match m = Regex.Match(s, "Spec\\s"); 
    if (m.Success) 
    { 
     int a = Convert.ToInt16(s.Length); 
     a = a - 5; 
     string part = s.Substring(5, a); 
     Spec.Add(part); 
    } 
} 

Я пытаюсь получить все строки, содержащие слово «Spec», а затем пробел, но я получаю сообщение об ошибке при запуске этой программы.Найти все строки, которые содержат заданную строку

Детали исключения являются:

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll

Может кто-нибудь помочь мне на выяснение того, почему?

Текстовый файл:

ID 560 
Spec This ... bla bla 

blah... 
blah... 
bla bla 
bla 
Category Other 
Price $259.95 


ID 561 
Spec more blah blah... 

blah... 
blah... 
bla bla 
bla 
Category Other 
Price $229.95 
+0

Какая ошибка? 'OutOfMemoryException'? 'InvalidCastException'? Какие? –

+1

Никогда не замечайте, какую ошибку вы пробовали отлаживать? – Sayse

+2

Я рекомендую добавить пример файла и что вы хотите получить от него. Просто примечание, одна из самых смешных строк кода в SO 'int a = Convert.ToInt16 (s.Length);'. –

ответ

2
System.IO.StreamReader file = new System.IO.StreamReader("data.txt"); 
List<string> Spec = new List<string>(); 
while (!file.EndOfStream) 
{ 
    if(file.ReadLine().Contains("Spec")) 
    { 
     Spec.Add(s.Substring(5, s.Length - 5)); 
    } 
} 

Это может сработать.

+0

Да, это работа. Спасибо! Но мне нужно использовать регулярные выражения. – user2395751

+0

@ user2395751 Это задача STUPIDEST, для которой используется регулярное выражение. Вам не нужно регулярное выражение, чтобы найти, есть ли там строка, за которой следует пробел ... –

+0

@ user2395751 Вы можете просто изменить 'if (s.Contains (« Spec »)) {' to 'if (s .Contains («Spec»)) {'если это то, что вы ищете. –

2

Это может помогает:

var result = System.IO.File 
    .ReadAllLines(@"data.txt") 
    .Where(i => i.Contains("Spec")) 
    .ToList(); 
+0

'Spec \\ s' является регулярным выражением, а не точным содержимым строки –

+0

@ Илья Иванов редактировал мое сообщение. –

+0

@HosseinNarimaniRad Нет, у вас нет. –

1

От взгляда на ваш текстовый файл примера вы начинаете подстроку одного символа опоздать. Дополнительный символ есть в виде строки равна нулю индексированные

string part = s.Substring(4, s.Length - 4); 

Мой тестовый код

string s = "Spec This ... bla bla"; 
Console.WriteLine(s.Substring(4,s.Length-4)); 
Console.ReadLine(); 

output:=  This ... bla bla 
1

Я знаю, что эта нить была решена уже, но в качестве альтернативы, если вы хотите использовать регулярное выражение немного настройки требуется в существующем коде:

System.IO.StreamReader file = new System.IO.StreamReader(@"data.txt"); 
List<String> Spec= new List<String>(); 
while (file.EndOfStream != true) 
{ 
    string s = file.ReadLine(); 
    Match m = Regex.Match(s, "(?<=Spec\s)(.)+"); 
    if (m.Success) 
    { 
     Spec.Add(m.ToString()); 
    } 

    s = String.Empty; // do not forget to free the space you occupied. 
} 

Здесь:

(?<=Spec\s) : This part looks for the text "Spec " in line. 
       Also known as positive look behind. 

(.)+  : If first part satisfies take the whole line as a matched string. "." matches 
       every thing except newline. 

Надеюсь, это поможет вам даже после решения этой проблемы.

Смежные вопросы