C# 用C语言解析文本文件#
正在寻找一种解析此文本文件的好方法,使用C#用黄色框突出显示这些值。每个部分都有一个术语“我忘了突出显示”。我试过这个:C# 用C语言解析文本文件#,c#,regex,text-parsing,C#,Regex,Text Parsing,正在寻找一种解析此文本文件的好方法,使用C#用黄色框突出显示这些值。每个部分都有一个术语“我忘了突出显示”。我试过这个: string fileName = "ATMTerminalTotals.txt"; StreamReader sr = new StreamReader(fileName); string[] delimiter = new string[] { " " }; while (!sr.EndOfStream) { string[] lines = sr.ReadLi
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();
可以肯定地说,我正在正确地阅读行并删除“空白”。不过,作为编程的业余爱好者,我不确定是否有一种有效的方法可以准确地“知道”我正在从这份报告中获得我需要的值。有什么建议吗?考虑到它似乎有一个标准的正则格式,我会使用正则表达式。您可以检查起始代码以确定您所在的行,然后一个解析出数字并忽略空格的表达式很可能比手动处理它更容易。我不确定是否实际按空格分割它。。文本文件看起来像是拆分为列。您可能希望一次读取10个字符(或任何列的宽度)。。。我会将整个文件解析成一个字典,这样你就可以得到如下条目
dict["WDL FRM CHK"]["# DENIALS"] = 236
然后,您可以轻松地从那里检索您想要的值,如果您将来需要更多的值,您已经得到了它们
或者,您可以使用正则表达式。您可以使用正则表达式获取第一个值,如
^WDL FRM CHK\s+(?<denials>[0-9,]+)\s+(?<approvals>[0-9,]+)$
无论如何,我建议您使用
块将StreamReader
包装为:
using (StreamReader sr = new StreamReader(fileName))
{
// do stuff
}
阅读有关使用系统的更多信息;
使用System.Text.RegularExpressions;
命名空间控制台应用程序3
{
班级计划
{
静态void Main(字符串[]参数)
{
正则表达式exp=新正则表达式(@“WDL FRM CHK(+\s)+[1-9,]+(\s)+(?)
我用一个非常简单的程序来解析给定的文件,对此进行了测试,
基本上,我创建了两个基本类,一个页面类包含一组终端报告类(tran类型行)
这些行甚至可以表示为事务和账单类
首先解析数据,设置所需的参数,最后访问属性
只是尽可能简单,没有错误处理等…这只是给你一个我如何开始解决这类任务的感觉,希望能有所帮助
亚当
namespace TerminalTest
{
班级计划
{
公共类终端报告
{
公共字符串字{get;set;}
公共整数拒绝{get;set;}
公共整数批准{get;set;}
公共整数反转{get;set;}
公共双倍金额{get;set;}
_US{get;set;}上的公共int
公共int字母链接{get;set;}
公共整数交换{get;set;}
公共整数溢出{get;set;}
公共静态终端报告FromLine(字符串行)
{
TerminalReport=新的TerminalReport();
report.Word=line.Substring(0,11);
line=line.Replace(report.Word,string.Empty).Trim();
string[]split=line.split(“”);
int i=0;
//交易摘要
report.Denials=int.Parse(split[i++]);
report.Approvals=int.Parse(拆分[i++]);
report.Reversals=int.Parse(拆分[i++]);
report.Amount=double.Parse(拆分[i++]);
//计费计数
report.ON_US=int.Parse(拆分[i++]);
report.Alphalink=int.Parse(split[i++]);
report.Interchange=int.Parse(split[i++]);
report.Surcharged=int.Parse(split[i++]);
返回报告;
}
}
公共类终点站
{
公共整数页码{get;set;}
公共双重总附加费{get;set;}
公共列表行{get;set;}
公共终端页(整数)
{
PageNumber=num;
行=新列表();
}
公开否认
{
得到
{
返回rows.Sum(r=>r.Denials);
}
}
公共机构批准
{
得到
{
返回行。总和(r=>r.批准;
}
}
公共整数反转
{
得到
{
返回Rows.Sum(r=>r.Reversals;
}
}
公共双总额
{
得到
{
返回Rows.Sum(r=>r.Amount);
}
}
美国公共交通
{
得到
{
返回Rows.Sum(r=>r.ON_-US);
}
}
公共int TotalAlphalink
{
得到
{
返回Rows.Sum(r=>r.Alphalink);
}
}
公共综合交换
{
得到
{
返回Rows.Sum(r=>r.Interchange);
}
}
公共设施总附加费
{
得到
{
返回Rows.Sum(r=>r.Surcharged);
}
}
}
私有静态字符串CleanString(字符串文本)
{
返回Regex.Replace(text,@“\s+”,“”)。Replace(“,”,string.Empty)。Trim();
}
私有静态ListTerminalPage解析数据(字符串文件名)
{
使用(StreamReader sr=newstreamreader(File.OpenRead(filename)))
{
列表页=新列表();
int pageNumber=1;
TerminalPage=null;
bool parse=false;
而(!sr.EndOfStream)
{
字符串行=sr.ReadLine();
行=清洁字符串(行);
如果(行)
using (StreamReader sr = new StreamReader(fileName))
{
// do stuff
}
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();
}
}
}
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<TerminalPage> 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);
}
}
}
}