Разбор текстового файла с использованием C # - PullRequest
3 голосов
/ 08 августа 2010

В поисках хорошего способа разбора этого текстового файла, значения выделены желтыми полями с помощью 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();

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

Ответы [ 5 ]

1 голос
/ 09 августа 2010

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

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

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

Адам

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 голос
/ 08 августа 2010

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

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

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


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

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

, используя

m.Groups["approvals"]
1 голос
/ 08 августа 2010

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

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

Подробнее о MSDN

0 голосов
/ 08 августа 2010
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();
    }
  }
}

Приведено в следующей статье для анализа одного из ваших чисел:

0 голосов
/ 08 августа 2010

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

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