需要帮助制定正则表达式来解析数据
基本上,需要帮助制定正则表达式来解析数据
我有文本我想吐出一块文本。然而,大多数情况下,我有正则表达式,它或者太少[跳过一个部分]或者太多[阅读下一部分的一部分]。它基本上需要阅读从银行对帐单提取的文本。我已经尝试过更多地阅读正则表达式,但是我仍然不知道该怎么做。
这里有一些样本让你们明白我想要做什么。
_4XXXXXXXXXXXXXX9_
_SOU THE HOME DEPOT 431 POMPANO BEACH * FL
AUT 020112 DDA PURCHASE_
_2/1_DEBIT POS_3.15_
下划线基本上是我想要提取的部分。基本上除DEBIT POS以外的所有东西。
而且我使用的正则表达式是:
\A
(?<SerialNumber>\b[0-9]{13,16}\b)
(?<Description>.) 'PROBLEM HERE'
(?<PostingDate>
(?:1[0-2]|[1-9])/(?:3[01]|[12][0-9]|[1-9]))
(?<Amount>[,0-9]+\.[0-9]{2})
\Z
我不能设置说明从任何字符长度,因为我不知道最大长度的文本部分会。我也不知道它是2行还是1行。这主要是什么使我困惑。
看起来像另一个不使用正则表达式的简单答案。如果每一行都是行,那么对File.ReadAllLines()
来说就不那么难了,并且对每一行都进行解析。
public class Order
{
public string SerialNumber { get; set; }
public string Description { get; set; }
public DateTime PostingDate { get; set; }
public Decimal Amount { get; set; }
public void SetSerialNumberFromRaw(string serialNumber)
{
// Convert to required type, etc.
this.SerialNumber = <someConvertedValue>;
}
public void <OtherNeededValueConverters>
}
List<string> lines = File.ReadAlllines("<filename").ToList();
List<Order> orders = new List<Order>();
Order currentOrder = null;
foreach (string line in lines)
{
if (currentOrder = null)
{
currentOrder = new Order();
orders.Add(currentOrder);
currentOrder.SetSerialNumberFromRaw(line);
}
else
{
if (line.Contains("DEBIT POS", CultureInfo.CurrentCultureIngoreCase))
{
currentOrder.SetPostingDateAndAmount(line);
currentOrder = null;
}
else
{
currentOrder.SetAppendDescription(line);
}
}
}
我想你想的起来一行首先每四行加入:
var file = @"C:\temp.txt";
var lines = System.IO.File.ReadAllLines(file);
var buffer = new List<String>();
for (var i = 0; i < lines.Length; i++)
{
if (i % 4 == 0) { buffer.Add(""); }
buffer[buffer.Count - 1] += lines[i] + " ";
}
buffer.ForEach(b => Console.WriteLine(b));
那么你实际上可以解析缓冲区中的每个条目,仿佛这是一条线。这可以使用正则表达式或只是字符串子串来轻松完成。比跨越线路做起来要容易得多。
上面的代码不是最干净的,但它的工作原理。
我无法首先将所有的线条连接在一起。我还需要确定天气的描述也是一两行。为什么我首先使用正则表达式的主要原因。 也请阅读@Erik的评论 – 2012-04-14 04:14:02
它不一定是每行4行。您可以将上面的代码中的4更改为变量,并在每个开始行上动态决定在解析之前还需要多少。这个建议主要是通过两次传球更容易。一个将相关的行结合在一起,第二个从这些行提取数据。什么是每种记录的识别方面? – yamen 2012-04-14 06:52:10
我使用正则表达式的原因是因为我需要知道第一行是否是一个借记事务,或者它是否是一个支票,什么不是。他们因行长不同而不同[从PDF中提取,必须清除所有垃圾。] 我不能说所有的交易都会有DEBIT POS。 + 4XXXXXXXXXXXXXXX3 +壳牌石油公司57529380602椰子溪* FL + AUT 021012 VISA DDA PUR + 2/10DEBIT CARD PURCHASE35.05 甚至是借记交易之后交换和含有日均余额。 – 2012-04-14 04:08:25
然后就不会很难设置两个对象(或者你需要的那么多),在第一行运行正则表达式来检测类型,然后运行适合该对象的代码,直到读到物体。 – 2012-04-14 06:34:45