2013-05-26 2 views
1

следующего входного файлаExtract некоторых конкретный результата из текстового файла в C#

входного файл

a 00002098 0 0.75 unable#1 (usually followed by `to') not having the necessary means or skill or know-how; "unable to get to town without a car"; "unable to obtain funds" 
a 00002312 0.23 0.43 dorsal#2 abaxial#1 facing away from the axis of an organ or organism; "the abaxial surface of a leaf is the underside or side facing away from the stem" 
a 00023655 0 0.5 outside#10 away#3 able#2 (of a baseball pitch) on the far side of home plate from the batter; "the pitch was away (or wide)"; "an outside pitch"  

И я хочу следующий результат для этого файла
OUTPUT

a,00002098,0,0.75,unable#1 
a,00002312,0.23,0.43,dorsal#2 
a,00002312,0.23,0.43,abaxial#1  
a,00023655,0, 0.5,outside#10  
a,00023655,0, 0.5,away#3 
a,00023655,0, 0.5,able#2  

Я пишу следующий код, чтобы извлечь такой результат выше

TextWriter tw = new StreamWriter("D:\\output.txt"); 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (textBox1.Text != null) 
      { 
       StreamReader reader = new StreamReader(@"C:\Users\Zia\Desktop\input.txt"); 
       string line; 
       String lines = ""; 
       while ((line = reader.ReadLine()) != null) 
       { 
        String[] str = line.Split('\t'); 
        String[] words = str[3].Split(' '); 
        for (int k = 0; k < words.Length; k++) 
        { 
         for (int i = 0; i < str.Length; i++) 
         { 
          if (i + 1 != str.Length) 
          { 
           lines = lines + str[i] + ","; 
          } 
          else 
          { 
           lines = lines + words[k] + "\r\n"; 
          } 
         } 
        } 
       } 
       tw.Write(lines); 
       tw.Close(); 
       reader.Close(); 
      } 
     }  

, когда я изменить индекс, этот код дает следующую ошибку и не дает результат желания.
ОШИБКА
Индекс находился за пределами массива.
заранее.

+0

Когда ты отлаживая ваш код, проверял, какие индексы вы используете, и размеры массивов, когда возникает исключение? – Oded

+0

@Oded: я проверяю всю форму индекса 2-5, но даю тот же результат: –

+0

'if (i + 1! = Str.Length)' является подозрительным. Что произойдет, если 'i == str.Length'? – Oded

ответ

2

Почему бы не попробовать этот алгоритм, зацикливание для каждой строки в тексте:

var elements = line.Split('\t'); 
var words = elements[4].Split(' '); 
foreach(var word in words) 
{ 
    Console.WriteLine(string.Concat(elements[0], ",", elements[1], ",", elements[2], ",", elements[3], ",", word)); 
} 

Это, кажется, выход именно то, что вам нужно. Просто измените Console.WriteLine, чтобы записать в файл.

+0

Сэр ур, но после 4 вкладок есть возможность 2 или более, которые будут повторяться ... Сэр и внимательно прочитал мой вопрос и где я упоминаю, что я хочу .. –

+0

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

+0

Это ответ на ваш вопрос? –

1

Я понимаю, что вы хотите каждое слово (в последнем столбце), которые содержат # должны быть в качестве нового результата линии Так оно и должно быть что-то вроде

 List<string> result = new List<string>(); 

     var lines = str.Split('\n'); 
     foreach (var line in lines) 
     { 
      var words = line.Split('\t'); 
      string res = String.Format("{1}{0}{2}{0}{3}{0}{4}", ",", words[0], words[1], words[2], words[3]); 

      var xx = words[4].Split(' ').Where(word => word.Contains("#")); 
      foreach (var s in xx) 
      { 
       result.Add(String.Format(res + "," + s)); 
      } 
     } 
+0

Это ответ на ваш вопрос? – Mzf

0
 private void extrcat() 
     { 
      char[] delimiters = new char[] { '\r', '\n' }; 
      using (StreamReader reader = new StreamReader(@"C:\Users\Zia\Desktop\input.txt")) 
      { 
       string words = reader.ReadToEnd(); 
       string[] lines = words.Split(delimiters); 
       foreach (var item in lines) 
       { 
        foreach (var i in findItems(item)) 
        { 
         if (i != " ") 
          Console.WriteLine(i); 
        } 
       } 

      } 

     } 
     private static List<string> findItems(string item) 
     { 
      List<string> items = new List<string>(); 

      if (item.Length <= 0) 
      { 
       items.Add(" "); 
      } 
      else 
      { 
       List<string> names = new List<string>(); 
       string temp = item.Substring(0, item.IndexOf("#") + 2); 
       temp = temp.Replace("\t", ","); 
       temp = temp.Replace("\\t", ","); 


       items.Add(temp); 
       names = item.Split(' ').Where(x => x.Contains('#')).ToList(); 
       int i = 1; 
       while (i < names.Count) 
       { 
        temp = items[0].Substring(0, items[0].LastIndexOf(',')+1) + names[i]; 
        items.Add(temp); 
        i++; 
       } 
      } 

      return items; 

     } 

enter image description here

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