2011-02-27 4 views
1

Это выдержка из текстового файла, который должен быть обработан. Что нужно сделать, так это программа должна прочитать в этом текстовом файле и отформатировать его до спецификации. Проблема в том, что у меня нет большого опыта работы с текстовыми файлами. Это примерный входной файл.Чтение текстового файла в массив в C#

BSA  Security Definition - Operator Report Type 28 


NBC 3RD QUARTER PROFILE REVIEW 2010 
________________________________________________________________________________   


Operator:     ABAZ095  
Number of entries:  149 
User selection:   Selected Items   

________________________________________________________________________________   


Search Criteria :- 

    Operator Name = BT% 
    Approval Status = Any 
    Enable Status = Any 
    One-time Pwd = Any 
    Profiles  = 
    Units   = 
    Printers  = 
    Terminals  = 

________________________________________________________________________________   

Operator ID   = BTA020   

Name     = ASIA CHAMBEGA 
Active profile  = User_Disabled 
Enable status   = Disabled   
Re-enable date  = 31/12/36 00:00:00   
Approval status  = Approved   
Last changed   = 21/07/10 07:34:30  
Last sign-on   = 13/06/08 14:09:37   
Calculated pwd  = BD    
One-time password  = No    
Assigned unit   = None    



Operator ID   = BTAC002   

Name     = A KALATA (NBC) 
Active profile  = User_Disabled 
Enable status   = Disabled   
Re-enable date  = 31/12/36 00:00:00   
Approval status  = Approved   
Last changed   = 31/05/10 14:04:41  
Last sign-on   = n/a 
Calculated pwd  = B9    
One-time password  = No    
Assigned unit   = None    



Operator ID   = BTAK000   

Name     = AISHA KEJO  
Active profile  = NLCB_R6.0_ACCESSCTRL  
Active profile  = NLCB_R6.0_VERAUT_MBE  
Enable status   = Enabled   
Re-enable date  = n/a 
Approval status  = Approved   
Last changed   = 12/07/08 08:10:47  
Last sign-on   = 19/07/08 08:08:58   
Calculated pwd  = 8A    
One-time password  = No    
Assigned unit   = NLCB    



Operator ID   = BTAL001   

Name     = AMANDUS LIPILI 
Active profile  = User_Disabled 
Enable status   = Disabled   
Re-enable date  = 31/12/36 00:00:00   
Approval status  = Approved   
Last changed   = 01/07/10 08:39:03  
Last sign-on   = 11/11/09 08:25:07   
Calculated pwd  = 4B    
One-time password  = No    
Assigned unit   = None    

При обработке выходной файл должен выглядеть следующим образом:

BTAK000, AISHA KEJO, NLCB_R6.0_ACCESSCTRL 
BTAK000, AISHA KEJO, NLCB_R6.0_VERAUT_MBE 

Как вы можете видеть, все данные должны быть выведены в России, но только Operator ID, имя и активный профиль должен быть выведен , Каждый раз, когда идентификатор оператора находится в файле, результат должен быть напечатан на новой строке. Если у пользователя имеется более 1 активный профиль, идентификатор, имя и профиль оператора должны выводиться на новую строку. Если пользователь имеет отключенный профиль , данные должны быть проигнорированы. Как видно из примера, первые единицы игнорируются, потому что они отключены. Примером может служить пользователь с включенным satatus. Как вы можете видеть в примере вывода.

Моя идея состоит в том, чтобы вытащить данные в массив, но выводить только идентификатор, имя и профиль оператора. Как мне это сделать?

Это то, что я до сих пор:

Console.WriteLine("Enter Input File Location: " + "\n"); 

      //Reads path specifed by the user for input. 
      string t = File.ReadAllText(Console.ReadLine()); 

      //Splits file where there is an equals sign. 
      t = t.Replace("=", ""); 
      //Removes all tabbed spaces. 
      t = t.Replace("\t", ""); 
      //Removes any new lines. 
      t = t.Replace("\n", ","); 
      //Removes blank spaces. 
      t = t.Replace(" ", ""); 
      //Removes the Underscore. 
      t = t.Replace("_", ""); 

      //Removes any leading or trailing whitespaces. 
      t = t.Trim(','); 

      //Writes formatted file to a pre defined ouput file's location. 
      File.WriteAllText(@"C:/3rd Quarter1.txt", t); 
+2

Пожалуйста, пост треску вы уже писали. Люди обычно не любят просто писать свой код для вас. Как бы то ни было, это описание работы, а не вопрос. –

