2010-08-08 3 views
3

http://yfrog.com/bftransactionspРазбор текстового файла с использованием C#

Ищет хороший способ для разбора из этого текстового файла, значения выделены желтыми коробки с использованием C#. Каждый раздел обозначается TERM #, который я забыл выделить. Пробовал это:

string fileName = "ATMTerminalTotals.txt"; 
StreamReader sr = new StreamReader(fileName); 
string[] delimiter = new string[] { " " }; 
while (!sr.EndOfStream) 
{ 
    string[] lines = sr.ReadLine().Split(delimiter, StringSplitOptions.RemoveEmptyEntries); 
    foreach (string line in lines) 
    { 
     Console.WriteLine(line); 
    } 
} 
Console.ReadLine(); 

Безопасно говорить Я правильно читаю строки и удаляю «белые пробелы». Хотя, будучи любителем программирования, не уверен в правильном способе точно «знать», что я получаю значения из этого отчета, который мне нужен. Любой совет?

+3

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

+1

Не обязательно связано с логикой синтаксического анализа, но вы можете обнаружить, что File.ReadAllLines (или File.ReadLines, если файлы массивны, и вы используете .NET 4.0) может помочь избавиться от всего беспорядка StreamReader. – Ani

ответ

1

я уже проверил это с очень простой программы для разбора данного файла, в основном я имею созданный двумя базовыми классами, класс страниц, содержащий коллекцию терминального класса отчетов (строки типа транса) , эти строки могут быть даже представлены как транзакции и класс биллинга

сначала проанализировал данные, установив необходимые параметры и, наконец, просто получив доступ к свойствам

просто бросил его как можно проще, без ошибок и т. Д. ...его просто, чтобы дать вам ощущение того, как идентификатор приступить к решению такого рода задач, надеюсь, что это помогает

Адам

namespace TerminalTest 
{ 
    class Program 
    { 
     public class TerminalReport 
     { 
      public string Word { get; set; } 

      public int Denials { get; set; } 

      public int Approvals { get; set; } 

      public int Reversals { get; set; } 

      public double Amount { get; set; } 

      public int ON_US { get; set; } 

      public int Alphalink { get; set; } 

      public int Interchange { get; set; } 

      public int Surcharged { get; set; } 

      public static TerminalReport FromLine(string line) 
      { 
       TerminalReport report = new TerminalReport(); 
       report.Word = line.Substring(0, 11); 
       line = line.Replace(report.Word, string.Empty).Trim(); 
       string[] split = line.Split(' '); 
       int i = 0; 
       // transaction summary 
       report.Denials = int.Parse(split[i++]); 
       report.Approvals = int.Parse(split[i++]); 
       report.Reversals = int.Parse(split[i++]); 
       report.Amount = double.Parse(split[i++]); 
       // billing counts 
       report.ON_US = int.Parse(split[i++]); 
       report.Alphalink = int.Parse(split[i++]); 
       report.Interchange = int.Parse(split[i++]); 
       report.Surcharged = int.Parse(split[i++]); 

       return report; 
      } 
     } 

     public class TerminalPage 
     { 
      public int PageNumber { get; set; } 

      public double TotalSurcharges { get; set; } 

      public List<TerminalReport> Rows { get; set; } 

      public TerminalPage(int num) 
      { 
       PageNumber = num; 
       Rows = new List<TerminalReport>(); 
      } 

      public int TotalDenials 
      { 
       get 
       { 
        return rows.Sum(r => r.Denials); 
       } 
      } 

