需要帮助制定正则表达式来解析数据
本文关键字:数据 正则表达式 帮助 | 更新日期: 2023-09-27 18:30:44
基本上,
我有文本想从文本块中吐出。但是,我大部分都使用了正则表达式,它要么太少[跳过一节],要么太多[阅读下一节的一部分]。它基本上需要阅读我从银行对账单中提取的文本。我已经尝试更多地阅读正则表达式,但是我仍然不知道该怎么做。
这里有一些示例供你们了解我想要做什么。
_4XXXXXXXXXXXXXX9_
_SOU THE HOME DEPOT 431 POMPANO BEACH * FL
AUT 020112 DDA PURCHASE_
_2/1_DEBIT POS_3.15_
下划线基本上是我想提取的部分。基本上除了借记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 行。这主要是让我感到困惑的地方。
我想你想先把每四行连接成一行:
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));
然后,您实际上可以解析缓冲区中的每个条目,就好像它是一行一样。这可以使用正则表达式或字符串子字符串轻松完成。比尝试跨行容易得多。
上面的代码不是最干净的,但它有效。
看起来像另一个简单的答案,不要使用正则表达式。 如果其中每一行都是行,那么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);
}
}
}