+0

Никто не будет делать вашу работу за вас. Попробуйте и вернитесь ** с конкретными проблемами программирования. Например: «Как читать информацию из текстового файла» или «Как разделить эту текстовую строку на несколько частей, используя двоеточие в качестве разделителя» – jgauffin

+0

Итак, у меня есть код здесь. То, что он делает, в основном разделяет, удаляет равные знаки и форматирует текст так, чтобы он начинался с новой строки, с чем у меня проблема, заключается в том, что я не знаю, как выборочно выбирать, какую информацию выставить. heres waht я до сих пор: см. отредактированный quaeston – Paveetren

ответ

0

С TextReader вы можете прочитать каждую строку, вызывая метод ReadLine из TextReader.

Вы можете сделать это в то время (textreader.EndOfFile!)

Для каждой линии можно производить поиск конкретных символов -> поиск = и сделать что-то с текстом позади него.

Вы также можете проверить, если строка начинается с оператором ID

-1

вы могли бы использовать Regex чтобы найти материал, который вы ищете ..

старта путем загрузки всего файла в поток. затем использовать регулярное выражение как это:

@"Operator ID = (.+?) Name = (.+?) Active profile = (.+?) Enable status " 

найти все сообщения, то вам OFC нужно сделать другую проверку регулярных выражений на массив для извлечения activeProfiles (и увидеть, если есть больше чем 1)

что-то вроде этого:

@"Active profile = (.+?) " 

.. Юридическая информация вам может потребоваться изменить регулярное выражение, чтобы соответствовать, что StreamReader фактически помещает в поток.

Here является хорошим средством для проверки вашего reqex в

EDIT: вот пример того, как программа может выглядеть следующим образом:

static void Main(string[] args) 
    { 
     string path = @"c:\test.txt"; 
     string t = File.ReadAllText(path); 
     string pattern1 = @"OperatorID=(.+?),,Name=(.+?),(.+?),Enablestatus"; 
     Regex rgx = new Regex(pattern1); 

     //Removes all tabbed spaces. 
     t = t.Replace("\t", ""); 
     //Removes any new lines. 
     t = t.Replace("\n", ","); 
     //Removes blank spaces. 
     t = t.Replace(" ", ""); 
     //Removes the Underscore. 
     t = t.Replace("_", ""); 
     t = t.Replace("\r", ""); 

     MatchCollection matches = rgx.Matches(t); 
     List<string[]> test = new List<string[]>(); 
     foreach (var match in matches) 
     { 
      string[] newString = match.ToString().Split(new string[] { @"OperatorID=", @",,Name=", @",Activeprofile=", @",Enablestatus", }, StringSplitOptions.RemoveEmptyEntries); 

      for (int i = 3 ; i <= newString.Length; i++) 
      { 
       test.Add(new string[] { newString[0], newString[1], newString[i - 1] }); 
      } 

     } 

     foreach (var line in test) 
     { 
      Console.WriteLine("ID: {0}\nName: {1}\nActive Profile: {2}\n", line[0], line[1], line[2]); 
     } 

     Console.ReadKey(); 

Не обращал много внимания к деталям в этом Тхо :)

EDIT: для того, чтобы добавить результаты в файл:

 using (StreamWriter myWriter = new StreamWriter(@"c:\testOutput.txt")) 
    { 

     foreach (var line in test) 
     { 
      myWriter.WriteLine("ID: {0}", line[0]); 
      myWriter.WriteLine("Name: {0}", line[1]); 
      myWriter.WriteLine("Active Profile: {0}", line[2]); 
      myWriter.WriteLine(); 


     } 
    } 
+0

Хорошо, это решение работает блестяще ..... у меня есть еще один вопрос. Я хочу написать то, что написано на консоли, в новый текстовый файл. Я использовал следующий код, но он только записывает ID в файл: File.WriteAllLines (@ "C:/3rd Quarter1.txt", test [0]); Что я делаю не так? Я попробовал метод WriteAllText, но это вызывает ошибку buid. – Paveetren

+0

Зачем кому-то давать ответы DownRate, не давая повода для этого. Мой ответ подразумевается как лучшая идея о том, как это сделать. Это общение состоит в том, чтобы учиться вместе и помогать ppl учиться .. так что, пожалуйста, если вы меня понижаете, добавьте причину, чтобы я мог учиться на своих ошибках – Tirdyr

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