2012-04-11 8 views
3

Итак, вот моя проблема, я пытаюсь получить содержимое текстового файла в виде строки, а затем проанализирую его. То, что я хочу, это вкладка, содержащая каждое слово и только слова (без пробелов, без backspace, no \ n ...). Я использую функцию LireFichier, которая отправляет мне строку, содержащую текст из файла (работает отлично, потому что он отображается правильно), но когда я пытаюсь разобрать, он терпит неудачу и начинает делать случайную конкатенацию на моей строке, и я не понимаю почему. Вот содержание текстового файла я использую:Parsing string C#

truc, 
ohoh, 
toto, tata, titi, tutu, 
tete, 

и вот моя последняя строка:

;tete;;titi;;tata;;titi;;tutu; 

, которые должны быть:

truc;ohoh;toto;tata;titi;tutu;tete; 

Вот код, который я (все используются в порядке):

namespace ConsoleApplication1{ 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string chemin = "MYPATH"; 
     string res = LireFichier(chemin); 
     Console.WriteLine("End of reading..."); 
     Console.WriteLine("{0}",res);// The result at this point is good 
     Console.WriteLine("...starting parsing"); 
     res = parseString(res); 
     Console.WriteLine("Chaine finale : {0}", res);//The result here is awfull 
     Console.ReadLine();//pause 
    } 

    public static string LireFichier(string FilePath) //Read the file, send back a string with the text 
    { 
     StreamReader streamReader = new StreamReader(FilePath); 
     string text = streamReader.ReadToEnd(); 
     streamReader.Close(); 
     return text; 
    } 

    public static string parseString(string phrase)//is suppsoed to parse the string 
    { 
     string fin="\n"; 
     char[] delimiterChars = { ' ','\n',',','\0'}; 
     string[] words = phrase.Split(delimiterChars); 

     TabToString(words);//I check the content of my tab 

     for(int i=0;i<words.Length;i++) 
     { 
      if (words[i] != null) 
      { 
       fin += words[i] +";"; 
       Console.WriteLine(fin);//help for debug 
      } 
     } 
     return fin; 
    } 

    public static void TabToString(string[] montab)//display the content of my tab 
    { 
     foreach(string s in montab) 
     { 
      Console.WriteLine(s); 
     } 
    } 
}//Fin de la class Program 
} 
+2

вар NewStr = string.join (";", Regex.Matches (File.ReadAllText (@ "C: \ Temp \ aa.txt"), @ "[\ ж \ д] +") .Cast () . Выберите (m => m.Value)); –

ответ

1

Попробуйте это:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var inString = LireFichier(@"C:\temp\file.txt"); 
      Console.WriteLine(ParseString(inString)); 
      Console.ReadKey(); 
     } 

     public static string LireFichier(string FilePath) //Read the file, send back a string with the text 
     { 
      using (StreamReader streamReader = new StreamReader(FilePath)) 
      { 
       string text = streamReader.ReadToEnd(); 
       streamReader.Close(); 
       return text; 
      } 
     } 

     public static string ParseString(string input) 
     { 
      input = input.Replace(Environment.NewLine,string.Empty); 
      input = input.Replace(" ", string.Empty); 
      string[] chunks = input.Split(','); 
      StringBuilder sb = new StringBuilder(); 
      foreach (string s in chunks) 
      { 
       sb.Append(s); 
       sb.Append(";"); 
      } 
      return sb.ToString(0, sb.ToString().Length - 1); 
     } 
    } 

Или это:

public static string ParseFile(string FilePath) 
{ 
    using (var streamReader = new StreamReader(FilePath)) 
    { 
     return streamReader.ReadToEnd().Replace(Environment.NewLine, string.Empty).Replace(" ", string.Empty).Replace(',', ';'); 
    } 
} 
+0

Это сделало трюки, спасибо большое, я изучаю то, что вы делали в данный момент – WizLiz

+0

@Wiz Если это ответ, который вам помог, отметьте его как принятый, нажав на серое галочку рядом с кнопками голосования. Это даст автору некоторую репутацию. Это также сделает его ответ более заметным по сравнению с другими, очень проголосовавшими, но неполными ответами, так что, скорее всего, другие люди тоже дадут ему репутацию. – Rawling

+0

обновил ответ с некоторыми оптимизациями :) – StaWho

8

Я думаю, что ваш главный вопрос

string[] words = phrase.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries); 
+0

+1 Хенк, избил меня на 20 секунд ;-) – Bridge

+0

На самом деле это почти сделало трюк, он преодолел проблему с помощью double ;; в финальной строке, но все еще есть ошибка, например, какое-то слово отсутствует в файле txt: – WizLiz

+1

@WizardLizard См. ответы на мои или ответы StaWho на проблему с отсутствующими словами. – Rawling

2

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

string[] words = phrase.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries); 

Смотрите документацию here.

1

Ваша главная проблема заключается в том, что вы распределяете на \n, но разрывы строк чтения из файла являются \r\n.

Вывод строки содержит все ваши элементы, но оставшиеся в нем символы \r заставляют более поздние «строки» перезаписывать более ранние «строки» на консоли.

(\r является инструкцией «вернуться к началу строки», без инструкции «перейти к следующей строке» ваши слова из строки 1 будут перезаписаны теми, что указаны в строке 2, затем строка 3 и строка 4.)

Как и расщепление на \r, а также \n, вам нужно проверить строку не нулевой или пустой перед добавлением его к выходу (или, предпочтительно, используют StringSplitOptions.RemoveEmptyEntries, как уже упоминалось).

0
string ParseString(string filename) { 
    return string.Join(";", System.IO.File.ReadAllLines(filename).Where(x => x.Length > 0).Select(x => string.Join(";", x.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(y => y.Trim()))).Select(z => z.Trim())) + ";"; 
}