      public int TotalApprovals 
      { 
       get 
       { 
        return Rows.Sum(r => r.Approvals; 
       } 
      } 

      public int TotalReversals 
      { 
       get 
       { 
        return Rows.Sum(r => r.Reversals; 
       } 
      } 

      public double TotalAmount 
      { 
       get 
       { 
        return Rows.Sum(r => r.Amount); 
       } 
      } 

      public int TotalON_US 
      { 
       get 
       { 
        return Rows.Sum(r => r.ON_US); 
       } 
      } 

      public int TotalAlphalink 
      { 
       get 
       { 
        return Rows.Sum(r => r.Alphalink); 
       } 
      } 

      public int TotalInterchange 
      { 
       get 
       { 
        return Rows.Sum(r => r.Interchange); 
       } 
      } 

      public int TotalSurcharged 
      { 
       get 
       { 
        return Rows.Sum(r => r.Surcharged); 
       } 
      } 
     } 

     private static string CleanString(string text) 
     { 
      return Regex.Replace(text, @"\s+", " ").Replace(",", string.Empty).Trim(); 
     } 

     private static List&lt;TerminalPage&gt; ParseData(string filename) 
     { 
      using (StreamReader sr = new StreamReader(File.OpenRead(filename))) 
      { 
       List<TerminalPage> pages = new List<TerminalPage>(); 

       int pageNumber = 1; 
       TerminalPage page = null; 
       bool parse = false; 
       while (!sr.EndOfStream) 
       { 
        string line = sr.ReadLine(); 
        line = CleanString(line); 
        if (line.StartsWith("TRAN TYPE")) 
        { 
         // get rid of the ----- line 
         sr.ReadLine(); 

         parse = true; 
         if (page != null) 
         { 
          pages.Add(page); 
         } 
         page = new TerminalPage(pageNumber++); 
        } 
        else if (line.StartsWith("=")) 
        { 
         parse = false; 
        } 
        else if (line.StartsWith("TOTAL SURCHARGES:")) 
        { 
         line = line.Replace("TOTAL SURCHARGES:", string.Empty).Trim(); 
         page.TotalSurcharges = double.Parse(line); 
        } 
        else if (parse) 
        { 
         TerminalReport r = TerminalReport.FromLine(line); 
         page.Rows.Add(r); 
        } 
       } 
       if (page != null) 
       { 
        pages.Add(page); 
       } 

       return pages; 
      } 
     } 

     static void Main(string[] args) 
     { 
      string filename = @"C:\bftransactionsp.txt"; 
      List<TerminalPage> pages = ParseData(filename); 

      foreach (TerminalPage page in pages) 
      { 
       Console.WriteLine("TotalSurcharges: {0}", page.TotalSurcharges); 
       foreach (TerminalReport r in page.Rows) 
         Console.WriteLine(r.Approvals); 

      } 
     } 
    } 
} 
+1

Хороший код :) Я только немного улучшил его, используя функции C# 3.0, чтобы уменьшить размер – abatishchev

+0

он уверен, выглядит лучше, круто :) – Adam

0

Учитывая, что он имеет стандартный стандартный формат, я бы использовал регулярные выражения. Вы можете проверить исходный код, чтобы выяснить, в какой строке вы находитесь, тогда выражение, которое будет анализировать номера и игнорировать пробелы, будет, скорее всего, проще, чем обрабатывать его вручную.

1

Я не уверен, что я бы разделил его по пространствам ... текстовый файл выглядит как его разбитый на столбцы. Вы можете прочитать, как 10 символов (или любой другой ширина столбца), в то время ... и я бы разобрать весь файл в словарь, так что вы получите записи как

dict["WDL FRM CHK"]["# DENIALS"] = 236 

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


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

^WDL FRM CHK\s+(?<denials>[0-9,]+)\s+(?<approvals>[0-9,]+)$ 

использованием

m.Groups["approvals"] 
1

в любом случае я рекомендую вам обернуть StreamReader с using блок:

using (StreamReader sr = new StreamReader(fileName)) 
{ 
    // do stuff 
} 

Подробнее о MSDN

0
using System; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     Regex exp = new Regex(@"WDL FRM CHK(\s)+[1-9,]+(\s)+(?<approvals>[1-9,]+)(\s)+"); 
     string str = "WDL FRM CHK 236 1,854 45,465 123  3"; 
     Match match = exp.Match(str); 

     if (match.Success) 
     { 
     Console.WriteLine("Approvals: " + match.Groups["approvals"].Value); 
     } 

     Console.ReadLine(); 
    } 
    } 
} 

Apdated из следующей статьи, чтобы разобрать один из ваших номеров:

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